summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWim <wim@42.be>2020-12-31 16:59:47 +0100
committerGitHub <noreply@github.com>2020-12-31 16:59:47 +0100
commit19d47784bde7f5d8cfc06f868350ed6ac69c8a21 (patch)
tree74aba773ce82e7db12182c3554d62e9602b84f95
parentb89102c5fcb96c5c40ca3d2ed673b6deefe92e64 (diff)
downloadmatterbridge-msglm-19d47784bde7f5d8cfc06f868350ed6ac69c8a21.tar.gz
matterbridge-msglm-19d47784bde7f5d8cfc06f868350ed6ac69c8a21.tar.bz2
matterbridge-msglm-19d47784bde7f5d8cfc06f868350ed6ac69c8a21.zip
Add threading support with token (discord) (#1342)
Webhooks don't support the threading yet, so this is token only. In discord you can reply on each message of a thread, but this is not possible in mattermost (so some changes added there to make sure we always answer on the rootID of the thread). Also needs some more testing with slack. update : It now also uses the token when replying to a thread (even if webhooks are enabled), until webhooks have support for threads.
-rw-r--r--bridge/discord/discord.go17
-rw-r--r--bridge/discord/handlers.go5
-rw-r--r--bridge/mattermost/handlers.go2
-rw-r--r--bridge/mattermost/mattermost.go9
-rw-r--r--gateway/router.go2
5 files changed, 31 insertions, 4 deletions
diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go
index d63006a7..c8b810c6 100644
--- a/bridge/discord/discord.go
+++ b/bridge/discord/discord.go
@@ -244,7 +244,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
// Use webhook to send the message
useWebhooks := b.shouldMessageUseWebhooks(&msg)
- if useWebhooks && msg.Event != config.EventMsgDelete {
+ if useWebhooks && msg.Event != config.EventMsgDelete && msg.ParentID == "" {
return b.handleEventWebhook(&msg, channelID)
}
@@ -287,11 +287,24 @@ func (b *Bdiscord) handleEventBotUser(msg *config.Message, channelID string) (st
return msg.ID, err
}
+ m := discordgo.MessageSend{
+ Content: msg.Username + msg.Text,
+ }
+
+ if msg.ParentID != "" && msg.ParentID != "msg-parent-not-found" {
+ m.Reference = &discordgo.MessageReference{
+ MessageID: msg.ParentID,
+ ChannelID: channelID,
+ GuildID: b.guildID,
+ }
+ }
+
// Post normal message
- res, err := b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)
+ res, err := b.c.ChannelMessageSendComplex(channelID, &m)
if err != nil {
return "", err
}
+
return res.ID, nil
}
diff --git a/bridge/discord/handlers.go b/bridge/discord/handlers.go
index 370b8912..d2b38538 100644
--- a/bridge/discord/handlers.go
+++ b/bridge/discord/handlers.go
@@ -127,6 +127,11 @@ func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat
// Replace emotes
rmsg.Text = replaceEmotes(rmsg.Text)
+ // Add our parent id if it exists
+ if m.MessageReference != nil {
+ rmsg.ParentID = m.MessageReference.MessageID
+ }
+
b.Log.Debugf("<= Sending message from %s on %s to gateway", m.Author.Username, b.Account)
b.Log.Debugf("<= Message is %#v", rmsg)
b.Remote <- rmsg
diff --git a/bridge/mattermost/handlers.go b/bridge/mattermost/handlers.go
index 67e68d02..58af43a8 100644
--- a/bridge/mattermost/handlers.go
+++ b/bridge/mattermost/handlers.go
@@ -108,7 +108,7 @@ func (b *Bmattermost) handleMatterClient(messages chan *config.Message) {
Channel: message.Channel,
Text: message.Text,
ID: message.Post.Id,
- ParentID: message.Post.ParentId,
+ ParentID: message.Post.RootId, // ParentID is obsolete with mattermost
Extra: make(map[string][]interface{}),
}
diff --git a/bridge/mattermost/mattermost.go b/bridge/mattermost/mattermost.go
index e41b19d7..2c11b79e 100644
--- a/bridge/mattermost/mattermost.go
+++ b/bridge/mattermost/mattermost.go
@@ -127,6 +127,15 @@ func (b *Bmattermost) Send(msg config.Message) (string, error) {
msg.Text = fmt.Sprintf("[thread]: %s", msg.Text)
}
+ // we only can reply to the root of the thread, not to a specific ID (like discord for example does)
+ if msg.ParentID != "" {
+ post, res := b.mc.Client.GetPost(msg.ParentID, "")
+ if res.Error != nil {
+ b.Log.Errorf("getting post %s failed: %s", msg.ParentID, res.Error.DetailedError)
+ }
+ msg.ParentID = post.RootId
+ }
+
// Upload a file if it exists
if msg.Extra != nil {
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
diff --git a/gateway/router.go b/gateway/router.go
index b07e5781..468f02c8 100644
--- a/gateway/router.go
+++ b/gateway/router.go
@@ -160,7 +160,7 @@ func (r *Router) handleReceive() {
// For some bridges we always add/update the message ID.
// This is necessary as msgIDs will change if a bridge returns
// a different ID in response to edits.
- if !exists || msg.Protocol == "discord" {
+ if !exists {
gw.Messages.Add(msg.Protocol+" "+msg.ID, msgIDs)
}
}