package interfaces import ( "context" "log/slog" "time" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" "github.com/paramah/gw_telegram/internal/application/dto" "github.com/paramah/gw_telegram/internal/application/usecase" ) type TelegramHandler struct { textUC *usecase.HandleTextMessage voiceUC *usecase.HandleVoiceMessage logger *slog.Logger } func NewTelegramHandler( textUC *usecase.HandleTextMessage, voiceUC *usecase.HandleVoiceMessage, logger *slog.Logger, ) *TelegramHandler { return &TelegramHandler{textUC: textUC, voiceUC: voiceUC, logger: logger} } func (h *TelegramHandler) Handle(ctx context.Context, update tgbotapi.Update) { defer func() { if r := recover(); r != nil { h.logger.ErrorContext(ctx, "panic in update handler", "panic", r) } }() if update.Message == nil { return } msg := update.Message switch { case msg.Voice != nil: in := dto.IncomingMessageDTO{ MessageID: int64(msg.MessageID), ChatID: msg.Chat.ID, UserID: msg.From.ID, Username: msg.From.UserName, FirstName: msg.From.FirstName, LastName: msg.From.LastName, VoiceFileID: msg.Voice.FileID, IsVoice: true, Timestamp: time.Unix(int64(msg.Date), 0), Language: msg.From.LanguageCode, } if err := h.voiceUC.Execute(ctx, in); err != nil { h.logger.ErrorContext(ctx, "voice handler error", "error", err, "user_id", msg.From.ID) } case msg.Text != "": in := dto.IncomingMessageDTO{ MessageID: int64(msg.MessageID), ChatID: msg.Chat.ID, UserID: msg.From.ID, Username: msg.From.UserName, FirstName: msg.From.FirstName, LastName: msg.From.LastName, Text: msg.Text, Timestamp: time.Unix(int64(msg.Date), 0), Language: msg.From.LanguageCode, } if err := h.textUC.Execute(ctx, in); err != nil { h.logger.ErrorContext(ctx, "text handler error", "error", err, "user_id", msg.From.ID) } } }