pievr/internal/bot/bot.go

65 lines
1.3 KiB
Go

package bot
import (
"context"
"fmt"
"log"
"github.com/go-telegram/bot"
"github.com/go-telegram/bot/models"
"pievr/internal/gemini"
)
type Bot struct {
b *bot.Bot
geminiCli gemini.Client
}
func New(token string, geminiCli gemini.Client) (*Bot, error) {
myBot := &Bot{
geminiCli: geminiCli,
}
opts := []bot.Option{
bot.WithDefaultHandler(myBot.handler),
}
b, err := bot.New(token, opts...)
if err != nil {
return nil, fmt.Errorf("failed to create telegram bot: %w", err)
}
myBot.b = b
return myBot, nil
}
func (s *Bot) Start(ctx context.Context) {
log.Println("Telegram bot is starting...")
s.b.Start(ctx)
}
func (s *Bot) handler(ctx context.Context, b *bot.Bot, update *models.Update) {
if update.Message == nil || update.Message.Text == "" {
return
}
userMsg := update.Message.Text
chatID := update.Message.Chat.ID
log.Printf("Received message from %d: %s", chatID, userMsg)
// Send prompt to Gemini (via interface)
reply, err := s.geminiCli.Generate(ctx, userMsg)
if err != nil {
log.Printf("Failed to generate response from Gemini: %v", err)
reply = "Извините, произошла ошибка при обращении к LLM."
}
_, err = b.SendMessage(ctx, &bot.SendMessageParams{
ChatID: chatID,
Text: reply,
})
if err != nil {
log.Printf("Failed to send telegram message: %v", err)
}
}