Skip to content

Commit 911e761

Browse files
committed
feat: add chat support, fix issue #1
1 parent 8f9efe0 commit 911e761

File tree

6 files changed

+57
-19
lines changed

6 files changed

+57
-19
lines changed

internal/tg/dialogs.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,6 @@ func (d *dialogs) processDialog(dialogItem *tg.Dialog) (DialogInfo, error) {
257257
Text: text,
258258
IsUnread: dialogItem.UnreadCount > 0,
259259
}
260-
261260
}
262261

263262
if dialogItem.Peer == nil {

internal/tg/draft.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/json"
66
"fmt"
77

8-
"github.com/gotd/td/telegram/message"
98
"github.com/gotd/td/tg"
109
mcp "github.com/metoro-io/mcp-golang"
1110
"github.com/pkg/errors"
@@ -26,10 +25,9 @@ func (c *Client) SendDraft(args DraftArguments) (*mcp.ToolResponse, error) {
2625
if err := client.Run(context.Background(), func(ctx context.Context) (err error) {
2726
api := client.API()
2827

29-
sender := message.NewSender(api)
30-
inputPeer, err := sender.Resolve(args.Name).AsInputPeer(ctx)
28+
inputPeer, err := getInputPeerFromName(ctx, api, args.Name)
3129
if err != nil {
32-
return fmt.Errorf("failed to resolve name: %w", err)
30+
return fmt.Errorf("get inputPeer from name: %w", err)
3331
}
3432

3533
ok, err = api.MessagesSaveDraft(ctx, &tg.MessagesSaveDraftRequest{

internal/tg/helpers.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@ func getUsername(source any) string {
3232
case *tg.User:
3333
username = u.Username
3434
case *tg.Chat:
35-
username = fmt.Sprintf("chat(%d)", u.ID)
35+
username = fmt.Sprintf("cht[%d]", u.ID)
3636
case *tg.Channel:
3737
username = u.Username
38+
if username == "" {
39+
username = fmt.Sprintf("chn[%d:%d]", u.ID, u.AccessHash)
40+
}
3841
}
3942

4043
return username

internal/tg/history.go

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7+
"strings"
78
"time"
89

910
"github.com/gotd/td/telegram/message"
@@ -28,10 +29,9 @@ func (c *Client) GetHistory(args HistoryArguments) (*mcp.ToolResponse, error) {
2829
if err := client.Run(context.Background(), func(ctx context.Context) (err error) {
2930
api := client.API()
3031

31-
sender := message.NewSender(api)
32-
inputPeer, err := sender.Resolve(args.Name).AsInputPeer(ctx)
32+
inputPeer, err := getInputPeerFromName(ctx, api, args.Name)
3333
if err != nil {
34-
return fmt.Errorf("failed to resolve name: %w", err)
34+
return fmt.Errorf("get inputPeer from name: %w", err)
3535
}
3636

3737
messagesClass, err = api.MessagesGetHistory(ctx, &tg.MessagesGetHistoryRequest{
@@ -69,6 +69,37 @@ func (c *Client) GetHistory(args HistoryArguments) (*mcp.ToolResponse, error) {
6969
return mcp.NewToolResponse(mcp.NewTextContent(string(jsonData))), nil
7070
}
7171

72+
func getInputPeerFromName(ctx context.Context, api *tg.Client, name string) (tg.InputPeerClass, error) {
73+
isCustom := strings.Contains(name, "[") && strings.Contains(name, "]")
74+
75+
switch {
76+
case strings.HasPrefix(name, "chn") && isCustom:
77+
var channelPeer tg.InputPeerChannel
78+
_, err := fmt.Sscanf(name, "chn[%d:%d]", &channelPeer.ChannelID, &channelPeer.AccessHash)
79+
if err != nil {
80+
return nil, errors.Wrapf(err, "scan channel peer(%q)", name)
81+
}
82+
83+
return &channelPeer, nil
84+
case strings.HasPrefix(name, "cht") && isCustom:
85+
var chatPeer tg.InputPeerChat
86+
_, err := fmt.Sscanf(name, "cht[%d]", &chatPeer.ChatID)
87+
if err != nil {
88+
return nil, errors.Wrapf(err, "scan chat peer(%q)", name)
89+
}
90+
91+
return &chatPeer, nil
92+
default:
93+
sender := message.NewSender(api)
94+
inputPeer, err := sender.Resolve(name).AsInputPeer(ctx)
95+
if err != nil {
96+
return nil, fmt.Errorf("failed to resolve name: %w", err)
97+
}
98+
99+
return inputPeer, nil
100+
}
101+
}
102+
72103
type history struct {
73104
tg.MessagesMessages
74105
users map[int64]*tg.User

internal/tg/read.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/json"
66
"fmt"
77

8-
"github.com/gotd/td/telegram/message"
98
"github.com/gotd/td/tg"
109
mcp "github.com/metoro-io/mcp-golang"
1110
"github.com/pkg/errors"
@@ -27,14 +26,13 @@ func (c *Client) ReadHistory(args ReadArguments) (*mcp.ToolResponse, error) {
2726
if err := client.Run(ctx, func(ctx context.Context) error {
2827
api := client.API()
2928

30-
sender := message.NewSender(api)
31-
inputPeer, err := sender.Resolve(args.Name).AsInputPeer(ctx)
29+
inputPeer, err := getInputPeerFromName(ctx, api, args.Name)
3230
if err != nil {
33-
return fmt.Errorf("failed to resolve name: %w", err)
31+
return fmt.Errorf("get inputPeer from name: %w", err)
3432
}
3533

3634
switch p := inputPeer.(type) {
37-
case *tg.InputPeerUser:
35+
case *tg.InputPeerUser, *tg.InputPeerChat:
3836
affectedMsgs, err = api.MessagesReadHistory(ctx, &tg.MessagesReadHistoryRequest{
3937
Peer: inputPeer,
4038
})
@@ -58,7 +56,6 @@ func (c *Client) ReadHistory(args ReadArguments) (*mcp.ToolResponse, error) {
5856
PtsCount: 1,
5957
}
6058
}
61-
6259
default:
6360
return fmt.Errorf("unexpected input peer type: %T", p)
6461
}

serve.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,17 @@ func serve(ctx context.Context, cmd *cli.Command) error {
5050

5151
answer, err = client.GetHistory(tg.HistoryArguments{Name: os.Getenv("TG_TEST_USERNAME")})
5252
if err != nil {
53-
return fmt.Errorf("get histore: %w", err)
53+
return fmt.Errorf("get nickname history: %w", err)
54+
}
55+
56+
answer, err = client.GetHistory(tg.HistoryArguments{Name: "cht[4626931529]"})
57+
if err != nil {
58+
return fmt.Errorf("get chat history: %w", err)
59+
}
60+
61+
answer, err = client.GetHistory(tg.HistoryArguments{Name: "chn[2225853048:8934705438195741763]"})
62+
if err != nil {
63+
return fmt.Errorf("get chan history: %w", err)
5464
}
5565

5666
log.Info().RawJSON("answer", []byte(answer.Content[0].TextContent.Text)).Msg("Check GetHistory: OK")
@@ -82,17 +92,17 @@ func serve(ctx context.Context, cmd *cli.Command) error {
8292
return fmt.Errorf("register dialogs tool: %w", err)
8393
}
8494

85-
err = server.RegisterTool("tg_dialog", "Get messages of telegram dialog (channel, user)", client.GetHistory)
95+
err = server.RegisterTool("tg_dialog", "Get messages of telegram dialog", client.GetHistory)
8696
if err != nil {
8797
return fmt.Errorf("register dialogs tool: %w", err)
8898
}
8999

90-
err = server.RegisterTool("tg_send", "Send draft message to dialog (channel, user)", client.SendDraft)
100+
err = server.RegisterTool("tg_send", "Send draft message to dialog", client.SendDraft)
91101
if err != nil {
92102
return fmt.Errorf("register dialogs tool: %w", err)
93103
}
94104

95-
err = server.RegisterTool("tg_read", "Mark dialog messages as read (channel, user)", client.ReadHistory)
105+
err = server.RegisterTool("tg_read", "Mark dialog messages as read", client.ReadHistory)
96106
if err != nil {
97107
return fmt.Errorf("register read tool: %w", err)
98108
}

0 commit comments

Comments
 (0)