Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit a221212353eb8498698ccc372a52326bf81b4e75 Author: Thom Dickson <td3of4@gmail.com> Date: Tue Mar 14 18:03:04 2023 +0000 Add support for Telegram topics (telegram) (#1942) Topics are surfaced by appending /<topic-id> to the channel setting for the gateway. An example for the topic with ID of 16 would be: ``` [[gateway.inout]] account="telegram.mytelegram" channel="-100xxxxxxxxxx/16" ``` diff --git a/bridge/telegram/handlers.go b/bridge/telegram/handlers.go index 5ffb1ec..985397e 100644 --- a/bridge/telegram/handlers.go +++ b/bridge/telegram/handlers.go @@ -117 +117 @@ import (   "github.com/42wim/matterbridge/bridge/config"   "github.com/42wim/matterbridge/bridge/helper"   "github.com/davecgh/go-spew/spew" - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + tgbotapi "github.com/matterbridge/telegram-bot-api/v6"  )    func (b *Btelegram) handleUpdate(rmsg *config.Message, message, posted, edited *tgbotapi.Message) *tgbotapi.Message { @@ -206 +2011 @@ func (b *Btelegram) handleUpdate(rmsg *config.Message, message, posted, edited *   if posted.Text == "/chatId" {   chatID := strconv.FormatInt(posted.Chat.ID, 10)   + // Handle chat topics + if posted.IsTopicMessage { + chatID = chatID + "/" + strconv.Itoa(posted.MessageThreadID) + } +   _, err := b.Send(config.Message{   Channel: chatID,   Text: fmt.Sprintf("ID of this chat: %s", chatID), @@ -917 +968 @@ func (b *Btelegram) handleForwarded(rmsg *config.Message, message *tgbotapi.Mess    // handleQuoting handles quoting of previous messages  func (b *Btelegram) handleQuoting(rmsg *config.Message, message *tgbotapi.Message) { - if message.ReplyToMessage != nil { + // Used to check if the message was a reply to the root topic + if message.ReplyToMessage != nil && !(message.ReplyToMessage.MessageID == message.MessageThreadID) { //nolint:nestif   usernameReply := ""   if message.ReplyToMessage.From != nil {   if b.GetBool("UseFirstName") { @@ -2119 +21714 @@ func (b *Btelegram) handleRecv(updates <-chan tgbotapi.Update) {   // set the ID's from the channel or group message   rmsg.ID = strconv.Itoa(message.MessageID)   rmsg.Channel = strconv.FormatInt(message.Chat.ID, 10) + if message.MessageThreadID != 0 { + rmsg.Channel += "/" + strconv.Itoa(message.MessageThreadID) + }     // preserve threading from telegram reply - if message.ReplyToMessage != nil { + if message.ReplyToMessage != nil && + // Used to check if the message was a reply to the root topic + !(message.ReplyToMessage.MessageID == message.MessageThreadID) {   rmsg.ParentID = strconv.Itoa(message.ReplyToMessage.MessageID)   }   @@ -32612 +33712 @@ func (b *Btelegram) maybeConvertWebp(name *string, data *[]byte) {    // handleDownloadFile handles file download  func (b *Btelegram) handleDownload(rmsg *config.Message, message *tgbotapi.Message) error { - size := 0 + size := int64(0)   var url, name, text string   switch {   case message.Sticker != nil:   text, name, url = b.getDownloadInfo(message.Sticker.FileID, ".webp", true) - size = message.Sticker.FileSize + size = int64(message.Sticker.FileSize)   case message.Voice != nil:   text, name, url = b.getDownloadInfo(message.Voice.FileID, ".ogg", true)   size = message.Voice.FileSize @@ -3487 +3597 @@ func (b *Btelegram) handleDownload(rmsg *config.Message, message *tgbotapi.Messa   text = " " + message.Document.FileName + " : " + url   case message.Photo != nil:   photos := message.Photo - size = photos[len(photos)-1].FileSize + size = int64(photos[len(photos)-1].FileSize)   text, name, url = b.getDownloadInfo(photos[len(photos)-1].FileID, "", true)   }   @@ -4527 +4637 @@ func (b *Btelegram) handleEdit(msg *config.Message, chatid int64) (string, error  }    // handleUploadFile handles native upload of files -func (b *Btelegram) handleUploadFile(msg *config.Message, chatid int64, parentID int) (string, error) { +func (b *Btelegram) handleUploadFile(msg *config.Message, chatid int64, threadid int, parentID int) (string, error) {   var media []interface{}   for _, f := range msg.Extra["file"] {   fi := f.(config.FileInfo) @@ -5027 +5137 @@ func (b *Btelegram) handleUploadFile(msg *config.Message, chatid int64, parentID   }   }   - return b.sendMediaFiles(msg, chatid, parentID, media) + return b.sendMediaFiles(msg, chatid, threadid, parentID, media)  }    func (b *Btelegram) handleQuote(message, quoteNick, quoteMessage string) string { diff --git a/bridge/telegram/telegram.go b/bridge/telegram/telegram.go index 43cb818..e7885ca 100644 --- a/bridge/telegram/telegram.go +++ b/bridge/telegram/telegram.go @@ -107 +107 @@ import (   "github.com/42wim/matterbridge/bridge"   "github.com/42wim/matterbridge/bridge/config"   "github.com/42wim/matterbridge/bridge/helper" - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + tgbotapi "github.com/matterbridge/telegram-bot-api/v6"  )    const ( @@ -8611 +8641 @@ func TGGetParseMode(b *Btelegram, username string, text string) (textout string,   return textout, parsemode  }   +func (b *Btelegram) getIds(channel string) (int64, int, error) { + var chatid int64 + topicid := 0 + + // get the chatid + if strings.Contains(channel, "/") { //nolint:nestif + s := strings.Split(channel, "/") + if len(s) < 2 { + b.Log.Errorf("Invalid channel format: %#v\n", channel) + return 0, 0, nil + } + id, err := strconv.ParseInt(s[0], 10, 64) + if err != nil { + return 0, 0, err + } + chatid = id + tid, err := strconv.Atoi(s[1]) + if err != nil { + return 0, 0, err + } + topicid = tid + } else { + id, err := strconv.ParseInt(channel, 10, 64) + if err != nil { + return 0, 0, err + } + chatid = id + } + return chatid, topicid, nil +} +  func (b *Btelegram) Send(msg config.Message) (string, error) {   b.Log.Debugf("=> Receiving %#v", msg)   - // get the chatid - chatid, err := strconv.ParseInt(msg.Channel, 10, 64) + chatid, topicid, err := b.getIds(msg.Channel)   if err != nil {   return "", err   } @@ -12313 +15313 @@ func (b *Btelegram) Send(msg config.Message) (string, error) {   // Upload a file if it exists   if msg.Extra != nil {   for _, rmsg := range helper.HandleExtra(&msg, b.General) { - if _, msgErr := b.sendMessage(chatid, rmsg.Username, rmsg.Text, parentID); msgErr != nil { + if _, msgErr := b.sendMessage(chatid, topicid, rmsg.Username, rmsg.Text, parentID); msgErr != nil {   b.Log.Errorf("sendMessage failed: %s", msgErr)   }   }   // check if we have files to upload (from slack, telegram or mattermost)   if len(msg.Extra["file"]) > 0 { - return b.handleUploadFile(&msg, chatid, parentID) + return b.handleUploadFile(&msg, chatid, topicid, parentID)   }   }   @@ -1437 +1737 @@ func (b *Btelegram) Send(msg config.Message) (string, error) {   // Ignore empty text field needs for prevent double messages from whatsapp to telegram   // when sending media with text caption   if msg.Text != "" { - return b.sendMessage(chatid, msg.Username, msg.Text, parentID) + return b.sendMessage(chatid, topicid, msg.Username, msg.Text, parentID)   }     return "", nil @@ -1579 +18712 @@ func (b *Btelegram) getFileDirectURL(id string) string {   return res  }   -func (b *Btelegram) sendMessage(chatid int64, username, text string, parentID int) (string, error) { +func (b *Btelegram) sendMessage(chatid int64, topicid int, username, text string, parentID int) (string, error) {   m := tgbotapi.NewMessage(chatid, "")   m.Text, m.ParseMode = TGGetParseMode(b, username, text) + if topicid != 0 { + m.BaseChat.MessageThreadID = topicid + }   m.ReplyToMessageID = parentID   m.DisableWebPagePreview = b.GetBool("DisableWebPagePreview")   @@ -17111 +20419 @@ func (b *Btelegram) sendMessage(chatid int64, username, text string, parentID in  }    // sendMediaFiles native upload media files via media group -func (b *Btelegram) sendMediaFiles(msg *config.Message, chatid int64, parentID int, media []interface{}) (string, error) { +func (b *Btelegram) sendMediaFiles(msg *config.Message, chatid int64, threadid int, parentID int, media []interface{}) (string, error) {   if len(media) == 0 {   return "", nil   } - mg := tgbotapi.MediaGroupConfig{ChatID: chatid, ChannelUsername: msg.Username, Media: media, ReplyToMessageID: parentID} + mg := tgbotapi.MediaGroupConfig{ + BaseChat: tgbotapi.BaseChat{ + ChatID: chatid, + MessageThreadID: threadid, + ChannelUsername: msg.Username, + ReplyToMessageID: parentID, + }, + Media: media, + }   messages, err := b.c.SendMediaGroup(mg)   if err != nil {   return "", err diff --git a/go.mod b/go.mod index 91adf77..c4c8c24 100644 --- a/go.mod +++ b/go.mod @@ -117 +116 @@ require (   github.com/d5/tengo/v2 v2.13.0   github.com/davecgh/go-spew v1.1.1   github.com/fsnotify/fsnotify v1.6.0 - github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1   github.com/gomarkdown/markdown v0.0.0-20221013030248-663e2500819c   github.com/google/gops v0.3.27   github.com/gorilla/schema v1.2.0 @@ -296 +287 @@ require (   github.com/matterbridge/gozulipbot v0.0.0-20211023205727-a19d6c1f3b75   github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba   github.com/matterbridge/matterclient v0.0.0-20221106190440-8bcf49695e0d + github.com/matterbridge/telegram-bot-api/v6 v6.5.0   github.com/mattermost/mattermost-server/v5 v5.39.3   github.com/mattermost/mattermost-server/v6 v6.7.2   github.com/mattn/godown v0.0.1 diff --git a/go.sum b/go.sum index ac91312..f2087fe 100644 --- a/go.sum +++ b/go.sum @@ -6078 +6076 @@ github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB  github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=  github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=  github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=  github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho=  github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=  github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= @@ -10856 +10838 @@ github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d97130  github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba/go.mod h1:iXGEotOvwI1R1SjLxRc+BF5rUORTMtE0iMZBT2lxqAU=  github.com/matterbridge/matterclient v0.0.0-20221106190440-8bcf49695e0d h1:aI0ANEzy3dMv3vEAMQ80AItNie0fBR9ZxE2sAedORmM=  github.com/matterbridge/matterclient v0.0.0-20221106190440-8bcf49695e0d/go.mod h1:Zg8PH1P/1CNUxozQ8blnjAV9PA4Qn2qWf33cX5yNKGM= +github.com/matterbridge/telegram-bot-api/v6 v6.5.0 h1:wCnHWvt4WGhfognQsuu2OnHyqENBdJRf2mReYTCXggQ= +github.com/matterbridge/telegram-bot-api/v6 v6.5.0/go.mod h1:/hSLrs8h/xNsQglQXjwXJ92iZU8XfTGkYUQ7KVDWEVo=  github.com/mattermost/go-i18n v1.11.0/go.mod h1:RyS7FDNQlzF1PsjbJWHRI35exqaKGSO9qD4iv8QjE34=  github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404 h1:Khvh6waxG1cHc4Cz5ef9n3XVCxRWpAKUtqg9PJl5+y8=  github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404/go.mod h1:RyS7FDNQlzF1PsjbJWHRI35exqaKGSO9qD4iv8QjE34=