diff --git a/README.md b/README.md index a17f1b5c..5875f1ff 100644 --- a/README.md +++ b/README.md @@ -56,8 +56,6 @@ SkipTLSVerify=true nick="matterbot" channel="#matterbridge" UseSlackCircumfix=false -#whether to prefix messages from IRC to mattermost with the sender's nick. Useful if username overrides for incoming webhooks isn't enabled on the mattermost server -PrefixMessagesWithNick=false [mattermost] #url is your incoming webhook url (account settings - integrations - incoming webhooks) @@ -72,6 +70,12 @@ showjoinpart=true #show irc users joining and parting token=yourtokenfrommattermost #disable certificate checking (selfsigned certificates) #SkipTLSVerify=true +#whether to prefix messages from IRC to mattermost with the sender's nick. Useful if username overrides for incoming webhooks isn't enabled on the mattermost server +PrefixMessagesWithNick=false +#how to format the list of IRC nicks when displayed in mattermost. Possible options are "table" and "plain" +NickFormatter=plain +#how many nicks to list per row for formatters that support this +NicksPerRow=4 #multiple channel config #token you can find in your outgoing webhook diff --git a/config.go b/config.go index d0bf8044..e3fba6c9 100644 --- a/config.go +++ b/config.go @@ -8,25 +8,27 @@ import ( type Config struct { IRC struct { - UseTLS bool - SkipTLSVerify bool - Server string - Port int - Nick string - Password string - Channel string - UseSlackCircumfix bool - PrefixMessagesWithNick bool + UseTLS bool + SkipTLSVerify bool + Server string + Port int + Nick string + Password string + Channel string + UseSlackCircumfix bool } Mattermost struct { - URL string - Port int - ShowJoinPart bool - Token string - IconURL string - SkipTLSVerify bool - BindAddress string - Channel string + URL string + Port int + ShowJoinPart bool + Token string + IconURL string + SkipTLSVerify bool + BindAddress string + Channel string + PrefixMessagesWithNick bool + NicksPerRow int + NickFormatter string } Token map[string]*struct { IRCChannel string diff --git a/matterbridge.conf.sample b/matterbridge.conf.sample index 843402e0..0420a1c7 100644 --- a/matterbridge.conf.sample +++ b/matterbridge.conf.sample @@ -6,7 +6,6 @@ SkipTLSVerify=true nick="matterbot" channel="#matterbridge" UseSlackCircumfix=false -PrefixMessagesWithNick=false [mattermost] url="http://yourdomain/hooks/yourhookkey" @@ -17,6 +16,9 @@ token=yourtokenfrommattermost IconURL="http://youricon.png" #SkipTLSVerify=true #BindAddress="0.0.0.0" +PrefixMessagesWithNick=false +NickFormatter=plain +NicksPerRow=4 [general] GiphyAPIKey=dc6zaTOxFJmzC diff --git a/matterbridge.go b/matterbridge.go index 4302cf17..4ca90dcf 100644 --- a/matterbridge.go +++ b/matterbridge.go @@ -58,7 +58,7 @@ func (b *Bridge) createIRC(name string) *irc.Connection { i.AddCallback("JOIN", b.handleJoinPart) i.AddCallback("PART", b.handleJoinPart) } - //i.AddCallback("353", b.handleOther) + i.AddCallback("*", b.handleOther) return i } @@ -76,11 +76,53 @@ func (b *Bridge) handleJoinPart(event *irc.Event) { //b.SendType(b.Config.IRC.Nick, "irc-"+event.Nick+" "+strings.ToLower(event.Code)+"s "+event.Message(), b.getMMChannel(event.Arguments[0]), "join_leave") } +func tableformatter (nicks_s string, nicksPerRow int) string { + nicks := strings.Split(nicks_s, " ") + result := "|IRC users" + if nicksPerRow < 1 { + nicksPerRow = 4 + } + for i := 0; i < 2; i++ { + for j := 1; j <= nicksPerRow && j <= len(nicks); j++ { + if i == 0 { + result += "|" + } else { + result += ":-|" + } + } + result += "\r\n|" + } + result += nicks[0] + "|" + for i := 1; i < len(nicks); i++ { + if i % nicksPerRow == 0 { + result += "\r\n|" + nicks[i] + "|" + } else { + result += nicks[i] + "|" + } + } + return result +} + +func plainformatter (nicks string, nicksPerRow int) string { + return nicks + " currently on IRC" +} + +func (b *Bridge) formatnicks (nicks string) string { + switch (b.Config.Mattermost.NickFormatter) { + case "table": + return tableformatter(nicks, b.Config.Mattermost.NicksPerRow) + default: + return plainformatter(nicks, b.Config.Mattermost.NicksPerRow) + } +} + func (b *Bridge) handleOther(event *irc.Event) { switch event.Code { case "353": log.Println("handleOther", b.getMMChannel(event.Arguments[0])) - b.Send(b.Config.IRC.Nick, event.Message()+" currently on IRC", b.getMMChannel(event.Arguments[0])) + b.Send(b.Config.IRC.Nick, b.formatnicks(event.Message()), b.getMMChannel(event.Arguments[0])) + default: + log.Printf("got unknown event: %+v\n", event); } } @@ -88,13 +130,32 @@ func (b *Bridge) Send(nick string, message string, channel string) error { return b.SendType(nick, message, channel, "") } +func IsMarkup(message string) bool { + switch (message[0]) { + case '|': fallthrough + case '#': fallthrough + case '_': fallthrough + case '*': fallthrough + case '~': fallthrough + case '-': fallthrough + case ':': fallthrough + case '>': fallthrough + case '=': return true + } + return false +} + func (b *Bridge) SendType(nick string, message string, channel string, mtype string) error { matterMessage := matterhook.OMessage{IconURL: b.Config.Mattermost.IconURL} matterMessage.Channel = channel matterMessage.UserName = nick matterMessage.Type = mtype - if (b.Config.IRC.PrefixMessagesWithNick) { - matterMessage.Text = nick + ": " + message + if b.Config.Mattermost.PrefixMessagesWithNick { + if IsMarkup(message) { + matterMessage.Text = nick + ":\n\n" + message + } else { + matterMessage.Text = nick + ": " + message + } } else { matterMessage.Text = message } @@ -119,9 +180,11 @@ func (b *Bridge) handleMatter() { case "!users": log.Println("received !users from", message.UserName) b.i.SendRaw("NAMES " + b.getIRCChannel(message.Token)) + return case "!gif": message.Text = b.giphyRandom(strings.Fields(strings.Replace(message.Text, "!gif ", "", 1))) b.Send(b.Config.IRC.Nick, message.Text, b.getIRCChannel(message.Token)) + return } texts := strings.Split(message.Text, "\n") for _, text := range texts {