Files
gateway-telegram/internal/interfaces/telegram_handler.go

75 lines
1.9 KiB
Go

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)
}
}
}