summaryrefslogtreecommitdiffstats
path: root/bridge/discord/webhook.go
diff options
context:
space:
mode:
Diffstat (limited to 'bridge/discord/webhook.go')
-rw-r--r--bridge/discord/webhook.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/bridge/discord/webhook.go b/bridge/discord/webhook.go
new file mode 100644
index 00000000..5c6f63a1
--- /dev/null
+++ b/bridge/discord/webhook.go
@@ -0,0 +1,102 @@
+package bdiscord
+
+import (
+ "bytes"
+
+ "github.com/42wim/matterbridge/bridge/config"
+ "github.com/matterbridge/discordgo"
+)
+
+// shouldMessageUseWebhooks checks if have a channel specific webhook, if we're not using auto webhooks
+func (b *Bdiscord) shouldMessageUseWebhooks(msg *config.Message) bool {
+ if b.useAutoWebhooks {
+ return true
+ }
+
+ b.channelsMutex.RLock()
+ defer b.channelsMutex.RUnlock()
+ if ci, ok := b.channelInfoMap[msg.Channel+b.Account]; ok {
+ if ci.Options.WebhookURL != "" {
+ return true
+ }
+ }
+ return false
+}
+
+// maybeGetLocalAvatar checks if UseLocalAvatar contains the message's
+// account or protocol, and if so, returns the Discord avatar (if exists)
+func (b *Bdiscord) maybeGetLocalAvatar(msg *config.Message) string {
+ for _, val := range b.GetStringSlice("UseLocalAvatar") {
+ if msg.Protocol != val && msg.Account != val {
+ continue
+ }
+
+ member, err := b.getGuildMemberByNick(msg.Username)
+ if err != nil {
+ return ""
+ }
+
+ return member.User.AvatarURL("")
+ }
+ return ""
+}
+
+// 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, channelID string) (*discordgo.Message, error) {
+ var (
+ res *discordgo.Message
+ err error
+ )
+
+ // If avatar is unset, mutate the message to include the local avatar (but only if settings say we should do this)
+ if msg.Avatar == "" {
+ msg.Avatar = b.maybeGetLocalAvatar(msg)
+ }
+
+ // WebhookParams can have either `Content` or `File`.
+
+ // We can't send empty messages.
+ if msg.Text != "" {
+ res, err = b.transmitter.Send(
+ channelID,
+ &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),
+ }
+ content := ""
+ if msg.Text == "" {
+ content = fi.Comment
+ }
+ _, e2 := b.transmitter.Send(
+ channelID,
+ &discordgo.WebhookParams{
+ Username: msg.Username,
+ AvatarURL: msg.Avatar,
+ File: &file,
+ Content: content,
+ },
+ )
+ if e2 != nil {
+ b.Log.Errorf("Could not send file %#v for message %#v: %s", file, msg, e2)
+ }
+ }
+ }
+ return res, err
+}