Add mod_slack_webhook support to the XMPP bridge
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
package bxmpp
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -24,6 +27,8 @@ type Bxmpp struct {
|
||||
connected bool
|
||||
sync.RWMutex
|
||||
|
||||
webhookURL string
|
||||
|
||||
avatarAvailability map[string]bool
|
||||
avatarMap map[string]string
|
||||
}
|
||||
@@ -31,6 +36,7 @@ type Bxmpp struct {
|
||||
func New(cfg *bridge.Config) bridge.Bridger {
|
||||
return &Bxmpp{
|
||||
Config: cfg,
|
||||
webhookURL: cfg.GetString("WebhookUrl"),
|
||||
xmppMap: make(map[string]string),
|
||||
avatarAvailability: make(map[string]bool),
|
||||
avatarMap: make(map[string]string),
|
||||
@@ -86,14 +92,21 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
|
||||
}
|
||||
|
||||
// Upload a file (in XMPP case send the upload URL because XMPP has no native upload support).
|
||||
var err error
|
||||
if msg.Extra != nil {
|
||||
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
||||
b.Log.Debugf("=> Sending attachement message %#v", rmsg)
|
||||
if _, err := b.xc.Send(xmpp.Chat{
|
||||
Type: "groupchat",
|
||||
Remote: rmsg.Channel + "@" + b.GetString("Muc"),
|
||||
Text: rmsg.Username + rmsg.Text,
|
||||
}); err != nil {
|
||||
if b.webhookURL != "" {
|
||||
err = b.postSlackCompatibleWebhook(msg)
|
||||
} else {
|
||||
_, err = b.xc.Send(xmpp.Chat{
|
||||
Type: "groupchat",
|
||||
Remote: rmsg.Channel + "@" + b.GetString("Muc"),
|
||||
Text: rmsg.Username + rmsg.Text,
|
||||
})
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
b.Log.WithError(err).Error("Unable to send message with share URL.")
|
||||
}
|
||||
}
|
||||
@@ -102,13 +115,24 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
|
||||
}
|
||||
}
|
||||
|
||||
if b.webhookURL != "" {
|
||||
b.Log.Debugf("Sending message using Webhook")
|
||||
err := b.postSlackCompatibleWebhook(msg)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Failed to send message using webhook: %s", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
return msg.ID, nil
|
||||
}
|
||||
|
||||
// Post normal message.
|
||||
var msgReplaceID string
|
||||
msgID := xid.New().String()
|
||||
if msg.ID != "" {
|
||||
msgID = msg.ID
|
||||
msgReplaceID = msg.ID
|
||||
}
|
||||
// Post normal message.
|
||||
b.Log.Debugf("=> Sending message %#v", msg)
|
||||
if _, err := b.xc.Send(xmpp.Chat{
|
||||
Type: "groupchat",
|
||||
@@ -122,6 +146,25 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
|
||||
return msgID, nil
|
||||
}
|
||||
|
||||
func (b *Bxmpp) postSlackCompatibleWebhook(msg config.Message) error {
|
||||
type XMPPWebhook struct {
|
||||
Username string `json:"username"`
|
||||
Text string `json:"text"`
|
||||
}
|
||||
webhookBody, err := json.Marshal(XMPPWebhook{
|
||||
Username: msg.Username,
|
||||
Text: msg.Text,
|
||||
})
|
||||
if err != nil {
|
||||
b.Log.Errorf("Failed to marshal webhook: %s", err)
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := http.Post(b.webhookURL+"/"+msg.Channel, "application/json", bytes.NewReader(webhookBody))
|
||||
resp.Body.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
func (b *Bxmpp) createXMPP() error {
|
||||
if !strings.Contains(b.GetString("Jid"), "@") {
|
||||
return fmt.Errorf("the Jid %s doesn't contain an @", b.GetString("Jid"))
|
||||
@@ -378,6 +421,11 @@ func (b *Bxmpp) skipMessage(message xmpp.Chat) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// Ignore messages posted by our webhook
|
||||
if b.webhookURL != "" && strings.Contains(message.ID, "webhookbot") {
|
||||
return true
|
||||
}
|
||||
|
||||
// skip delayed messages
|
||||
return !message.Stamp.IsZero() && time.Since(message.Stamp).Minutes() > 5
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user