From cec086994e1b00ee1230c6657f5fedaa2ce90372 Mon Sep 17 00:00:00 2001 From: MOZGIII Date: Thu, 29 Aug 2019 01:13:10 +0300 Subject: [PATCH] Add support for sending files via webhook (discord) (#872) --- bridge/discord/discord.go | 80 +++++++++++++++++++++++++++++++++------ bridge/discord/helpers.go | 24 ------------ go.mod | 1 + 3 files changed, 69 insertions(+), 36 deletions(-) diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index 1ae655bf..84171fa5 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -237,8 +237,10 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { } } } + // skip empty messages - if msg.Text == "" { + if msg.Text == "" && (msg.Extra == nil || len(msg.Extra["file"]) == 0) { + b.Log.Debugf("Skipping empty message %#v", msg) return "", nil } @@ -261,16 +263,16 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { return "", err } } - msg, err := b.webhookExecute( - wID, - wToken, - true, - &discordgo.WebhookParams{ - Content: msg.Text, - Username: msg.Username, - AvatarURL: msg.Avatar, - }) - return msg.ID, err + b.Log.Debugf("Processing webhook sending for message %#v", msg) + msg, err := b.webhookSend(&msg, wID, wToken) + if err != nil { + b.Log.Errorf("Could not broadcast via webook for message %#v: %s", msg, err) + return "", err + } + if msg == nil { + return "", nil + } + return msg.ID, nil } b.Log.Debugf("Broadcasting using token (API)") @@ -312,7 +314,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) { if err != nil { return "", err } - return res.ID, err + return res.ID, nil } // useWebhook returns true if we have a webhook defined somewhere @@ -376,3 +378,57 @@ func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (stri } return "", nil } + +// webhookSend send one or more message via webhook, taking care of file +// uploads (from slack, telegram or mattermost). +// Returns messageID and error. +func (b *Bdiscord) webhookSend(msg *config.Message, webhookID, token string) (*discordgo.Message, error) { + var ( + res *discordgo.Message + err error + ) + + // WebhookParams can have either `Content` or `File`. + + // We can't send empty messages. + if msg.Text != "" { + res, err = b.c.WebhookExecute( + webhookID, + token, + true, + &discordgo.WebhookParams{ + Content: msg.Text, + Username: msg.Username, + AvatarURL: msg.Avatar, + }, + ) + if err != nil { + b.Log.Errorf("Could not send text (%s) for message %#v: %s", msg.Text, msg, err) + } + } + + if msg.Extra != nil { + for _, f := range msg.Extra["file"] { + fi := f.(config.FileInfo) + file := discordgo.File{ + Name: fi.Name, + ContentType: "", + Reader: bytes.NewReader(*fi.Data), + } + _, e2 := b.c.WebhookExecute( + webhookID, + token, + false, + &discordgo.WebhookParams{ + Username: msg.Username, + AvatarURL: msg.Avatar, + File: &file, + }, + ) + if e2 != nil { + b.Log.Errorf("Could not send file %#v for message %#v: %s", file, msg, e2) + } + } + } + return res, err +} diff --git a/bridge/discord/helpers.go b/bridge/discord/helpers.go index 58676842..1447c530 100644 --- a/bridge/discord/helpers.go +++ b/bridge/discord/helpers.go @@ -1,7 +1,6 @@ package bdiscord import ( - "encoding/json" "errors" "regexp" "strings" @@ -236,26 +235,3 @@ 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 -} diff --git a/go.mod b/go.mod index c380835c..080ff55c 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/Philipp15b/go-steam v1.0.1-0.20180818081528-681bd9573329 github.com/Rhymen/go-whatsapp v0.0.3-0.20190729104911-5c79b2cf277a github.com/bwmarrin/discordgo v0.19.0 + // github.com/bwmarrin/discordgo v0.19.0 github.com/d5/tengo v1.24.1 github.com/dfordsoft/golib v0.0.0-20180902042739-76ee6ab99bec github.com/fsnotify/fsnotify v1.4.7