summaryrefslogtreecommitdiffstats
path: root/bridge/discord
diff options
context:
space:
mode:
authorWim <wim@42.be>2020-04-21 23:35:46 +0200
committerGitHub <noreply@github.com>2020-04-21 23:35:46 +0200
commiteaf92fca4ddf6bf78d2092618a4dc93b78af7140 (patch)
tree7c3c2f90b027117492aef33bcabeb744d51aef99 /bridge/discord
parent06b7bad7146607f46652c9bd766de3f95028c370 (diff)
downloadmatterbridge-msglm-eaf92fca4ddf6bf78d2092618a4dc93b78af7140.tar.gz
matterbridge-msglm-eaf92fca4ddf6bf78d2092618a4dc93b78af7140.tar.bz2
matterbridge-msglm-eaf92fca4ddf6bf78d2092618a4dc93b78af7140.zip
Add an ID cache (discord). Fixes #1106 (#1111)
When a webhook "edits" a message, it does this by deleting the message and creating a new one with the new content. On creation of this new message, we'll get another ID then already is know by the gateway in its id cache. So we add it in our own cache and replace it whenever we want to edit/delete it again.
Diffstat (limited to 'bridge/discord')
-rw-r--r--bridge/discord/discord.go9
-rw-r--r--bridge/discord/helpers.go34
2 files changed, 43 insertions, 0 deletions
diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go
index a59735ad..614512f3 100644
--- a/bridge/discord/discord.go
+++ b/bridge/discord/discord.go
@@ -34,6 +34,8 @@ type Bdiscord struct {
membersMutex sync.RWMutex
userMemberMap map[string]*discordgo.Member
nickMemberMap map[string]*discordgo.Member
+ webhookCache map[string]string
+ webhookMutex sync.RWMutex
}
func New(cfg *bridge.Config) bridge.Bridger {
@@ -41,6 +43,7 @@ func New(cfg *bridge.Config) bridge.Bridger {
b.userMemberMap = make(map[string]*discordgo.Member)
b.nickMemberMap = make(map[string]*discordgo.Member)
b.channelInfoMap = make(map[string]*config.ChannelInfo)
+ b.webhookCache = make(map[string]string)
if b.GetString("WebhookURL") != "" {
b.Log.Debug("Configuring Discord Incoming Webhook")
b.webhookID, b.webhookToken = b.splitURL(b.GetString("WebhookURL"))
@@ -188,6 +191,8 @@ func (b *Bdiscord) JoinChannel(channel config.ChannelInfo) error {
func (b *Bdiscord) Send(msg config.Message) (string, error) {
b.Log.Debugf("=> Receiving %#v", msg)
+ origMsgID := msg.ID
+
channelID := b.getChannelID(msg.Channel)
if channelID == "" {
return "", fmt.Errorf("Could not find channelID for %v", msg.Channel)
@@ -230,6 +235,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
// If we are editing a message, delete the old message
if msg.ID != "" {
+ msg.ID = b.getCacheID(msg.ID)
b.Log.Debugf("Deleting edited webhook message")
err := b.c.ChannelMessageDelete(channelID, msg.ID)
if err != nil {
@@ -273,6 +279,8 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
if msg == nil {
return "", nil
}
+
+ b.updateCacheID(origMsgID, msg.ID)
return msg.ID, nil
}
@@ -283,6 +291,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
if msg.ID == "" {
return "", nil
}
+ msg.ID = b.getCacheID(msg.ID)
err := b.c.ChannelMessageDelete(channelID, msg.ID)
return "", err
}
diff --git a/bridge/discord/helpers.go b/bridge/discord/helpers.go
index 9ef234c5..00592f3a 100644
--- a/bridge/discord/helpers.go
+++ b/bridge/discord/helpers.go
@@ -208,6 +208,40 @@ func (b *Bdiscord) splitURL(url string) (string, string) {
return webhookURLSplit[webhookIdxID], webhookURLSplit[webhookIdxToken]
}
+// getcacheID tries to find a corresponding msgID in the webhook cache.
+// if not found returns the original request.
+func (b *Bdiscord) getCacheID(msgID string) string {
+ b.webhookMutex.RLock()
+ defer b.webhookMutex.RUnlock()
+ for k, v := range b.webhookCache {
+ if msgID == k {
+ return v
+ }
+ }
+ return msgID
+}
+
+// updateCacheID updates the cache so that the newID takes the place of
+// the original ID. This is used for edit/deletes in combination with webhooks
+// as editing a message via webhook means deleting the message and creating a
+// new message (with a new ID). This ID needs to be set instead of the original ID
+func (b *Bdiscord) updateCacheID(origID, newID string) {
+ b.webhookMutex.Lock()
+ match := false
+ for k, v := range b.webhookCache {
+ if v == origID {
+ delete(b.webhookCache, k)
+ b.webhookCache[origID] = newID
+ match = true
+ continue
+ }
+ }
+ if !match && origID != "" {
+ b.webhookCache[origID] = newID
+ }
+ b.webhookMutex.Unlock()
+}
+
func enumerateUsernames(s string) []string {
onlySpace := true
for _, r := range s {