mirror of
				https://github.com/matrix-org/gomatrix
				synced 2025-11-04 06:18:05 +00:00 
			
		
		
		
	Merge pull request #21 from matrix-org/rxl881/leaveEvents
Handle leave events
This commit is contained in:
		
						commit
						58a74a618e
					
				
					 4 changed files with 29 additions and 9 deletions
				
			
		
							
								
								
									
										14
									
								
								events.go
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								events.go
									
										
									
									
									
								
							| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								responses.go
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								responses.go
									
										
									
									
									
								
							| 
						 | 
					@ -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"`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								room.go
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								room.go
									
										
									
									
									
								
							| 
						 | 
					@ -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
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								sync.go
									
										
									
									
									
								
							| 
						 | 
					@ -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 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue