83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package tg
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/gotd/td/tg"
|
|
mcp "github.com/metoro-io/mcp-golang"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type ReadArguments struct {
|
|
Name string `json:"name" jsonschema:"description=Name of the dialog"`
|
|
}
|
|
|
|
type ReadResponse struct {
|
|
Result string `json:"result"`
|
|
}
|
|
|
|
func (c *Client) ReadHistory(args ReadArguments) (*mcp.ToolResponse, error) {
|
|
ctx := context.Background()
|
|
|
|
var affectedMsgs *tg.MessagesAffectedMessages
|
|
client := c.T()
|
|
if err := client.Run(ctx, func(ctx context.Context) error {
|
|
api := client.API()
|
|
|
|
inputPeer, err := getInputPeerFromName(ctx, api, args.Name)
|
|
if err != nil {
|
|
return fmt.Errorf("get inputPeer from name: %w", err)
|
|
}
|
|
|
|
switch p := inputPeer.(type) {
|
|
case *tg.InputPeerUser, *tg.InputPeerChat:
|
|
affectedMsgs, err = api.MessagesReadHistory(ctx, &tg.MessagesReadHistoryRequest{
|
|
Peer: inputPeer,
|
|
})
|
|
|
|
case *tg.InputPeerChannel:
|
|
var ok bool
|
|
ok, err = api.ChannelsReadHistory(ctx, &tg.ChannelsReadHistoryRequest{
|
|
Channel: &tg.InputChannel{
|
|
ChannelID: p.ChannelID,
|
|
AccessHash: p.AccessHash,
|
|
},
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("failed to read channels: %w", err)
|
|
}
|
|
|
|
affectedMsgs = &tg.MessagesAffectedMessages{}
|
|
if ok {
|
|
affectedMsgs = &tg.MessagesAffectedMessages{
|
|
Pts: 1,
|
|
PtsCount: 1,
|
|
}
|
|
}
|
|
default:
|
|
return fmt.Errorf("unexpected input peer type: %T", p)
|
|
}
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("read history: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}); err != nil {
|
|
return nil, fmt.Errorf("run client: %w", err)
|
|
}
|
|
|
|
res := "done"
|
|
if affectedMsgs.PtsCount == 0 {
|
|
res = "unread messages not found"
|
|
}
|
|
|
|
jsonData, err := json.Marshal(ReadResponse{Result: res})
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "failed to marshal response")
|
|
}
|
|
|
|
return mcp.NewToolResponse(mcp.NewTextContent(string(jsonData))), nil
|
|
}
|