summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bridge/config/config.go1
-rw-r--r--bridge/mattermost/mattermost.go10
-rw-r--r--bridge/slack/slack.go27
-rw-r--r--gateway/gateway.go15
4 files changed, 51 insertions, 2 deletions
diff --git a/bridge/config/config.go b/bridge/config/config.go
index 812ce18e..229cbef7 100644
--- a/bridge/config/config.go
+++ b/bridge/config/config.go
@@ -29,6 +29,7 @@ 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 41a3f273..f9e350e8 100644
--- a/bridge/mattermost/mattermost.go
+++ b/bridge/mattermost/mattermost.go
@@ -26,6 +26,7 @@ type MMMessage struct {
UserID string
ID string
Event string
+ Extra []interface{}
}
type Bmattermost struct {
@@ -195,7 +196,7 @@ 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
@@ -220,11 +221,17 @@ 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
@@ -235,7 +242,6 @@ 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 fa847db9..21163116 100644
--- a/bridge/slack/slack.go
+++ b/bridge/slack/slack.go
@@ -163,6 +163,8 @@ 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
@@ -389,3 +391,28 @@ 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 d09741fa..7c1f3bd9 100644
--- a/gateway/gateway.go
+++ b/gateway/gateway.go
@@ -147,6 +147,17 @@ 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
@@ -199,6 +210,10 @@ 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
}