From 945c48eb47296c2ca1a30776f80533abbc8c0f78 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Thu, 14 Jun 2018 16:29:46 +0100 Subject: [PATCH] Prevent duplicate events from being sent... * Strip event content if it doesn't contain anything Signed-off-by: Andrew Morgan --- .../matrix-org/dendrite/appservice/appservice.go | 4 ++-- .../dendrite/appservice/consumers/roomserver.go | 4 ++++ .../appservice/storage/appservice_events_table.go | 8 +++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/github.com/matrix-org/dendrite/appservice/appservice.go b/src/github.com/matrix-org/dendrite/appservice/appservice.go index 23474b60a..fa00d5256 100644 --- a/src/github.com/matrix-org/dendrite/appservice/appservice.go +++ b/src/github.com/matrix-org/dendrite/appservice/appservice.go @@ -50,7 +50,7 @@ func SetupAppServiceAPIComponent( // a sync.Cond object that can be used to notify workers when there are new // events to be sent out. workerStates := make([]types.ApplicationServiceWorkerState, len(base.Cfg.Derived.ApplicationServices)) - for _, appservice := range base.Cfg.Derived.ApplicationServices { + for i, appservice := range base.Cfg.Derived.ApplicationServices { eventCount := 0 m := sync.Mutex{} @@ -59,7 +59,7 @@ func SetupAppServiceAPIComponent( Cond: sync.NewCond(&m), EventsReady: &eventCount, } - workerStates = append(workerStates, ws) + workerStates[i] = ws } consumer := consumers.NewOutputRoomEventConsumer( diff --git a/src/github.com/matrix-org/dendrite/appservice/consumers/roomserver.go b/src/github.com/matrix-org/dendrite/appservice/consumers/roomserver.go index 6403e6030..817d0214d 100644 --- a/src/github.com/matrix-org/dendrite/appservice/consumers/roomserver.go +++ b/src/github.com/matrix-org/dendrite/appservice/consumers/roomserver.go @@ -116,6 +116,10 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error { } // Check if any events need to passed on to external application services + if len(events) > 0 { + // Check if this was a membership event + return s.filterRoomserverEvents(ctx, events) + } return s.filterRoomserverEvents(ctx, append(events, ev)) } diff --git a/src/github.com/matrix-org/dendrite/appservice/storage/appservice_events_table.go b/src/github.com/matrix-org/dendrite/appservice/storage/appservice_events_table.go index 39f55e48a..cbe2cba02 100644 --- a/src/github.com/matrix-org/dendrite/appservice/storage/appservice_events_table.go +++ b/src/github.com/matrix-org/dendrite/appservice/storage/appservice_events_table.go @@ -210,6 +210,12 @@ func (s *eventsStatements) insertEvent( appServiceID string, event *gomatrixserverlib.Event, ) (err error) { + // If event has no content, strip the json + content := event.Content() + if string(content) == "{\"disable\":true}" { + content = []byte("{}") + } + _, err = s.insertEventStmt.ExecContext( ctx, appServiceID, @@ -218,7 +224,7 @@ func (s *eventsStatements) insertEvent( event.RoomID(), event.Type(), event.Sender(), - event.Content(), + content, -1, // No transaction ID yet ) return