Initial commit: FunStat MCP Server Go implementation

- Telegram integration for customer statistics
- MCP server implementation with rate limiting
- Cache system for performance optimization
- Multi-language support
- RESTful API endpoints

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
你的用户名
2025-11-04 15:28:06 +08:00
commit 8d1ce4598d
18 changed files with 1940 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
package telegram
import (
"fmt"
"github.com/gotd/td/tg"
)
func extractMessages(resp tg.MessagesMessagesClass) ([]*tg.Message, error) {
switch v := resp.(type) {
case *tg.MessagesMessages:
return filterMessages(v.Messages), nil
case *tg.MessagesMessagesSlice:
return filterMessages(v.Messages), nil
case *tg.MessagesChannelMessages:
return filterMessages(v.Messages), nil
case *tg.MessagesMessagesNotModified:
return nil, fmt.Errorf("messages not modified")
default:
return nil, fmt.Errorf("unsupported response type %T", resp)
}
}
func filterMessages(values []tg.MessageClass) []*tg.Message {
result := make([]*tg.Message, 0, len(values))
for _, m := range values {
if msg, ok := m.(*tg.Message); ok {
result = append(result, msg)
}
}
return result
}
func extractMessageByID(resp tg.MessagesMessagesClass, id int) (*tg.Message, error) {
messages, err := extractMessages(resp)
if err != nil {
return nil, err
}
for _, msg := range messages {
if msg.ID == id {
return msg, nil
}
}
return nil, fmt.Errorf("message %d not found", id)
}
func isFromBot(msg *tg.Message, botID int64) bool {
if msg == nil || msg.Out {
return false
}
if peer, ok := msg.GetPeerID().(*tg.PeerUser); ok && peer.UserID == botID {
return true
}
if fromClass, ok := msg.GetFromID(); ok {
if from, ok := fromClass.(*tg.PeerUser); ok && from.UserID == botID {
return true
}
}
return false
}