This commit is contained in:
John Doe 2025-04-02 01:47:59 +03:00
parent faf5d1f5eb
commit 4757005251
2 changed files with 35 additions and 11 deletions

View file

@ -5,6 +5,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"sort" "sort"
"time"
"github.com/gotd/td/tg" "github.com/gotd/td/tg"
mcp "github.com/metoro-io/mcp-golang" mcp "github.com/metoro-io/mcp-golang"
@ -28,13 +29,19 @@ const (
DefaultDialogsLimit = 100 DefaultDialogsLimit = 100
) )
// DialogsArguments contains parameters for getting dialogs
type DialogsArguments struct { type DialogsArguments struct {
Type DialogType `json:"type,omitempty" jsonschema:"description=Filter dialogs by type (user, chat, channel or empty for all),enum=,enum=user,enum=chat,enum=channel"` Type DialogType `json:"type,omitempty" jsonschema:"description=Filter dialogs by type (user, chat, channel or empty for all),enum=,enum=user,enum=chat,enum=channel"`
Limit int `json:"limit,omitempty" jsonschema:"description=Maximum number of dialogs to return (max: 100),default=100"` Limit int `json:"limit,omitempty" jsonschema:"description=Maximum number of dialogs to return (max: 100),default=100"`
WithLastMessages bool `json:"with_last_messages,omitempty" jsonschema:"description=Include last messages in response"`
}
type MessageInfo struct {
Who string `json:"who"`
When string `json:"when"`
Text string `json:"text"`
IsUnread bool `json:"is_unread,omitempty"`
} }
// DialogInfo represents a simplified dialog structure
type DialogInfo struct { type DialogInfo struct {
ID int64 `json:"id"` ID int64 `json:"id"`
Type string `json:"type"` Type string `json:"type"`
@ -42,6 +49,7 @@ type DialogInfo struct {
UnreadCount int `json:"unread_count"` UnreadCount int `json:"unread_count"`
LastMessageID int `json:"last_message_id"` LastMessageID int `json:"last_message_id"`
IsVerified bool `json:"is_verified,omitempty"` IsVerified bool `json:"is_verified,omitempty"`
LastMessages []MessageInfo `json:"last_messages,omitempty"`
} }
// GetDialogs returns a list of dialogs (chats, channels, groups) // GetDialogs returns a list of dialogs (chats, channels, groups)
@ -93,6 +101,22 @@ func (c *Client) GetDialogs(args DialogsArguments) (*mcp.ToolResponse, error) {
info.UnreadCount = dialogItem.UnreadCount info.UnreadCount = dialogItem.UnreadCount
info.LastMessageID = dialogItem.TopMessage info.LastMessageID = dialogItem.TopMessage
if args.WithLastMessages {
for _, msg := range dialogs.Messages {
message, ok := msg.(*tg.Message)
if !ok {
continue
}
info.LastMessages = append(info.LastMessages, MessageInfo{
Who: message.FromID.String(),
When: time.Unix(int64(message.Date), 0).Format(time.DateTime),
Text: message.Message,
IsUnread: !message.Out,
})
}
}
switch peer := dialogItem.Peer.(type) { switch peer := dialogItem.Peer.(type) {
case *tg.PeerUser: case *tg.PeerUser:
if args.Type != DialogTypeAll && args.Type != DialogTypeUser { if args.Type != DialogTypeAll && args.Type != DialogTypeUser {

View file

@ -41,7 +41,7 @@ func serve(ctx context.Context, cmd *cli.Command) error {
log.Info().RawJSON("answer", data).Msg("Check GetMe: OK") log.Info().RawJSON("answer", data).Msg("Check GetMe: OK")
answer, err = client.GetDialogs(tg.DialogsArguments{}) answer, err = client.GetDialogs(tg.DialogsArguments{WithLastMessages: true})
if err != nil { if err != nil {
return fmt.Errorf("get dialogs: %w", err) return fmt.Errorf("get dialogs: %w", err)
} }