diff options
author | Simon THOBY <simonthoby@live.fr> | 2020-11-14 05:08:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-14 04:08:09 +0000 |
commit | cbb46293ab670c1989bfcd9aae5d853223074038 (patch) | |
tree | 3376530d6ac2816c49140d7bef365ad05dff846d /bridge/discord/discord.go | |
parent | 765e00c949344b958d4681c91db8502d150f0353 (diff) | |
download | matterbridge-msglm-cbb46293ab670c1989bfcd9aae5d853223074038.tar.gz matterbridge-msglm-cbb46293ab670c1989bfcd9aae5d853223074038.tar.bz2 matterbridge-msglm-cbb46293ab670c1989bfcd9aae5d853223074038.zip |
Update webhook messages via new endpoint (discord)
When using the webhook, the previous method to edit a message was to
delete the old one via the classical API, and to create a new message
via the webhook. While this works, this means that editing "old" messages
lead to a mess where the chronological order is no longer respected.
This uses an hidden API explained in https://support.discord.com/hc/en-us/community/posts/360034557771
to achieve a proper edition using the webhook API.
The obvious downside of this approach is that since it is an
undocumented API for now, so there is no stability guarantee :/
Diffstat (limited to 'bridge/discord/discord.go')
-rw-r--r-- | bridge/discord/discord.go | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index 245b87c7..0df03212 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -34,8 +34,6 @@ 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 { @@ -43,7 +41,6 @@ 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")) @@ -191,8 +188,6 @@ 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) @@ -233,18 +228,6 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { return "", nil } - // 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 { - b.Log.Errorf("Could not delete edited webhook message: %s", err) - } - } - - b.Log.Debugf("Broadcasting using Webhook") - // skip empty messages if msg.Text == "" && (msg.Extra == nil || len(msg.Extra["file"]) == 0) { b.Log.Debugf("Skipping empty message %#v", msg) @@ -257,11 +240,25 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { if len(msg.Username) > 32 { msg.Username = msg.Username[0:32] } + + if msg.ID != "" { + b.Log.Debugf("Editing webhook message") + uri := discordgo.EndpointWebhookToken(wID, wToken) + "/messages/" + msg.ID + _, err := b.c.RequestWithBucketID("PATCH", uri, discordgo.WebhookParams{ + Content: msg.Text, + Username: msg.Username, + }, discordgo.EndpointWebhookToken("", "")) + if err == nil { + return msg.ID, nil + } + b.Log.Errorf("Could not edit webhook message: %s", err) + } + + b.Log.Debugf("Broadcasting using Webhook") + // if we have a global webhook for this Discord account, and permission // to modify webhooks (previously verified), then set its channel to - // the message channel before using it - // TODO: this isn't necessary if the last message from this webhook was - // sent to the current channel + // the message channel before using it. if isGlobalWebhook && b.canEditWebhooks { b.Log.Debugf("Setting webhook channel to \"%s\"", msg.Channel) _, err := b.c.WebhookEdit(wID, "", "", channelID) @@ -280,7 +277,6 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { return "", nil } - b.updateCacheID(origMsgID, msg.ID) return msg.ID, nil } @@ -291,7 +287,6 @@ 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 } |