rpc: fix channel pinned search for Android
(cherry picked from commit 70978db98c3af3fe72100fa6646780c7a5a13daa)
This commit is contained in:
parent
b4e47c894f
commit
3642e37cfe
8 changed files with 97 additions and 16 deletions
|
|
@ -1042,6 +1042,9 @@ func tgChannelMessage(viewerUserID int64, m domain.ChannelMessage) tg.MessageCla
|
|||
Message: m.Body,
|
||||
Entities: tgMessageEntities(m.Entities),
|
||||
}
|
||||
if m.Pinned {
|
||||
msg.SetPinned(true)
|
||||
}
|
||||
if m.EditDate != 0 {
|
||||
msg.SetEditDate(m.EditDate)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -453,6 +453,12 @@ func (r *Router) registerMessages(d *tg.ServerDispatcher) {
|
|||
}
|
||||
return tgChannelHistoryMessages(userID, history), nil
|
||||
}
|
||||
if _, ok := req.Filter.(*tg.InputMessagesFilterPinned); ok {
|
||||
if _, err := r.checkedDomainPeerFromInputPeer(ctx, userID, req.Peer); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &tg.MessagesMessages{}, nil
|
||||
}
|
||||
if r.deps.Messages == nil {
|
||||
return messagesNotModifiedOrEmpty(req.Hash), nil
|
||||
}
|
||||
|
|
@ -5746,16 +5752,17 @@ func (r *Router) channelHistoryFilterFromSearchRequest(userID int64, req *tg.Mes
|
|||
limit = 100
|
||||
}
|
||||
filter := domain.ChannelHistoryFilter{
|
||||
ChannelID: channelID,
|
||||
Query: req.Q,
|
||||
OffsetID: req.OffsetID,
|
||||
AddOffset: domain.ClampMessageHistoryAddOffset(req.AddOffset),
|
||||
Limit: limit,
|
||||
MinDate: req.MinDate,
|
||||
MaxDate: req.MaxDate,
|
||||
MaxID: req.MaxID,
|
||||
MinID: req.MinID,
|
||||
Hash: req.Hash,
|
||||
ChannelID: channelID,
|
||||
Query: req.Q,
|
||||
PinnedOnly: messagesSearchFilterPinned(req.Filter),
|
||||
OffsetID: req.OffsetID,
|
||||
AddOffset: domain.ClampMessageHistoryAddOffset(req.AddOffset),
|
||||
Limit: limit,
|
||||
MinDate: req.MinDate,
|
||||
MaxDate: req.MaxDate,
|
||||
MaxID: req.MaxID,
|
||||
MinID: req.MinID,
|
||||
Hash: req.Hash,
|
||||
}
|
||||
if req.FromID != nil {
|
||||
from, ok := r.domainPeerFromInputPeer(userID, req.FromID)
|
||||
|
|
@ -5767,6 +5774,11 @@ func (r *Router) channelHistoryFilterFromSearchRequest(userID int64, req *tg.Mes
|
|||
return filter, true
|
||||
}
|
||||
|
||||
func messagesSearchFilterPinned(filter tg.MessagesFilterClass) bool {
|
||||
_, ok := filter.(*tg.InputMessagesFilterPinned)
|
||||
return ok
|
||||
}
|
||||
|
||||
func searchFilterNeedsMediaStore(filter tg.MessagesFilterClass) bool {
|
||||
switch filter.(type) {
|
||||
case nil, *tg.InputMessagesFilterEmpty:
|
||||
|
|
|
|||
|
|
@ -2723,6 +2723,7 @@ func TestMessagesSearchChannelPeerReturnsSingleCopyMessages(t *testing.T) {
|
|||
t.Fatalf("create chat: %v", err)
|
||||
}
|
||||
channel := created.Updates.(*tg.Updates).Chats[0].(*tg.Channel)
|
||||
pinnedMsgID := 0
|
||||
for _, item := range []struct {
|
||||
userID int64
|
||||
text string
|
||||
|
|
@ -2732,13 +2733,21 @@ func TestMessagesSearchChannelPeerReturnsSingleCopyMessages(t *testing.T) {
|
|||
{friend.ID, "not this one", 5002},
|
||||
{friend.ID, "needle from friend", 5003},
|
||||
} {
|
||||
if _, err := r.onMessagesSendMessage(WithUserID(ctx, item.userID), &tg.MessagesSendMessageRequest{
|
||||
sent, err := r.onMessagesSendMessage(WithUserID(ctx, item.userID), &tg.MessagesSendMessageRequest{
|
||||
Peer: &tg.InputPeerChannel{ChannelID: channel.ID, AccessHash: channel.AccessHash},
|
||||
Message: item.text,
|
||||
RandomID: item.random,
|
||||
}); err != nil {
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("send %q: %v", item.text, err)
|
||||
}
|
||||
if item.text == "not this one" {
|
||||
channelUpdates := sent.(*tg.Updates)
|
||||
if len(channelUpdates.Updates) == 0 {
|
||||
t.Fatalf("send %q updates = %+v, want updateMessageID", item.text, channelUpdates.Updates)
|
||||
}
|
||||
pinnedMsgID = channelUpdates.Updates[0].(*tg.UpdateMessageID).ID
|
||||
}
|
||||
}
|
||||
|
||||
req := &tg.MessagesSearchRequest{
|
||||
|
|
@ -2804,6 +2813,34 @@ func TestMessagesSearchChannelPeerReturnsSingleCopyMessages(t *testing.T) {
|
|||
if channelMessages.Count != 0 || len(channelMessages.Messages) != 0 {
|
||||
t.Fatalf("shared media count search = count %d messages %d, want empty without media store", channelMessages.Count, len(channelMessages.Messages))
|
||||
}
|
||||
|
||||
if _, err := r.onMessagesUpdatePinnedMessage(WithUserID(ctx, owner.ID), &tg.MessagesUpdatePinnedMessageRequest{
|
||||
Peer: &tg.InputPeerChannel{ChannelID: channel.ID, AccessHash: channel.AccessHash},
|
||||
ID: pinnedMsgID,
|
||||
}); err != nil {
|
||||
t.Fatalf("pin channel message: %v", err)
|
||||
}
|
||||
pinnedReq := &tg.MessagesSearchRequest{
|
||||
Peer: &tg.InputPeerChannel{ChannelID: channel.ID, AccessHash: channel.AccessHash},
|
||||
Filter: &tg.InputMessagesFilterPinned{},
|
||||
Limit: 40,
|
||||
}
|
||||
in.Reset()
|
||||
if err := pinnedReq.Encode(&in); err != nil {
|
||||
t.Fatalf("encode pinned search: %v", err)
|
||||
}
|
||||
enc, err = r.Dispatch(WithUserID(ctx, friend.ID), [8]byte{}, 0, &in)
|
||||
if err != nil {
|
||||
t.Fatalf("dispatch pinned search: %v", err)
|
||||
}
|
||||
pinnedMessages, _, _ := searchMessagesPayload(t, enc)
|
||||
if len(pinnedMessages) != 1 {
|
||||
t.Fatalf("pinned search returned %d messages, want 1", len(pinnedMessages))
|
||||
}
|
||||
pinnedMessage, ok := pinnedMessages[0].(*tg.Message)
|
||||
if !ok || pinnedMessage.ID != pinnedMsgID || !pinnedMessage.GetPinned() {
|
||||
t.Fatalf("pinned search message = %#v, want pinned message id=%d", pinnedMessages[0], pinnedMsgID)
|
||||
}
|
||||
}
|
||||
|
||||
func searchMessagesPayload(t *testing.T, enc bin.Encoder) ([]tg.MessageClass, []tg.ChatClass, []tg.UserClass) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue