summaryrefslogtreecommitdiffstats
path: root/bridge/xmpp/xmpp.go
diff options
context:
space:
mode:
authorValdikSS <iam@valdikss.org.ru>2018-05-30 00:29:51 +0300
committerWim <wim@42.be>2018-05-29 23:29:51 +0200
commit91db63294ced789fbcd73cad07b592ec03812f1f (patch)
tree19a5c8736d55c87cb41147a302b3ac6d62dbf28d /bridge/xmpp/xmpp.go
parentfd04e08c9c99d5bc2e819c4679ff419aea8a3b71 (diff)
downloadmatterbridge-msglm-91db63294ced789fbcd73cad07b592ec03812f1f.tar.gz
matterbridge-msglm-91db63294ced789fbcd73cad07b592ec03812f1f.tar.bz2
matterbridge-msglm-91db63294ced789fbcd73cad07b592ec03812f1f.zip
Add message correction support for XMPP (#437)
It works worse than it could be, since message correction in XMPP works differently compared to other messengers. XMPP replaces old message with old ID with new message with new ID. Matterbridge remembers only old ID, that's why you can edit a message from XMPP to the gateway only once. Edited messages from other networks to XMPP are handled correctly though.
Diffstat (limited to 'bridge/xmpp/xmpp.go')
-rw-r--r--bridge/xmpp/xmpp.go20
1 files changed, 17 insertions, 3 deletions
diff --git a/bridge/xmpp/xmpp.go b/bridge/xmpp/xmpp.go
index 8a066751..cb0da1b2 100644
--- a/bridge/xmpp/xmpp.go
+++ b/bridge/xmpp/xmpp.go
@@ -6,6 +6,7 @@ import (
"github.com/42wim/matterbridge/bridge/config"
"github.com/42wim/matterbridge/bridge/helper"
"github.com/jpillora/backoff"
+ "github.com/rs/xid"
"github.com/matterbridge/go-xmpp"
"strings"
"time"
@@ -68,6 +69,8 @@ func (b *Bxmpp) JoinChannel(channel config.ChannelInfo) error {
}
func (b *Bxmpp) Send(msg config.Message) (string, error) {
+ var msgid = ""
+ var msgreplaceid = ""
// ignore delete messages
if msg.Event == config.EVENT_MSG_DELETE {
return "", nil
@@ -84,12 +87,17 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
}
}
+ msgid = xid.New().String()
+ if msg.ID != "" {
+ msgid = msg.ID
+ msgreplaceid = msg.ID
+ }
// Post normal message
- _, err := b.xc.Send(xmpp.Chat{Type: "groupchat", Remote: msg.Channel + "@" + b.GetString("Muc"), Text: msg.Username + msg.Text})
+ _, err := b.xc.Send(xmpp.Chat{Type: "groupchat", Remote: msg.Channel + "@" + b.GetString("Muc"), Text: msg.Username + msg.Text, ID: msgid, ReplaceID: msgreplaceid})
if err != nil {
return "", err
}
- return "", nil
+ return msgid, nil
}
func (b *Bxmpp) createXMPP() (*xmpp.Client, error) {
@@ -139,6 +147,7 @@ func (b *Bxmpp) xmppKeepAlive() chan bool {
func (b *Bxmpp) handleXMPP() error {
var ok bool
+ var msgid string
done := b.xmppKeepAlive()
defer close(done)
for {
@@ -154,7 +163,11 @@ func (b *Bxmpp) handleXMPP() error {
if b.skipMessage(v) {
continue
}
- rmsg := config.Message{Username: b.parseNick(v.Remote), Text: v.Text, Channel: b.parseChannel(v.Remote), Account: b.Account, UserID: v.Remote}
+ msgid = v.ID
+ if v.ReplaceID != "" {
+ msgid = v.ReplaceID
+ }
+ rmsg := config.Message{Username: b.parseNick(v.Remote), Text: v.Text, Channel: b.parseChannel(v.Remote), Account: b.Account, UserID: v.Remote, ID: msgid}
// check if we have an action event
rmsg.Text, ok = b.replaceAction(rmsg.Text)
@@ -181,6 +194,7 @@ func (b *Bxmpp) replaceAction(text string) (string, bool) {
// handleUploadFile handles native upload of files
func (b *Bxmpp) handleUploadFile(msg *config.Message) (string, error) {
var urldesc = ""
+
for _, f := range msg.Extra["file"] {
fi := f.(config.FileInfo)
if fi.Comment != "" {