Merge pull request #21 from matrix-org/rxl881/leaveEvents

Handle leave events
This commit is contained in:
Richard Lewis 2017-04-20 21:36:33 +01:00 committed by GitHub
commit 58a74a618e
4 changed files with 29 additions and 9 deletions

View File

@ -7,13 +7,13 @@ import (
// Event represents a single Matrix event. // Event represents a single Matrix event.
type Event struct { type Event struct {
StateKey string `json:"state_key"` // The state key for the event. Only present on State Events. StateKey *string `json:"state_key,omitempty"` // The state key for the event. Only present on State Events.
Sender string `json:"sender"` // The user ID of the sender of the event Sender string `json:"sender"` // The user ID of the sender of the event
Type string `json:"type"` // The event type Type string `json:"type"` // The event type
Timestamp int `json:"origin_server_ts"` // The unix timestamp when this message was sent by the origin server Timestamp int `json:"origin_server_ts"` // The unix timestamp when this message was sent by the origin server
ID string `json:"event_id"` // The unique ID of this event ID string `json:"event_id"` // The unique ID of this event
RoomID string `json:"room_id"` // The room the event was sent to. May be nil (e.g. for presence) RoomID string `json:"room_id"` // The room the event was sent to. May be nil (e.g. for presence)
Content map[string]interface{} `json:"content"` // The JSON content of the event. Content map[string]interface{} `json:"content"` // The JSON content of the event.
} }
// Body returns the value of the "body" key in the event content if it is // Body returns the value of the "body" key in the event content if it is

View File

@ -125,6 +125,16 @@ type RespSync struct {
Events []Event `json:"events"` Events []Event `json:"events"`
} `json:"presence"` } `json:"presence"`
Rooms struct { Rooms struct {
Leave map[string]struct {
State struct {
Events []Event `json:"events"`
} `json:"state"`
Timeline struct {
Events []Event `json:"events"`
Limited bool `json:"limited"`
PrevBatch string `json:"prev_batch"`
} `json:"timeline"`
} `json:"leave"`
Join map[string]struct { Join map[string]struct {
State struct { State struct {
Events []Event `json:"events"` Events []Event `json:"events"`

View File

@ -13,7 +13,7 @@ func (room Room) UpdateState(event *Event) {
if !exists { if !exists {
room.State[event.Type] = make(map[string]*Event) room.State[event.Type] = make(map[string]*Event)
} }
room.State[event.Type][event.StateKey] = event room.State[event.Type][*event.StateKey] = event
} }
// GetStateEvent returns the state event for the given type/state_key combo, or nil. // GetStateEvent returns the state event for the given type/state_key combo, or nil.

12
sync.go
View File

@ -73,6 +73,16 @@ func (s *DefaultSyncer) ProcessResponse(res *RespSync, since string) (err error)
s.notifyListeners(&event) s.notifyListeners(&event)
} }
} }
for roomID, roomData := range res.Rooms.Leave {
room := s.getOrCreateRoom(roomID)
for _, event := range roomData.Timeline.Events {
if event.StateKey != nil {
event.RoomID = roomID
room.UpdateState(&event)
s.notifyListeners(&event)
}
}
}
return return
} }
@ -102,7 +112,7 @@ func (s *DefaultSyncer) shouldProcessResponse(resp *RespSync, since string) bool
for roomID, roomData := range resp.Rooms.Join { for roomID, roomData := range resp.Rooms.Join {
for i := len(roomData.Timeline.Events) - 1; i >= 0; i-- { for i := len(roomData.Timeline.Events) - 1; i >= 0; i-- {
e := roomData.Timeline.Events[i] e := roomData.Timeline.Events[i]
if e.Type == "m.room.member" && e.StateKey == s.UserID { if e.Type == "m.room.member" && e.StateKey != nil && *e.StateKey == s.UserID {
m := e.Content["membership"] m := e.Content["membership"]
mship, ok := m.(string) mship, ok := m.(string)
if !ok { if !ok {