From 53aa0765554a899ba57acd4cb7086b4e69fe8ac8 Mon Sep 17 00:00:00 2001 From: Wim Date: Sat, 2 Mar 2019 22:58:14 +0100 Subject: [PATCH] Do not send duplicate messages (rocketchat). Fixes #745 (#752) For an unknown reason we get duplicate messages (from the same channel) using the realtime API when we have > 1 channel subscribed on. Solution for now is caching the message ID in a LRU cache and ignoring the duplicates. This should be reviewed when we have actual editing support from the realtime API --- bridge/rocketchat/handlers.go | 5 +++++ bridge/rocketchat/rocketchat.go | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/bridge/rocketchat/handlers.go b/bridge/rocketchat/handlers.go index b44ea46f..a41004d4 100644 --- a/bridge/rocketchat/handlers.go +++ b/bridge/rocketchat/handlers.go @@ -40,6 +40,11 @@ func (b *Brocketchat) handleRocketHook(messages chan *config.Message) { func (b *Brocketchat) handleRocketClient(messages chan *config.Message) { for message := range b.messageChan { + // skip messages with same ID, apparently messages get duplicated for an unknown reason + if _, ok := b.cache.Get(message.ID); ok { + continue + } + b.cache.Add(message.ID, true) b.Log.Debugf("message %#v", message) m := message if b.skipMessage(&m) { diff --git a/bridge/rocketchat/rocketchat.go b/bridge/rocketchat/rocketchat.go index 82b6627d..dac05644 100644 --- a/bridge/rocketchat/rocketchat.go +++ b/bridge/rocketchat/rocketchat.go @@ -9,16 +9,18 @@ import ( "github.com/42wim/matterbridge/bridge/helper" "github.com/42wim/matterbridge/hook/rockethook" "github.com/42wim/matterbridge/matterhook" + lru "github.com/hashicorp/golang-lru" "github.com/matterbridge/Rocket.Chat.Go.SDK/models" "github.com/matterbridge/Rocket.Chat.Go.SDK/realtime" "github.com/matterbridge/Rocket.Chat.Go.SDK/rest" ) type Brocketchat struct { - mh *matterhook.Client - rh *rockethook.Client - c *realtime.Client - r *rest.Client + mh *matterhook.Client + rh *rockethook.Client + c *realtime.Client + r *rest.Client + cache *lru.Cache *bridge.Config messageChan chan models.Message channelMap map[string]string @@ -27,9 +29,16 @@ type Brocketchat struct { } func New(cfg *bridge.Config) bridge.Bridger { - b := &Brocketchat{Config: cfg} - b.messageChan = make(chan models.Message) - b.channelMap = make(map[string]string) + newCache, err := lru.New(100) + if err != nil { + cfg.Log.Fatalf("Could not create LRU cache for rocketchat bridge: %v", err) + } + b := &Brocketchat{ + Config: cfg, + messageChan: make(chan models.Message), + channelMap: make(map[string]string), + cache: newCache, + } b.Log.Debugf("enabling rocketchat") return b }