package telegram import ( "log/slog" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) const ( TextLengthLimit = 4000 ) type TelegramMessageSender struct { bot *tgbotapi.BotAPI logger *slog.Logger } func NewTelegramMessageSender(botToken string, logger *slog.Logger) (*TelegramMessageSender, error) { bot, err := tgbotapi.NewBotAPI(botToken) if err != nil { return nil, err } return &TelegramMessageSender{ bot: bot, logger: logger, }, nil } func (s *TelegramMessageSender) Send(text string, chatId int64, replyToMessageId *int) error { // If message is short enough, send it directly if len([]rune(text)) <= TextLengthLimit { return s.sendSingleMessage(text, chatId, replyToMessageId) } // Split long message into parts parts := s.splitMessageByWords(text, TextLengthLimit) // Send each part for i, part := range parts { var replyId *int // Only use replyToMessageId for the first part if i == 0 { replyId = replyToMessageId } err := s.sendSingleMessage(part, chatId, replyId) if err != nil { return err } } return nil } // sendSingleMessage sends a single message func (s *TelegramMessageSender) sendSingleMessage(text string, chatId int64, replyToMessageId *int) error { resultMsg := tgbotapi.NewMessage(chatId, text) if replyToMessageId != nil { resultMsg.ReplyToMessageID = *replyToMessageId } _, err := s.bot.Send(resultMsg) if err != nil { s.logger.Error("Failed to send message to tg bot", "error", err) return err } return nil }