diff options
Diffstat (limited to 'bridge')
-rw-r--r-- | bridge/discord/discord.go | 16 | ||||
-rw-r--r-- | bridge/discord/helpers.go | 24 |
2 files changed, 37 insertions, 3 deletions
diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index ea43bd20..4c1c0f46 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -209,11 +209,21 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { b.channelsMutex.RUnlock() // Use webhook to send the message - if wID != "" { + if wID != "" && msg.Event != config.EventMsgDelete { // skip events if msg.Event != "" && msg.Event != config.EventJoinLeave && msg.Event != config.EventTopicChange { return "", nil } + + // If we are editing a message, delete the old message + if 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") for _, f := range msg.Extra["file"] { fi := f.(config.FileInfo) @@ -251,7 +261,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { return "", err } } - err := b.c.WebhookExecute( + msg, err := b.webhookExecute( wID, wToken, true, @@ -260,7 +270,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { Username: msg.Username, AvatarURL: msg.Avatar, }) - return "", err + return msg.ID, err } b.Log.Debugf("Broadcasting using token (API)") diff --git a/bridge/discord/helpers.go b/bridge/discord/helpers.go index 7b060817..e150d192 100644 --- a/bridge/discord/helpers.go +++ b/bridge/discord/helpers.go @@ -1,6 +1,7 @@ package bdiscord import ( + "encoding/json" "errors" "regexp" "strings" @@ -187,3 +188,26 @@ func enumerateUsernames(s string) []string { } return usernames } + +// webhookExecute executes a webhook. +// webhookID: The ID of a webhook. +// token : The auth token for the webhook +// wait : Waits for server confirmation of message send and ensures that the return struct is populated (it is nil otherwise) +func (b *Bdiscord) webhookExecute(webhookID, token string, wait bool, data *discordgo.WebhookParams) (st *discordgo.Message, err error) { + uri := discordgo.EndpointWebhookToken(webhookID, token) + + if wait { + uri += "?wait=true" + } + response, err := b.c.RequestWithBucketID("POST", uri, data, discordgo.EndpointWebhookToken("", "")) + if !wait || err != nil { + return nil, err + } + + err = json.Unmarshal(response, &st) + if err != nil { + return nil, discordgo.ErrJSONUnmarshal + } + + return st, nil +} |