Skip to content

Commit 490b5b1

Browse files
committed
feat: GetUserPersonalChatMessages
messages.getPersonalChannelHistory returns the latest messages from a user's linked personal channel, converted to Bot API Messages (newest-first). Mapping confirmed against telegram-bot-api 10.1. Hermetic tests; lint clean.
1 parent d80727d commit 490b5b1

2 files changed

Lines changed: 101 additions & 0 deletions

File tree

get_personal_messages.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package botapi
2+
3+
import (
4+
"context"
5+
"math"
6+
7+
"github.com/gotd/td/tg"
8+
)
9+
10+
// GetUserPersonalChatMessages returns the most recent messages, up to limit,
11+
// from the personal channel a user has linked to their profile. The messages are
12+
// returned newest-first.
13+
func (b *Bot) GetUserPersonalChatMessages(ctx context.Context, userID int64, limit int) ([]*Message, error) {
14+
if limit <= 0 {
15+
return nil, &Error{Code: 400, Description: "Bad Request: limit must be positive"}
16+
}
17+
18+
user, err := b.resolveInputUser(ctx, userID)
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
res, err := b.raw.MessagesGetPersonalChannelHistory(ctx, &tg.MessagesGetPersonalChannelHistoryRequest{
24+
UserID: user,
25+
Limit: limit,
26+
MaxID: math.MaxInt32,
27+
})
28+
if err != nil {
29+
return nil, asAPIError(err)
30+
}
31+
32+
msgs, ok := res.AsModified()
33+
if !ok {
34+
return nil, nil
35+
}
36+
37+
out := make([]*Message, 0, len(msgs.GetMessages()))
38+
39+
for _, m := range msgs.GetMessages() {
40+
msg, ok := m.(*tg.Message)
41+
if !ok {
42+
continue
43+
}
44+
45+
converted, err := b.convertMessage(ctx, msg)
46+
if err != nil {
47+
return nil, err
48+
}
49+
50+
out = append(out, converted)
51+
}
52+
53+
return out, nil
54+
}

get_personal_messages_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package botapi
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/gotd/td/tg"
8+
)
9+
10+
func TestGetUserPersonalChatMessages(t *testing.T) {
11+
inv := newMockInvoker()
12+
inv.reply(tg.MessagesGetPersonalChannelHistoryRequestTypeID, &tg.MessagesMessages{
13+
Messages: []tg.MessageClass{
14+
&tg.Message{ID: 7, Message: "hello", PeerID: &tg.PeerUser{UserID: 99}},
15+
},
16+
Users: []tg.UserClass{&tg.User{ID: 99, AccessHash: 1}},
17+
})
18+
19+
got, err := newMockBot(inv).GetUserPersonalChatMessages(context.Background(), 99, 10)
20+
if err != nil {
21+
t.Fatalf("GetUserPersonalChatMessages: %v", err)
22+
}
23+
24+
if len(got) != 1 || got[0].MessageID != 7 || got[0].Text != "hello" {
25+
t.Fatalf("messages = %#v", got)
26+
}
27+
28+
var req tg.MessagesGetPersonalChannelHistoryRequest
29+
30+
inv.decode(t, tg.MessagesGetPersonalChannelHistoryRequestTypeID, &req)
31+
32+
if req.Limit != 10 {
33+
t.Fatalf("limit = %d", req.Limit)
34+
}
35+
}
36+
37+
func TestGetUserPersonalChatMessagesBadLimit(t *testing.T) {
38+
inv := newMockInvoker()
39+
40+
if _, err := newMockBot(inv).GetUserPersonalChatMessages(context.Background(), 99, 0); err == nil {
41+
t.Fatal("expected error for non-positive limit")
42+
}
43+
44+
if inv.count() != 0 {
45+
t.Fatalf("made %d RPC calls, want 0", inv.count())
46+
}
47+
}

0 commit comments

Comments
 (0)