summaryrefslogtreecommitdiffstats
path: root/bridge/discord
diff options
context:
space:
mode:
authorQais Patankar <qaisjp@gmail.com>2020-12-05 16:18:06 +0000
committerWim <wim@42.be>2020-12-13 23:19:48 +0100
commitaef2dcdfddd1a5b0a06e918cc878f3b52f7babf6 (patch)
treec9fd948f28ba0157dba5407858b29c1ab0ca7008 /bridge/discord
parent0494119bf4e1fb53967aca9be3203d7cf2bbb9a5 (diff)
downloadmatterbridge-msglm-aef2dcdfddd1a5b0a06e918cc878f3b52f7babf6.tar.gz
matterbridge-msglm-aef2dcdfddd1a5b0a06e918cc878f3b52f7babf6.tar.bz2
matterbridge-msglm-aef2dcdfddd1a5b0a06e918cc878f3b52f7babf6.zip
Move webhook specific logic to its own file (discord)
Diffstat (limited to 'bridge/discord')
-rw-r--r--bridge/discord/discord.go94
-rw-r--r--bridge/discord/webhook.go102
2 files changed, 102 insertions, 94 deletions
diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go
index 70fdaf90..1e6f3751 100644
--- a/bridge/discord/discord.go
+++ b/bridge/discord/discord.go
@@ -356,97 +356,3 @@ func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (stri
}
return "", nil
}
-
-// 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
-}
-
-// 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
-}
-
-// 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 ""
-}
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
+}