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 } // NewTelegramMessageSender принимает готового клиента, а не токен. Клиента // заводит сборка при старте — одного на отправителя и на транспорт бота: пока // его строили здесь и там порознь, два пути одного старта разошлись в том, // терпеть ли негодный токен, и согласовывать их приходилось руками. func NewTelegramMessageSender(bot *tgbotapi.BotAPI, logger *slog.Logger) *TelegramMessageSender { return &TelegramMessageSender{ bot: bot, logger: logger, } } 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 }