From c91bfd08d855d07eccf5319e8881c816edf598ea Mon Sep 17 00:00:00 2001 From: Qais Patankar Date: Sun, 9 Feb 2020 21:07:26 +0000 Subject: [PATCH] Add ability to procure avatars from the destination bridge (#1000) * remote_avatar: add UseLocalAvatar * remote_avatar: make sure msg.Protocol is always set correctly * remote_avatars: support msg.Account * remote_avatar: add to matterbridge.toml.sample * remote_avatar: clarify something --- bridge/config/config.go | 1 + bridge/discord/discord.go | 21 +++++++++++++++++++++ gateway/gateway.go | 3 +-- gateway/router.go | 3 +++ matterbridge.toml.sample | 6 ++++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/bridge/config/config.go b/bridge/config/config.go index 84e8f75f..2d20c11f 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -138,6 +138,7 @@ type Protocol struct { Topic string // zulip URL string // mattermost, slack // DEPRECATED UseAPI bool // mattermost, slack + UseLocalAvatar []string // discord UseSASL bool // IRC UseTLS bool // IRC UseDiscriminator bool // discord diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index e81d0783..e37208b7 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -381,6 +381,19 @@ func (b *Bdiscord) webhookSend(msg *config.Message, webhookID, token string) (*d err error ) + // If avatar is unset, check if UseLocalAvatar contains the message's + // account or protocol, and if so, try to find a local avatar + if msg.Avatar == "" { + for _, val := range b.GetStringSlice("UseLocalAvatar") { + if msg.Protocol == val || msg.Account == val { + if avatar := b.findAvatar(msg); avatar != "" { + msg.Avatar = avatar + } + break + } + } + } + // WebhookParams can have either `Content` or `File`. // We can't send empty messages. @@ -430,3 +443,11 @@ func (b *Bdiscord) webhookSend(msg *config.Message, webhookID, token string) (*d } return res, err } + +func (b *Bdiscord) findAvatar(m *config.Message) string { + member, err := b.getGuildMemberByNick(m.Username) + if err != nil { + return "" + } + return member.User.AvatarURL("") +} diff --git a/gateway/gateway.go b/gateway/gateway.go index e265e62b..1e958a86 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -306,8 +306,6 @@ func (gw *Gateway) ignoreMessage(msg *config.Message) bool { } func (gw *Gateway) modifyUsername(msg *config.Message, dest *bridge.Bridge) string { - br := gw.Bridges[msg.Account] - msg.Protocol = br.Protocol if dest.GetBool("StripNick") { re := regexp.MustCompile("[^a-zA-Z0-9]+") msg.Username = re.ReplaceAllString(msg.Username, "") @@ -315,6 +313,7 @@ func (gw *Gateway) modifyUsername(msg *config.Message, dest *bridge.Bridge) stri nick := dest.GetString("RemoteNickFormat") // loop to replace nicks + br := gw.Bridges[msg.Account] for _, outer := range br.GetStringSlice2D("ReplaceNicks") { search := outer[0] replace := outer[1] diff --git a/gateway/router.go b/gateway/router.go index 56573f74..b07e5781 100644 --- a/gateway/router.go +++ b/gateway/router.go @@ -132,6 +132,9 @@ func (r *Router) handleReceive() { r.handleEventFailure(&msg) r.handleEventRejoinChannels(&msg) + // Set message protocol based on the account it came from + msg.Protocol = r.getBridge(msg.Account).Protocol + filesHandled := false for _, gw := range r.Gateways { // record all the message ID's of the different bridges diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index d9d596e5..6429e08a 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -724,6 +724,12 @@ Server="yourservername" #OPTIONAL (default false) ShowEmbeds=false +#Show Discord avatars of remote users with matching names +#This only works for webhooks & if the source message has no avatar +# +#OPTIONAL (default empty) +UseLocalAvatar=["irc"] + #Shows the username instead of the server nickname #OPTIONAL (default false) UseUserName=false