From 2dbe0eb55729620ffdfdb7e4f10003564d79c7e1 Mon Sep 17 00:00:00 2001 From: Wim Date: Sat, 5 Nov 2016 01:11:28 +0100 Subject: [PATCH] Add support for dynamic IconURL (slack). Closes #43 --- bridge/config/config.go | 16 ++++++++++++++++ bridge/discord/discord.go | 3 ++- bridge/gitter/gitter.go | 3 ++- bridge/irc/irc.go | 3 ++- bridge/mattermost/mattermost.go | 8 ++++---- bridge/slack/slack.go | 28 +++++++++++++++++++--------- bridge/xmpp/xmpp.go | 3 ++- gateway/gateway.go | 10 +--------- matterbridge.toml.sample | 23 +++++++++++++---------- 9 files changed, 61 insertions(+), 36 deletions(-) diff --git a/bridge/config/config.go b/bridge/config/config.go index 89222894..32c8c74f 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -122,3 +122,19 @@ func OverrideCfgFromEnv(cfg *Config, protocol string, account string) { } } } + +func GetIconURL(msg *Message, cfg *Protocol) string { + iconURL := cfg.IconURL + iconURL = strings.Replace(iconURL, "{NICK}", msg.Username, -1) + iconURL = strings.Replace(iconURL, "{BRIDGE}", msg.Origin, -1) + iconURL = strings.Replace(iconURL, "{PROTOCOL}", msg.Protocol, -1) + return iconURL +} + +func GetNick(msg *Message, cfg *Protocol) string { + nick := cfg.RemoteNickFormat + nick = strings.Replace(nick, "{NICK}", msg.Username, -1) + nick = strings.Replace(nick, "{BRIDGE}", msg.Origin, -1) + nick = strings.Replace(nick, "{PROTOCOL}", msg.Protocol, -1) + return nick +} diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index 446977ad..7995a06d 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -103,7 +103,8 @@ func (b *bdiscord) Send(msg config.Message) error { flog.Errorf("Could not find channelID for %v", msg.Channel) return nil } - b.c.ChannelMessageSend(channelID, msg.Username+msg.Text) + nick := config.GetNick(&msg, b.Config) + b.c.ChannelMessageSend(channelID, nick+msg.Text) return nil } diff --git a/bridge/gitter/gitter.go b/bridge/gitter/gitter.go index 95c41af4..5daf7773 100644 --- a/bridge/gitter/gitter.go +++ b/bridge/gitter/gitter.go @@ -105,8 +105,9 @@ func (b *Bgitter) Send(msg config.Message) error { flog.Errorf("Could not find roomID for %v", msg.Channel) return nil } + nick := config.GetNick(&msg, b.Config) // add ZWSP because gitter echoes our own messages - return b.c.SendMessage(roomID, msg.Username+msg.Text+" ​") + return b.c.SendMessage(roomID, nick+msg.Text+" ​") } func (b *Bgitter) getRoomID(channel string) string { diff --git a/bridge/irc/irc.go b/bridge/irc/irc.go index 30f27724..61b55dab 100644 --- a/bridge/irc/irc.go +++ b/bridge/irc/irc.go @@ -123,12 +123,13 @@ func (b *Birc) Send(msg config.Message) error { b.Command(&msg) return nil } + nick := config.GetNick(&msg, b.Config) for _, text := range strings.Split(msg.Text, "\n") { if len(b.Local) < b.Config.MessageQueue { if len(b.Local) == b.Config.MessageQueue-1 { text = text + " " } - b.Local <- config.Message{Text: text, Username: msg.Username, Channel: msg.Channel} + b.Local <- config.Message{Text: text, Username: nick, Channel: msg.Channel} } else { flog.Debugf("flooding, dropping message (queue at %d)", len(b.Local)) } diff --git a/bridge/mattermost/mattermost.go b/bridge/mattermost/mattermost.go index 62365792..7f7340b6 100644 --- a/bridge/mattermost/mattermost.go +++ b/bridge/mattermost/mattermost.go @@ -106,10 +106,10 @@ func (b *Bmattermost) Protocol() string { func (b *Bmattermost) Send(msg config.Message) error { flog.Debugf("Receiving %#v", msg) - return b.SendType(msg.Username, msg.Text, msg.Channel, "") -} + nick := config.GetNick(&msg, b.Config) + message := msg.Text + channel := msg.Channel -func (b *Bmattermost) SendType(nick string, message string, channel string, mtype string) error { if b.Config.PrefixMessagesWithNick { /*if IsMarkup(message) { message = nick + "\n\n" + message @@ -122,7 +122,7 @@ func (b *Bmattermost) SendType(nick string, message string, channel string, mtyp matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL} matterMessage.Channel = channel matterMessage.UserName = nick - matterMessage.Type = mtype + matterMessage.Type = "" matterMessage.Text = message err := b.mh.Send(matterMessage) if err != nil { diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go index 3b0a6c85..412c925b 100644 --- a/bridge/slack/slack.go +++ b/bridge/slack/slack.go @@ -94,13 +94,12 @@ func (b *Bslack) Origin() string { func (b *Bslack) Send(msg config.Message) error { flog.Debugf("Receiving %#v", msg) - if msg.FullOrigin != b.FullOrigin() { - return b.SendType(msg.Username, msg.Text, msg.Channel, "") + if msg.FullOrigin == b.FullOrigin() { + return nil } - return nil -} - -func (b *Bslack) SendType(nick string, message string, channel string, mtype string) error { + nick := config.GetNick(&msg, b.Config) + message := msg.Text + channel := msg.Channel if b.Config.PrefixMessagesWithNick { message = nick + " " + message } @@ -108,7 +107,7 @@ func (b *Bslack) SendType(nick string, message string, channel string, mtype str matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL} matterMessage.Channel = channel matterMessage.UserName = nick - matterMessage.Type = mtype + matterMessage.Type = "" matterMessage.Text = message err := b.mh.Send(matterMessage) if err != nil { @@ -121,8 +120,19 @@ func (b *Bslack) SendType(nick string, message string, channel string, mtype str if err != nil { return err } - newmsg := b.rtm.NewOutgoingMessage(message, schannel.ID) - b.rtm.SendMessage(newmsg) + np := slack.NewPostMessageParameters() + if b.Config.PrefixMessagesWithNick == true { + np.AsUser = true + } + np.Username = nick + np.IconURL = config.GetIconURL(&msg, b.Config) + b.sc.PostMessage(schannel.ID, message, np) + + /* + newmsg := b.rtm.NewOutgoingMessage(message, schannel.ID) + b.rtm.SendMessage(newmsg) + */ + return nil } diff --git a/bridge/xmpp/xmpp.go b/bridge/xmpp/xmpp.go index 164284e5..51237a08 100644 --- a/bridge/xmpp/xmpp.go +++ b/bridge/xmpp/xmpp.go @@ -71,7 +71,8 @@ func (b *Bxmpp) Origin() string { func (b *Bxmpp) Send(msg config.Message) error { flog.Debugf("Receiving %#v", msg) - b.xc.Send(xmpp.Chat{Type: "groupchat", Remote: msg.Channel + "@" + b.Config.Muc, Text: msg.Username + msg.Text}) + nick := config.GetNick(&msg, b.Config) + b.xc.Send(xmpp.Chat{Type: "groupchat", Remote: msg.Channel + "@" + b.Config.Muc, Text: nick + msg.Text}) return nil } diff --git a/gateway/gateway.go b/gateway/gateway.go index 7cf995b6..13b6be1b 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -117,7 +117,6 @@ func (gw *Gateway) handleMessage(msg config.Message, dest bridge.Bridge) { log.Debug("empty channel") return } - gw.modifyMessage(&msg, dest) log.Debugf("Sending %#v from %s (%s) to %s (%s)", msg, msg.FullOrigin, originchannel, dest.FullOrigin(), channel) err := dest.Send(msg) if err != nil { @@ -144,16 +143,9 @@ func (gw *Gateway) modifyMessage(msg *config.Message, dest bridge.Bridge) { if strings.ToLower(typeField.Name) == dest.Protocol() { // get the Protocol struct from the map protoCfg := val.Field(i).MapIndex(reflect.ValueOf(dest.Origin())) - setNickFormat(msg, protoCfg.Interface().(config.Protocol)) + //config.SetNickFormat(msg, protoCfg.Interface().(config.Protocol)) val.Field(i).SetMapIndex(reflect.ValueOf(dest.Origin()), protoCfg) break } } } - -func setNickFormat(msg *config.Message, cfg config.Protocol) { - format := cfg.RemoteNickFormat - msg.Username = strings.Replace(format, "{NICK}", msg.Username, -1) - msg.Username = strings.Replace(msg.Username, "{BRIDGE}", msg.Origin, -1) - msg.Username = strings.Replace(msg.Username, "{PROTOCOL}", msg.Protocol, -1) -} diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index f01a3b48..ed26ba9a 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -41,7 +41,7 @@ NickServPassword="secret" #The string "{NICK}" (case sensitive) will be replaced by the actual nick / username. #The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge #The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge -#OPTIONAL (default {BRIDGE}-{NICK}) +#OPTIONAL (default empty) RemoteNickFormat="[{PROTOCOL}] <{NICK}> " #Nicks you want to ignore. @@ -166,7 +166,7 @@ PrefixMessagesWithNick=false #The string "{NICK}" (case sensitive) will be replaced by the actual nick / username. #The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge #The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge -#OPTIONAL (default {BRIDGE}-{NICK}) +#OPTIONAL (default empty) RemoteNickFormat="[{PROTOCOL}] <{NICK}> " #how to format the list of IRC nicks when displayed in mattermost. @@ -205,7 +205,7 @@ IgnoreNicks="spammer1 spammer2" #The string "{NICK}" (case sensitive) will be replaced by the actual nick / username. #The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge #The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge -#OPTIONAL (default {BRIDGE}-{NICK}) +#OPTIONAL (default empty) RemoteNickFormat="[{PROTOCOL}] <{NICK}> " ################################################################### @@ -232,10 +232,6 @@ URL="https://hooks.slack.com/services/yourhook" #REQUIRED (unless useAPI=true) BindAddress="0.0.0.0:9999" -#Icon that will be showed in slack -#OPTIONAL -IconURL="http://youricon.png" - #### Settings for using slack API #OPTIONAL useAPI=false @@ -246,7 +242,14 @@ Token="yourslacktoken" #### Shared settings for webhooks and API -#Whether to prefix messages from other bridges to mattermost with the sender's nick. +#Icon that will be showed in slack +#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username. +#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge +#The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge +#OPTIONAL +IconURL="https://robohash.org/{NICK}.png?size=48x48" + +#Whether to prefix messages from other bridges to mattermost with RemoteNickFormat #Useful if username overrides for incoming webhooks isn't enabled on the #slack server. If you set PrefixMessagesWithNick to true, each message #from bridge to Slack will by default be prefixed by "bridge-" + nick. You can, @@ -257,8 +260,8 @@ PrefixMessagesWithNick=false #RemoteNickFormat defines how remote users appear on this bridge #The string "{NICK}" (case sensitive) will be replaced by the actual nick / username. #The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge -#OPTIONAL (default {BRIDGE}-{NICK}) #The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge +#OPTIONAL (default empty) RemoteNickFormat="[{PROTOCOL}] <{NICK}> " #how to format the list of IRC nicks when displayed in slack @@ -300,7 +303,7 @@ IgnoreNicks="spammer1 spammer2" #The string "{NICK}" (case sensitive) will be replaced by the actual nick / username. #The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge #The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge -#OPTIONAL (default {BRIDGE}-{NICK}) +#OPTIONAL (default empty) RemoteNickFormat="[{PROTOCOL}] <{NICK}> "