forked from jshiffer/matterbridge
Move webhook specific logic to its own file (discord)
This commit is contained in:
parent
0494119bf4
commit
aef2dcdfdd
@ -356,97 +356,3 @@ func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (stri
|
|||||||
}
|
}
|
||||||
return "", nil
|
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 ""
|
|
||||||
}
|
|
||||||
|
102
bridge/discord/webhook.go
Normal file
102
bridge/discord/webhook.go
Normal file
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user