package telegram import ( "context" "log/slog" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) type UpdateHandler interface { Handle(ctx context.Context, update tgbotapi.Update) } type UpdatePoller struct { bot *tgbotapi.BotAPI handler UpdateHandler logger *slog.Logger timeout int } func NewUpdatePoller(bot *tgbotapi.BotAPI, handler UpdateHandler, logger *slog.Logger) *UpdatePoller { return &UpdatePoller{ bot: bot, handler: handler, logger: logger, timeout: 60, } } func (p *UpdatePoller) Start(ctx context.Context) error { u := tgbotapi.NewUpdate(0) u.Timeout = p.timeout updates := p.bot.GetUpdatesChan(u) p.logger.InfoContext(ctx, "update poller started") for { select { case <-ctx.Done(): p.bot.StopReceivingUpdates() p.logger.InfoContext(ctx, "update poller stopped") return ctx.Err() case update, ok := <-updates: if !ok { return nil } go p.handler.Handle(ctx, update) } } }