diff options
Diffstat (limited to 'matrix')
-rw-r--r-- | matrix/sync.go | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/matrix/sync.go b/matrix/sync.go index 750db3f..aec739b 100644 --- a/matrix/sync.go +++ b/matrix/sync.go @@ -20,6 +20,7 @@ package matrix import ( "encoding/json" + "fmt" "time" "maunium.net/go/mautrix" @@ -46,6 +47,41 @@ const ( EventSourceEphemeral ) +func (es EventSource) String() string { + if es == EventSourcePresence { + return "presence" + } else if es == EventSourceAccountData { + return "account data" + } else if es & EventSourceJoin != 0 { + es -= EventSourceJoin + switch es { + case EventSourceState: + return "joined state" + case EventSourceTimeline: + return "joined timeline" + case EventSourceEphemeral: + return "room ephemeral (joined)" + case EventSourceAccountData: + return "room account data (joined)" + } + } else if es & EventSourceInvite != 0 { + es -= EventSourceInvite + switch es { + case EventSourceState: + return "invited state" + } + } else if es & EventSourceLeave != 0 { + es -= EventSourceLeave + switch es { + case EventSourceState: + return "left state" + case EventSourceTimeline: + return "left timeline" + } + } + return fmt.Sprintf("unknown (%d)", es) +} + type EventHandler func(source EventSource, event *mautrix.Event) // GomuksSyncer is the default syncing implementation. You can either write your own syncer, or selectively @@ -120,7 +156,7 @@ func (s *GomuksSyncer) processSyncEvents(room *rooms.Room, events []*mautrix.Eve func (s *GomuksSyncer) processSyncEvent(room *rooms.Room, event *mautrix.Event, source EventSource) { if room != nil { event.RoomID = room.ID - if source&EventSourceState != 0 { + if source&EventSourceState != 0 || (source&EventSourceTimeline != 0 && event.Type.IsState() && event.StateKey != nil) { room.UpdateState(event) } } @@ -138,10 +174,11 @@ func (s *GomuksSyncer) OnEventType(eventType mautrix.EventType, callback EventHa } func (s *GomuksSyncer) notifyListeners(source EventSource, event *mautrix.Event) { - if event.Type.IsState() && source&EventSourceState == 0 || - event.Type.IsAccountData() && source&EventSourceAccountData == 0 || - event.Type.IsEphemeral() && source&EventSourceEphemeral == 0 { - debug.Printf("Event of type %s received from mismatching source %s: %v.", event.Type, source, event) + if (event.Type.IsState() && source&EventSourceState == 0 && event.StateKey == nil) || + (event.Type.IsAccountData() && source&EventSourceAccountData == 0) || + (event.Type.IsEphemeral() && source&EventSourceEphemeral == 0) { + evtJson, _ := json.Marshal(event) + debug.Printf("Event of type %s received from mismatching source %s: %s", event.Type.String(), source.String(), string(evtJson)) return } listeners, exists := s.listeners[event.Type] |