diff --git a/bridge/telegram/handlers.go b/bridge/telegram/handlers.go index d9b104a3..6267c12b 100644 --- a/bridge/telegram/handlers.go +++ b/bridge/telegram/handlers.go @@ -199,6 +199,11 @@ func (b *Btelegram) handleRecv(updates <-chan tgbotapi.Update) { rmsg.ID = strconv.Itoa(message.MessageID) rmsg.Channel = strconv.FormatInt(message.Chat.ID, 10) + // preserve threading from telegram reply + if message.ReplyToMessage != nil { + rmsg.ParentID = strconv.Itoa(message.ReplyToMessage.MessageID) + } + // handle entities (adding URLs) b.handleEntities(&rmsg, message) diff --git a/bridge/telegram/telegram.go b/bridge/telegram/telegram.go index d696e9bc..1b648309 100644 --- a/bridge/telegram/telegram.go +++ b/bridge/telegram/telegram.go @@ -1,6 +1,7 @@ package btelegram import ( + "fmt" "html" "log" "strconv" @@ -108,10 +109,16 @@ func (b *Btelegram) Send(msg config.Message) (string, error) { return b.handleDelete(&msg, chatid) } + // Handle prefix hint for unthreaded messages. + if msg.ParentNotFound() { + msg.ParentID = "" + msg.Text = fmt.Sprintf("[reply]: %s", msg.Text) + } + // 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); msgErr != nil { + if _, msgErr := b.sendMessage(chatid, rmsg.Username, rmsg.Text, msg.ParentID); msgErr != nil { b.Log.Errorf("sendMessage failed: %s", msgErr) } } @@ -131,7 +138,7 @@ 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) + return b.sendMessage(chatid, msg.Username, msg.Text, msg.ParentID) } return "", nil @@ -145,10 +152,16 @@ func (b *Btelegram) getFileDirectURL(id string) string { return res } -func (b *Btelegram) sendMessage(chatid int64, username, text string) (string, error) { +func (b *Btelegram) sendMessage(chatid int64, username, text, parentID string) (string, error) { m := tgbotapi.NewMessage(chatid, "") m.Text, m.ParseMode = TGGetParseMode(b, username, text) - + if parentID != "" { + rmid, err := strconv.Atoi(parentID) + if err != nil { + return "", err + } + m.ReplyToMessageID = rmid + } m.DisableWebPagePreview = b.GetBool("DisableWebPagePreview") res, err := b.c.Send(m) diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index 656949fc..54768a1e 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -1147,6 +1147,12 @@ StripNick=false #OPTIONAL (default false) ShowTopicChange=false +#Opportunistically preserve threaded replies between Telegram groups. +#This only works if the parent message is still in the cache. +#Cache is flushed between restarts. +#OPTIONAL (default false) +PreserveThreading=false + ################################################################### #rocketchat section ###################################################################