fix: keep participant changes out of channel pts
(cherry picked from commit 07b2497664bd108dec84f6cfe43715540faf2688)
This commit is contained in:
parent
23a2b2aff7
commit
6fd690a06e
10 changed files with 184 additions and 115 deletions
|
|
@ -1861,9 +1861,9 @@ func (r *Router) onChannelsEditAdmin(ctx context.Context, req *tg.ChannelsEditAd
|
|||
} else {
|
||||
r.removeOnlineChannelMemberships(res.Channel.ID, res.Participant.UserID)
|
||||
}
|
||||
updates := r.channelParticipantUpdates(ctx, userID, userID, res.Channel, res.Previous, res.Participant, res.Event, res.Date)
|
||||
updates := r.channelParticipantUpdates(ctx, userID, userID, res.Channel, res.Previous, res.Participant, res.Date)
|
||||
r.pushChannelUpdates(ctx, userID, res.Channel.ID, res.Recipients, func(viewerUserID int64) *tg.Updates {
|
||||
return r.channelParticipantUpdates(ctx, viewerUserID, userID, res.Channel, res.Previous, res.Participant, res.Event, res.Date)
|
||||
return r.channelParticipantUpdates(ctx, viewerUserID, userID, res.Channel, res.Previous, res.Participant, res.Date)
|
||||
})
|
||||
return updates, nil
|
||||
}
|
||||
|
|
@ -1894,9 +1894,9 @@ func (r *Router) onChannelsEditBanned(ctx context.Context, req *tg.ChannelsEditB
|
|||
if err != nil {
|
||||
return nil, channelAdminErr(err)
|
||||
}
|
||||
updates := r.channelParticipantUpdates(ctx, userID, userID, res.Channel, res.Previous, res.Participant, res.Event, res.Date)
|
||||
updates := r.channelParticipantUpdates(ctx, userID, userID, res.Channel, res.Previous, res.Participant, res.Date)
|
||||
r.pushChannelUpdates(ctx, userID, res.Channel.ID, res.Recipients, func(viewerUserID int64) *tg.Updates {
|
||||
return r.channelParticipantUpdates(ctx, viewerUserID, userID, res.Channel, res.Previous, res.Participant, res.Event, res.Date)
|
||||
return r.channelParticipantUpdates(ctx, viewerUserID, userID, res.Channel, res.Previous, res.Participant, res.Date)
|
||||
})
|
||||
return updates, nil
|
||||
}
|
||||
|
|
@ -2904,7 +2904,7 @@ func (r *Router) channelTitleUpdates(ctx context.Context, viewerUserID int64, re
|
|||
}
|
||||
}
|
||||
|
||||
func (r *Router) channelParticipantUpdates(ctx context.Context, viewerUserID, actorUserID int64, channel domain.Channel, previous, participant domain.ChannelMember, event domain.ChannelUpdateEvent, date int) *tg.Updates {
|
||||
func (r *Router) channelParticipantUpdates(ctx context.Context, viewerUserID, actorUserID int64, channel domain.Channel, previous, participant domain.ChannelMember, date int) *tg.Updates {
|
||||
update := &tg.UpdateChannelParticipant{
|
||||
ChannelID: channel.ID,
|
||||
Date: date,
|
||||
|
|
@ -2920,14 +2920,8 @@ func (r *Router) channelParticipantUpdates(ctx context.Context, viewerUserID, ac
|
|||
if participant.UserID != 0 {
|
||||
update.SetNewParticipant(tgChannelParticipantForUpdate(viewerUserID, participant))
|
||||
}
|
||||
updates := []tg.UpdateClass{update, &tg.UpdateChannel{ChannelID: channel.ID}}
|
||||
if event.Pts > 0 {
|
||||
tooLong := &tg.UpdateChannelTooLong{ChannelID: channel.ID}
|
||||
tooLong.SetPts(event.Pts)
|
||||
updates = append(updates, tooLong)
|
||||
}
|
||||
return &tg.Updates{
|
||||
Updates: updates,
|
||||
Updates: []tg.UpdateClass{update, &tg.UpdateChannel{ChannelID: channel.ID}},
|
||||
Users: r.tgUsersForIDs(ctx, viewerUserID, []int64{participant.UserID, participant.InviterUserID, previous.UserID, previous.InviterUserID, update.ActorID}),
|
||||
Chats: []tg.ChatClass{tgChannelChat(viewerUserID, channel, nil)},
|
||||
Date: int(r.clock.Now().Unix()),
|
||||
|
|
|
|||
|
|
@ -4186,6 +4186,11 @@ func TestChannelAdminPinInviteRPC(t *testing.T) {
|
|||
t.Fatalf("create chat: %v", err)
|
||||
}
|
||||
channel := created.Updates.(*tg.Updates).Chats[0].(*tg.Channel)
|
||||
createdChannel, err := channelStore.GetChannelByID(ctx, channel.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("get created channel: %v", err)
|
||||
}
|
||||
initialChannelPts := createdChannel.Pts
|
||||
|
||||
selfParticipant, err := r.onChannelsGetParticipant(WithUserID(ctx, friend.ID), &tg.ChannelsGetParticipantRequest{
|
||||
Channel: &tg.InputChannel{ChannelID: channel.ID, AccessHash: channel.AccessHash},
|
||||
|
|
@ -4229,29 +4234,25 @@ func TestChannelAdminPinInviteRPC(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Fatalf("edit admin: %v", err)
|
||||
}
|
||||
if updates := adminUpdates.(*tg.Updates); len(updates.Updates) < 3 {
|
||||
t.Fatalf("admin updates empty, want participant update")
|
||||
if updates := adminUpdates.(*tg.Updates); len(updates.Updates) != 2 {
|
||||
t.Fatalf("admin updates = %+v, want participant update and channel refresh", updates.Updates)
|
||||
} else if _, ok := updates.Updates[0].(*tg.UpdateChannelParticipant); !ok {
|
||||
t.Fatalf("admin update[0] = %T, want updateChannelParticipant", updates.Updates[0])
|
||||
} else if tooLong, ok := updates.Updates[2].(*tg.UpdateChannelTooLong); !ok {
|
||||
t.Fatalf("admin update[2] = %T, want updateChannelTooLong", updates.Updates[2])
|
||||
} else if pts, ok := tooLong.GetPts(); !ok || pts == 0 {
|
||||
t.Fatalf("admin updateChannelTooLong pts = %d ok=%v, want set pts", pts, ok)
|
||||
} else if _, ok := updates.Updates[1].(*tg.UpdateChannel); !ok {
|
||||
t.Fatalf("admin update[1] = %T, want updateChannel", updates.Updates[1])
|
||||
}
|
||||
adminDiff, err := r.onUpdatesGetChannelDifference(WithUserID(ctx, friend.ID), &tg.UpdatesGetChannelDifferenceRequest{
|
||||
Channel: &tg.InputChannel{ChannelID: channel.ID, AccessHash: channel.AccessHash},
|
||||
Filter: &tg.ChannelMessagesFilterEmpty{},
|
||||
Pts: 1,
|
||||
Pts: initialChannelPts,
|
||||
Limit: 10,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("channel difference after admin: %v", err)
|
||||
}
|
||||
adminFullDiff, ok := adminDiff.(*tg.UpdatesChannelDifference)
|
||||
if !ok || len(adminFullDiff.OtherUpdates) == 0 {
|
||||
t.Fatalf("admin diff = %T %+v, want participant other update", adminDiff, adminDiff)
|
||||
} else if _, ok := adminFullDiff.OtherUpdates[0].(*tg.UpdateChannelParticipant); !ok {
|
||||
t.Fatalf("admin diff update[0] = %T, want updateChannelParticipant", adminFullDiff.OtherUpdates[0])
|
||||
adminEmptyDiff, ok := adminDiff.(*tg.UpdatesChannelDifferenceEmpty)
|
||||
if !ok || !adminEmptyDiff.Final || adminEmptyDiff.Pts != initialChannelPts {
|
||||
t.Fatalf("admin diff = %T %+v, want empty difference at unchanged pts %d", adminDiff, adminDiff, initialChannelPts)
|
||||
}
|
||||
admins, err := r.onChannelsGetParticipants(WithUserID(ctx, owner.ID), &tg.ChannelsGetParticipantsRequest{
|
||||
Channel: &tg.InputChannel{ChannelID: channel.ID, AccessHash: channel.AccessHash},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue