From d97a76fcc338e7a532d0796ce5b12bdefb0a6f17 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 26 Feb 2020 16:51:15 +0100 Subject: Handle event IDs on xmpp; do not echo back messages --- connector/xmpp/xmpp.go | 8 +++++++- go.mod | 1 + go.sum | 2 ++ server.go | 4 ++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/connector/xmpp/xmpp.go b/connector/xmpp/xmpp.go index 1215a66..0573ddb 100644 --- a/connector/xmpp/xmpp.go +++ b/connector/xmpp/xmpp.go @@ -7,7 +7,8 @@ import ( "fmt" "strings" - gxmpp "github.com/mattn/go-xmpp" + gxmpp "github.com/matterbridge/go-xmpp" + "github.com/rs/xid" log "github.com/sirupsen/logrus" . "git.deuxfleurs.fr/Deuxfleurs/easybridge/connector" @@ -225,6 +226,7 @@ func (xm *XMPP) handleXMPP() error { if v.Type == "groupchat" && len(remote_sp) == 2 { event.Room = RoomID(remote_sp[0]) event.Author = UserID(remote_sp[1] + "@" + remote_sp[0]) + event.Id = v.ID xm.handler.Event(event) } } @@ -331,10 +333,14 @@ func (xm *XMPP) Send(event *Event) error { }) return err } else if len(event.Room) > 0 { + if event.Id == "" { + event.Id = xid.New().String() + } _, err := xm.conn.Send(gxmpp.Chat{ Type: "groupchat", Remote: string(event.Room), Text: event.Text, + ID: event.Id, }) return err } else { diff --git a/go.mod b/go.mod index c0f3f77..0cba426 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91 github.com/mattermost/mattermost-server v5.11.1+incompatible github.com/mattn/go-xmpp v0.0.0-20200128155807-a86b6abcb3ad + github.com/rs/xid v1.2.1 github.com/sirupsen/logrus v1.4.2 golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876 gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect diff --git a/go.sum b/go.sum index 22f0e27..b7eef24 100644 --- a/go.sum +++ b/go.sum @@ -115,6 +115,7 @@ github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20190210153444-cc9d05784d5d/go github.com/matterbridge/emoji v2.1.1-0.20191117213217-af507f6b02db+incompatible/go.mod h1:igE6rUAn3jai2wCdsjFHfhUoekjrFthoEjFObKKwSb4= github.com/matterbridge/go-xmpp v0.0.0-20180131083630-7ec2b8b7def6 h1:GDh7egrbDEzP41mScMt7Q/uPM2nJENh9LNFXjUOGts8= github.com/matterbridge/go-xmpp v0.0.0-20180131083630-7ec2b8b7def6/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q= +github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91 h1:KzDEcy8eDbTx881giW8a6llsAck3e2bJvMyKvh1IK+k= github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q= github.com/matterbridge/gomatrix v0.0.0-20191026211822-6fc7accd00ca/go.mod h1:+jWeaaUtXQbBRdKYWfjW6JDDYiI2XXE+3NnTjW5kg8g= github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18/go.mod h1:yAjnZ34DuDyPHMPHHjOsTk/FefW4JJjoMMCGt/8uuQA= @@ -169,6 +170,7 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= diff --git a/server.go b/server.go index 84a1e85..c61ad7f 100644 --- a/server.go +++ b/server.go @@ -105,6 +105,7 @@ func handleTxnEvent(e *mxlib.Event) error { ev := &connector.Event{ Type: connector.EVENT_MESSAGE, Text: e.Content["body"].(string), + Id: e.EventId, } typ := e.Content["msgtype"].(string) if typ == "m.emote" { @@ -129,6 +130,9 @@ func handleTxnEvent(e *mxlib.Event) error { return acct.Conn.Send(ev) } } else if room := dbIsPublicRoom(e.RoomId); room != nil { + cache_key := fmt.Sprintf("%s/event_seen/%s/%s", + room.Protocol, e.RoomId, ev.Id) + dbCachePut(cache_key, "yes") // If this is a regular room acct := FindJoinedAccount(e.Sender, room.Protocol, room.RoomID) if acct != nil { -- cgit v1.2.3