Thumbnail

rani/matterbridge.git

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

commit 58bbfa6fa1db833996ed56a4e58096d089c9f615 Author: Wim <wim@42.be> Date: Mon Sep 18 23:51:27 2017 +0000 Relay attachments from mattermost to slack (slack). Closes #260 diff --git a/bridge/config/config.go b/bridge/config/config.go index 812ce18..229cbef 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -296 +297 @@ type Message struct {   Gateway string `json:"gateway"`   Timestamp time.Time `json:"timestamp"`   ID string `json:"id"` + Extra []interface{}  }    type ChannelInfo struct { diff --git a/bridge/mattermost/mattermost.go b/bridge/mattermost/mattermost.go index 41a3f27..f9e350e 100644 --- a/bridge/mattermost/mattermost.go +++ b/bridge/mattermost/mattermost.go @@ -266 +267 @@ type MMMessage struct {   UserID string   ID string   Event string + Extra []interface{}  }    type Bmattermost struct { @@ -1957 +1967 @@ 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, ID: message.ID, Event: message.Event} + rmsg := config.Message{Username: message.Username, Channel: message.Channel, Account: b.Account, UserID: message.UserID, ID: message.ID, Event: message.Event, Extra: message.Extra}   text, ok := b.replaceAction(message.Text)   if ok {   rmsg.Event = config.EVENT_USER_ACTION @@ -22011 +22117 @@ func (b *Bmattermost) handleMatterClient(mchan chan *MMMessage) {   if (message.Raw.Event == "post_edited") && b.Config.EditDisable {   continue   } + + m := &MMMessage{} +   props := message.Post.Props   if props != nil {   if _, ok := props["override_username"].(string); ok {   message.Username = props["override_username"].(string)   } + if _, ok := props["attachments"].([]interface{}); ok { + m.Extra = props["attachments"].([]interface{}) + }   }   // do not post our own messages back to irc   // only listen to message from our team @@ -2357 +2426 @@ func (b *Bmattermost) handleMatterClient(mchan chan *MMMessage) {   continue   }   flog.Debugf("Receiving from matterclient %#v", message) - m := &MMMessage{}   m.UserID = message.UserID   m.Username = message.Username   m.Channel = message.Channel diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go index fa847db..2116311 100644 --- a/bridge/slack/slack.go +++ b/bridge/slack/slack.go @@ -1636 +1638 @@ func (b *Bslack) Send(msg config.Message) (string, error) {   np.IconURL = msg.Avatar   }   np.Attachments = append(np.Attachments, slack.Attachment{CallbackID: "matterbridge"}) + np.Attachments = append(np.Attachments, b.createAttach(msg.Extra)...) +   // replace mentions   np.LinkNames = 1   @@ -3893 +39128 @@ func (b *Bslack) replaceURL(text string) string {   }   return text  } + +func (b *Bslack) createAttach(extra []interface{}) []slack.Attachment { + var attachs []slack.Attachment + if extra != nil { + for _, v := range extra { + entry := v.(map[string]interface{}) + s := slack.Attachment{} + s.Fallback = entry["fallback"].(string) + s.Color = entry["color"].(string) + s.Pretext = entry["pretext"].(string) + s.AuthorName = entry["author_name"].(string) + s.AuthorLink = entry["author_link"].(string) + s.AuthorIcon = entry["author_icon"].(string) + s.Title = entry["title"].(string) + s.TitleLink = entry["title_link"].(string) + s.Text = entry["text"].(string) + s.ImageURL = entry["image_url"].(string) + s.ThumbURL = entry["thumb_url"].(string) + s.Footer = entry["footer"].(string) + s.FooterIcon = entry["footer_icon"].(string) + attachs = append(attachs, s) + } + } + return attachs +} diff --git a/gateway/gateway.go b/gateway/gateway.go index d09741f..7c1f3bd 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -1476 +14717 @@ func (gw *Gateway) getDestChannel(msg *config.Message, dest bridge.Bridge) []con    func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrMsgID {   var brMsgIDs []*BrMsgID + + // TODO refactor + // only slack now, check will have to be done in the different bridges. + // we need to check if we can't use fallback or text in other bridges + if msg.Extra != nil { + if dest.Protocol != "slack" { + if msg.Text == "" { + return brMsgIDs + } + } + }   // only relay join/part when configged   if msg.Event == config.EVENT_JOIN_LEAVE && !gw.Bridges[dest.Account].Config.ShowJoinPart {   return brMsgIDs @@ -1996 +21010 @@ func (gw *Gateway) ignoreMessage(msg *config.Message) bool {   return true   }   if msg.Text == "" { + // we have an attachment + if msg.Extra != nil { + return false + }   log.Debugf("ignoring empty message %#v from %s", msg, msg.Account)   return true   }