65 lines
1.3 KiB
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)
|
|
}
|
|
}
|