package channels import ( "context" "fmt" "strings" "github.com/mymmrac/telego" "github.com/sipeed/picoclaw/pkg/config" ) type TelegramCommander interface { Help(ctx context.Context, message telego.Message) error Start(ctx context.Context, message telego.Message) error Show(ctx context.Context, message telego.Message) error List(ctx context.Context, message telego.Message) error } type cmd struct { bot *telego.Bot config *config.Config } func NewTelegramCommands(bot *telego.Bot, cfg *config.Config) TelegramCommander { return &cmd{ bot: bot, config: cfg, } } func commandArgs(text string) string { parts := strings.SplitN(text, " ", 2) if len(parts) < 2 { return "" } return strings.TrimSpace(parts[1]) } func (c *cmd) Help(ctx context.Context, message telego.Message) error { msg := `/start - Start the bot /help - Show this help message /show [model|channel] - Show current configuration /list [models|channels] - List available options ` _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ ChatID: telego.ChatID{ID: message.Chat.ID}, Text: msg, ReplyParameters: &telego.ReplyParameters{ MessageID: message.MessageID, }, }) return err } func (c *cmd) Start(ctx context.Context, message telego.Message) error { _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ ChatID: telego.ChatID{ID: message.Chat.ID}, Text: "Hello! I am PicoClaw 🦞", ReplyParameters: &telego.ReplyParameters{ MessageID: message.MessageID, }, }) return err } func (c *cmd) Show(ctx context.Context, message telego.Message) error { args := commandArgs(message.Text) if args == "" { _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ ChatID: telego.ChatID{ID: message.Chat.ID}, Text: "Usage: /show [model|channel]", ReplyParameters: &telego.ReplyParameters{ MessageID: message.MessageID, }, }) return err } var response string switch args { case "model": response = fmt.Sprintf("Current Model: %s (Provider: %s)", c.config.Agents.Defaults.Model, c.config.Agents.Defaults.Provider) case "channel": response = "Current Channel: telegram" default: response = fmt.Sprintf("Unknown parameter: %s. Try 'model' or 'channel'.", args) } _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ ChatID: telego.ChatID{ID: message.Chat.ID}, Text: response, ReplyParameters: &telego.ReplyParameters{ MessageID: message.MessageID, }, }) return err } func (c *cmd) List(ctx context.Context, message telego.Message) error { args := commandArgs(message.Text) if args == "" { _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ ChatID: telego.ChatID{ID: message.Chat.ID}, Text: "Usage: /list [models|channels]", ReplyParameters: &telego.ReplyParameters{ MessageID: message.MessageID, }, }) return err } var response string switch args { case "models": provider := c.config.Agents.Defaults.Provider if provider == "" { provider = "configured default" } response = fmt.Sprintf("Configured Model: %s\nProvider: %s\n\nTo change models, update config.yaml", c.config.Agents.Defaults.Model, provider) case "channels": var enabled []string if c.config.Channels.Telegram.Enabled { enabled = append(enabled, "telegram") } if c.config.Channels.WhatsApp.Enabled { enabled = append(enabled, "whatsapp") } if c.config.Channels.Feishu.Enabled { enabled = append(enabled, "feishu") } if c.config.Channels.Discord.Enabled { enabled = append(enabled, "discord") } if c.config.Channels.Slack.Enabled { enabled = append(enabled, "slack") } response = fmt.Sprintf("Enabled Channels:\n- %s", strings.Join(enabled, "\n- ")) default: response = fmt.Sprintf("Unknown parameter: %s. Try 'models' or 'channels'.", args) } _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ ChatID: telego.ChatID{ID: message.Chat.ID}, Text: response, ReplyParameters: &telego.ReplyParameters{ MessageID: message.MessageID, }, }) return err }