From 9ebcc3a4654ad33210f092aa32f008dab756b66b Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 11 May 2023 19:57:16 +0800 Subject: [PATCH] fix: split the message for Telegram if it's too long (close #79) --- channel/telegram.go | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/channel/telegram.go b/channel/telegram.go index 0918036..30bb88a 100644 --- a/channel/telegram.go +++ b/channel/telegram.go @@ -9,6 +9,8 @@ import ( "net/http" ) +var TelegramMaxMessageLength = 4096 + type telegramMessageRequest struct { ChatId string `json:"chat_id"` Text string `json:"text"` @@ -34,22 +36,32 @@ func SendTelegramMessage(message *model.Message, user *model.User, channel_ *mod messageRequest.Text = message.Content messageRequest.ParseMode = "markdown" } - jsonData, err := json.Marshal(messageRequest) - if err != nil { - return err - } - resp, err := http.Post(fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", channel_.Secret), "application/json", - bytes.NewBuffer(jsonData)) - if err != nil { - return err - } - var res telegramMessageResponse - err = json.NewDecoder(resp.Body).Decode(&res) - if err != nil { - return err - } - if !res.Ok { - return errors.New(res.Description) + text := messageRequest.Text + idx := 0 + for idx < len(text) { + nextIdx := idx + TelegramMaxMessageLength + if nextIdx > len(text) { + nextIdx = len(text) + } + messageRequest.Text = text[idx:nextIdx] + idx = nextIdx + jsonData, err := json.Marshal(messageRequest) + if err != nil { + return err + } + resp, err := http.Post(fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", channel_.Secret), "application/json", + bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + var res telegramMessageResponse + err = json.NewDecoder(resp.Body).Decode(&res) + if err != nil { + return err + } + if !res.Ok { + return errors.New(res.Description) + } } return nil }