aboutsummaryrefslogtreecommitdiff
path: root/matrix/sync.go
diff options
context:
space:
mode:
authorTulir Asokan <tulir@maunium.net>2018-05-15 15:39:40 +0300
committerTulir Asokan <tulir@maunium.net>2018-05-15 17:55:08 +0300
commit2d642095723416be7dd552ff79ef31ef06ec6e34 (patch)
treee8b5bf0d5c9ae404b55ac5665dfc186add26fa51 /matrix/sync.go
parenteff910ff43e139ae4912bed2d53475314e8fc942 (diff)
Update state event handling
Diffstat (limited to 'matrix/sync.go')
-rw-r--r--matrix/sync.go44
1 files changed, 28 insertions, 16 deletions
diff --git a/matrix/sync.go b/matrix/sync.go
index 6ec31d4..93868c7 100644
--- a/matrix/sync.go
+++ b/matrix/sync.go
@@ -34,11 +34,14 @@ type SyncerSession interface {
type EventSource int
const (
- EventSourcePresence EventSource = iota
- EventSourceAccountData
+ EventSourcePresence EventSource = 1 << iota
EventSourceJoin
EventSourceInvite
EventSourceLeave
+ EventSourceAccountData
+ EventSourceTimeline
+ EventSourceState
+ EventSourceEphemeral
)
type EventHandler func(source EventSource, event *gomatrix.Event)
@@ -64,15 +67,15 @@ func NewGomuksSyncer(session SyncerSession) *GomuksSyncer {
// ProcessResponse processes a Matrix sync response.
func (s *GomuksSyncer) ProcessResponse(res *gomatrix.RespSync, since string) (err error) {
- s.processSyncEvents(nil, res.Presence.Events, EventSourcePresence, false, false)
- s.processSyncEvents(nil, res.AccountData.Events, EventSourceAccountData, false, false)
+ s.processSyncEvents(nil, res.Presence.Events, EventSourcePresence, false)
+ s.processSyncEvents(nil, res.AccountData.Events, EventSourceAccountData, false)
for roomID, roomData := range res.Rooms.Join {
room := s.Session.GetRoom(roomID)
- s.processSyncEvents(room, roomData.State.Events, EventSourceJoin, true, false)
- s.processSyncEvents(room, roomData.Timeline.Events, EventSourceJoin, false, false)
- s.processSyncEvents(room, roomData.Ephemeral.Events, EventSourceJoin, false, false)
- s.processSyncEvents(room, roomData.AccountData.Events, EventSourceJoin, false, false)
+ s.processSyncEvents(room, roomData.State.Events, EventSourceJoin | EventSourceState, false)
+ s.processSyncEvents(room, roomData.Timeline.Events, EventSourceJoin | EventSourceTimeline, false)
+ s.processSyncEvents(room, roomData.Ephemeral.Events, EventSourceJoin | EventSourceEphemeral, false)
+ s.processSyncEvents(room, roomData.AccountData.Events, EventSourceJoin | EventSourceAccountData, false)
if len(room.PrevBatch) == 0 {
room.PrevBatch = roomData.Timeline.PrevBatch
@@ -81,14 +84,14 @@ func (s *GomuksSyncer) ProcessResponse(res *gomatrix.RespSync, since string) (er
for roomID, roomData := range res.Rooms.Invite {
room := s.Session.GetRoom(roomID)
- s.processSyncEvents(room, roomData.State.Events, EventSourceInvite, true, false)
+ s.processSyncEvents(room, roomData.State.Events, EventSourceInvite | EventSourceState, false)
}
for roomID, roomData := range res.Rooms.Leave {
room := s.Session.GetRoom(roomID)
room.HasLeft = true
- s.processSyncEvents(room, roomData.State.Events, EventSourceLeave, true, true)
- s.processSyncEvents(room, roomData.Timeline.Events, EventSourceLeave, false, false)
+ s.processSyncEvents(room, roomData.State.Events, EventSourceLeave | EventSourceState, true)
+ s.processSyncEvents(room, roomData.Timeline.Events, EventSourceLeave | EventSourceTimeline, false)
if len(room.PrevBatch) == 0 {
room.PrevBatch = roomData.Timeline.PrevBatch
@@ -103,19 +106,28 @@ func (s *GomuksSyncer) ProcessResponse(res *gomatrix.RespSync, since string) (er
return
}
-func (s *GomuksSyncer) processSyncEvents(room *rooms.Room, events []*gomatrix.Event, source EventSource, isState bool, checkStateKey bool) {
+func (s *GomuksSyncer) processSyncEvents(room *rooms.Room, events []*gomatrix.Event, source EventSource, checkStateKey bool) {
for _, event := range events {
if !checkStateKey || event.StateKey != nil {
- s.processSyncEvent(room, event, source, isState)
+ s.processSyncEvent(room, event, source)
}
}
}
-func (s *GomuksSyncer) processSyncEvent(room *rooms.Room, event *gomatrix.Event, source EventSource, isState bool) {
+func isState(event *gomatrix.Event) bool {
+ switch event.Type {
+ case "m.room.member", "m.room.name", "m.room.topic", "m.room.aliases", "m.room.canonical_alias":
+ return true
+ default:
+ return false
+ }
+}
+
+func (s *GomuksSyncer) processSyncEvent(room *rooms.Room, event *gomatrix.Event, source EventSource) {
if room != nil {
event.RoomID = room.ID
}
- if isState {
+ if isState(event) {
room.UpdateState(event)
}
s.notifyListeners(source, event)
@@ -161,7 +173,7 @@ func (s *GomuksSyncer) GetFilterJSON(userID string) json.RawMessage {
},
},
Timeline: gomatrix.FilterPart{
- Types: []string{"m.room.message"},
+ Types: []string{"m.room.message", "m.room.member"},
Limit: 50,
},
Ephemeral: gomatrix.FilterPart{