Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit aa87d50e77c0dc83710b1e2ea48154011c7e6ce4 Author: Wim <wim@42.be> Date: Sun Jul 30 17:48:23 2017 +0000 Add action support for slack,mattermost,irc,gitter,matrix,xmpp,discord. #199 diff --git a/bridge/config/config.go b/bridge/config/config.go index b390c72..c03a3ab 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -136 +137 @@ const (   EVENT_JOIN_LEAVE = "join_leave"   EVENT_FAILURE = "failure"   EVENT_REJOIN_CHANNELS = "rejoin_channels" + EVENT_USER_ACTION = "user_action"  )    type Message struct { diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index e2e2598..c74cf90 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -1169 +11616 @@ func (b *bdiscord) Send(msg config.Message) error {   }   if b.Config.WebhookURL == "" {   flog.Debugf("Broadcasting using token (API)") + if msg.Event == config.EVENT_USER_ACTION { + msg.Username = "_" + msg.Username + msg.Text = msg.Text + "_" + }   b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)   } else {   flog.Debugf("Broadcasting using Webhook") + if msg.Event == config.EVENT_USER_ACTION { + msg.Text = "_" + msg.Text + "_" + }   b.c.WebhookExecute(   b.webhookID,   b.webhookToken, @@ -17111 +17814 @@ func (b *bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat   text = m.ContentWithMentionsReplaced()   }   - channelName := b.getChannelName(m.ChannelID) + rmsg := config.Message{Account: b.Account, Avatar: "https://cdn.discordapp.com/avatars/" + m.Author.ID + "/" + m.Author.Avatar + ".jpg", + UserID: m.Author.ID} + + rmsg.Channel = b.getChannelName(m.ChannelID)   if b.UseChannelID { - channelName = "ID:" + m.ChannelID + rmsg.Channel = "ID:" + m.ChannelID   } - username := b.getNick(m.Author) + rmsg.Username = b.getNick(m.Author)     if b.Config.ShowEmbeds && m.Message.Embeds != nil {   for _, embed := range m.Message.Embeds { @@ -18810 +19814 @@ func (b *bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat   return   }   + text, ok := b.replaceAction(text) + if ok { + rmsg.Event = config.EVENT_USER_ACTION + } + + rmsg.Text = text   flog.Debugf("Sending message from %s on %s to gateway", m.Author.Username, b.Account) - b.Remote <- config.Message{Username: username, Text: text, Channel: channelName, - Account: b.Account, Avatar: "https://cdn.discordapp.com/avatars/" + m.Author.ID + "/" + m.Author.Avatar + ".jpg", - UserID: m.Author.ID} + b.Remote <- rmsg  }    func (b *bdiscord) memberUpdate(s *discordgo.Session, m *discordgo.GuildMemberUpdate) { @@ -2836 +29713 @@ func (b *bdiscord) replaceChannelMentions(text string) string {   return text  }   +func (b *bdiscord) replaceAction(text string) (string, bool) { + if strings.HasPrefix(text, "_") && strings.HasSuffix(text, "_") { + return strings.Replace(text, "_", "", -1), true + } + return text, false +} +  func (b *bdiscord) stripCustomoji(text string) string {   // <:doge:302803592035958784>   re := regexp.MustCompile("<(:.*?:)[0-9]+>") diff --git a/bridge/gitter/gitter.go b/bridge/gitter/gitter.go index 973a730..0b8667e 100644 --- a/bridge/gitter/gitter.go +++ b/bridge/gitter/gitter.go @@ -818 +8113 @@ func (b *Bgitter) JoinChannel(channel string) error {   // check for ZWSP to see if it's not an echo   if !strings.HasSuffix(ev.Message.Text, "​") {   flog.Debugf("Sending message from %s on %s to gateway", ev.Message.From.Username, b.Account) - b.Remote <- config.Message{Username: ev.Message.From.Username, Text: ev.Message.Text, Channel: room, + rmsg := config.Message{Username: ev.Message.From.Username, Text: ev.Message.Text, Channel: room,   Account: b.Account, Avatar: b.getAvatar(ev.Message.From.Username), UserID: ev.Message.From.ID} + if strings.HasPrefix(ev.Message.Text, "@"+ev.Message.From.Username) { + rmsg.Event = config.EVENT_USER_ACTION + rmsg.Text = strings.Replace(rmsg.Text, "@"+ev.Message.From.Username+" ", "", -1) + } + b.Remote <- rmsg   }   case *gitter.GitterConnectionClosed:   flog.Errorf("connection with gitter closed for room %s", room) diff --git a/bridge/irc/irc.go b/bridge/irc/irc.go index 86ed697..aa46a6f 100644 --- a/bridge/irc/irc.go +++ b/bridge/irc/irc.go @@ -1357 +1357 @@ func (b *Birc) Send(msg config.Message) error {   if len(b.Local) == b.Config.MessageQueue-1 {   text = text + " <message clipped>"   } - b.Local <- config.Message{Text: text, Username: msg.Username, Channel: msg.Channel} + b.Local <- config.Message{Text: text, Username: msg.Username, Channel: msg.Channel, Event: msg.Event}   } else {   flog.Debugf("flooding, dropping message (queue at %d)", len(b.Local))   } @@ -1487 +14811 @@ func (b *Birc) doSend() {   throttle := time.NewTicker(rate)   for msg := range b.Local {   <-throttle.C - b.i.Privmsg(msg.Channel, msg.Username+msg.Text) + if msg.Event == config.EVENT_USER_ACTION { + b.i.Action(msg.Channel, msg.Username+msg.Text) + } else { + b.i.Privmsg(msg.Channel, msg.Username+msg.Text) + }   }  }   @@ -24410 +24812 @@ func (b *Birc) handlePrivMsg(event *irc.Event) {   if event.Nick == b.Nick {   return   } + rmsg := config.Message{Username: event.Nick, Channel: event.Arguments[0], Account: b.Account, UserID: event.User + "@" + event.Host}   flog.Debugf("handlePrivMsg() %s %s %#v", event.Nick, event.Message(), event)   msg := ""   if event.Code == "CTCP_ACTION" { - msg = event.Nick + " " + // msg = event.Nick + " " + rmsg.Event = config.EVENT_USER_ACTION   }   msg += event.Message()   // strip IRC colors @@ -2767 +2828 @@ func (b *Birc) handlePrivMsg(event *irc.Event) {   msg = string(output)     flog.Debugf("Sending message from %s on %s to gateway", event.Arguments[0], b.Account) - b.Remote <- config.Message{Username: event.Nick, Text: msg, Channel: event.Arguments[0], Account: b.Account, UserID: event.User + "@" + event.Host} + rmsg.Text = msg + b.Remote <- rmsg  }    func (b *Birc) handleTopicWhoTime(event *irc.Event) { diff --git a/bridge/matrix/matrix.go b/bridge/matrix/matrix.go index 2fd91b3..0635985 100644 --- a/bridge/matrix/matrix.go +++ b/bridge/matrix/matrix.go @@ -786 +7811 @@ func (b *Bmatrix) Send(msg config.Message) error {   flog.Debugf("Receiving %#v", msg)   channel := b.getRoomID(msg.Channel)   flog.Debugf("Sending to channel %s", channel) + if msg.Event == config.EVENT_USER_ACTION { + b.mc.SendMessageEvent(channel, "m.room.message", + matrix.TextMessage{"m.emote", msg.Username + msg.Text}) + return nil + }   b.mc.SendText(channel, msg.Username+msg.Text)   return nil  } @@ -957 +1007 @@ func (b *Bmatrix) getRoomID(channel string) string {  func (b *Bmatrix) handlematrix() error {   syncer := b.mc.Syncer.(*matrix.DefaultSyncer)   syncer.OnEventType("m.room.message", func(ev *matrix.Event) { - if ev.Content["msgtype"].(string) == "m.text" && ev.Sender != b.UserID { + if (ev.Content["msgtype"].(string) == "m.text" || ev.Content["msgtype"].(string) == "m.emote") && ev.Sender != b.UserID {   b.RLock()   channel, ok := b.RoomMap[ev.RoomID]   b.RUnlock() @@ -1088 +11312 @@ func (b *Bmatrix) handlematrix() error {   re := regexp.MustCompile("(.*?):.*")   username = re.ReplaceAllString(username, `$1`)   } + rmsg := config.Message{Username: username, Text: ev.Content["body"].(string), Channel: channel, Account: b.Account, UserID: ev.Sender} + if ev.Content["msgtype"].(string) == "m.emote" { + rmsg.Event = config.EVENT_USER_ACTION + }   flog.Debugf("Sending message from %s on %s to gateway", ev.Sender, b.Account) - b.Remote <- config.Message{Username: username, Text: ev.Content["body"].(string), Channel: channel, Account: b.Account, UserID: ev.Sender} + b.Remote <- rmsg   }   flog.Debugf("Received: %#v", ev)   }) diff --git a/bridge/mattermost/mattermost.go b/bridge/mattermost/mattermost.go index 67dc7b5..7e3e7e2 100644 --- a/bridge/mattermost/mattermost.go +++ b/bridge/mattermost/mattermost.go @@ -66 +67 @@ import (   "github.com/42wim/matterbridge/matterclient"   "github.com/42wim/matterbridge/matterhook"   log "github.com/Sirupsen/logrus" + "strings"  )    type MMhook struct { @@ -1176 +1189 @@ func (b *Bmattermost) JoinChannel(channel string) error {    func (b *Bmattermost) Send(msg config.Message) error {   flog.Debugf("Receiving %#v", msg) + if msg.Event == config.EVENT_USER_ACTION { + msg.Text = "*" + msg.Text + "*" + }   nick := msg.Username   message := msg.Text   channel := msg.Channel @@ -1528 +15614 @@ func (b *Bmattermost) handleMatter() {   go b.handleMatterClient(mchan)   }   for message := range mchan { + rmsg := config.Message{Username: message.Username, Channel: message.Channel, Account: b.Account, UserID: message.UserID} + text, ok := b.replaceAction(message.Text) + if ok { + rmsg.Event = config.EVENT_USER_ACTION + } + rmsg.Text = text   flog.Debugf("Sending message from %s on %s to gateway", message.Username, b.Account) - b.Remote <- config.Message{Text: message.Text, Username: message.Username, Channel: message.Channel, Account: b.Account, UserID: message.UserID} + b.Remote <- rmsg   }  }   @@ -2263 +23610 @@ func (b *Bmattermost) apiLogin() error {   go b.mc.StatusLoop()   return nil  } + +func (b *Bmattermost) replaceAction(text string) (string, bool) { + if strings.HasPrefix(text, "*") && strings.HasSuffix(text, "*") { + return strings.Replace(text, "*", "", -1), true + } + return text, false +} diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go index 6617f82..4c72a90 100644 --- a/bridge/slack/slack.go +++ b/bridge/slack/slack.go @@ -1276 +1279 @@ func (b *Bslack) JoinChannel(channel string) error {    func (b *Bslack) Send(msg config.Message) error {   flog.Debugf("Receiving %#v", msg) + if msg.Event == config.EVENT_USER_ACTION { + msg.Text = "_" + msg.Text + "_" + }   nick := msg.Username   message := msg.Text   channel := msg.Channel @@ -2316 +2349 @@ func (b *Bslack) handleSlack() {   text = html.UnescapeString(text)   flog.Debugf("Sending message from %s on %s to gateway", message.Username, b.Account)   msg := config.Message{Text: text, Username: message.Username, Channel: message.Channel, Account: b.Account, Avatar: b.getAvatar(message.Username), UserID: message.UserID} + if message.Raw.SubType == "me_message" { + msg.Event = config.EVENT_USER_ACTION + }   b.Remote <- msg   }   } diff --git a/bridge/telegram/telegram.go b/bridge/telegram/telegram.go index ce43b34..4bfbf50 100644 --- a/bridge/telegram/telegram.go +++ b/bridge/telegram/telegram.go @@ -776 +777 @@ func (b *Btelegram) Send(msg config.Message) error {    func (b *Btelegram) handleRecv(updates <-chan tgbotapi.Update) {   for update := range updates { + flog.Debugf("Receiving from telegram: %#v", update.Message)   var message *tgbotapi.Message   username := ""   channel := "" diff --git a/bridge/xmpp/xmpp.go b/bridge/xmpp/xmpp.go index 504b974..dfc2967 100644 --- a/bridge/xmpp/xmpp.go +++ b/bridge/xmpp/xmpp.go @@ -1336 +1337 @@ func (b *Bxmpp) xmppKeepAlive() chan bool {  }    func (b *Bxmpp) handleXmpp() error { + var ok bool   done := b.xmppKeepAlive()   defer close(done)   nodelay := time.Time{} @@ -1548 +15513 @@ func (b *Bxmpp) handleXmpp() error {   nick = s[1]   }   if nick != b.Config.Nick && v.Stamp == nodelay && v.Text != "" { + rmsg := config.Message{Username: nick, Text: v.Text, Channel: channel, Account: b.Account, UserID: v.Remote} + rmsg.Text, ok = b.replaceAction(rmsg.Text) + if ok { + rmsg.Event = config.EVENT_USER_ACTION + }   flog.Debugf("Sending message from %s on %s to gateway", nick, b.Account) - b.Remote <- config.Message{Username: nick, Text: v.Text, Channel: channel, Account: b.Account, UserID: v.Remote} + b.Remote <- rmsg   }   }   case xmpp.Presence: @@ -1633 +16910 @@ func (b *Bxmpp) handleXmpp() error {   }   }  } + +func (b *Bxmpp) replaceAction(text string) (string, bool) { + if strings.HasPrefix(text, "/me ") { + return strings.Replace(text, "/me ", "", -1), true + } + return text, false +}