|
@@ -840,7 +840,7 @@ class SyncHandler(object):
|
|
|
|
|
|
if since_token:
|
|
|
res = yield self._get_rooms_changed(sync_result_builder, ignored_users)
|
|
|
- room_entries, invited, newly_joined_rooms = res
|
|
|
+ room_entries, invited, newly_joined_rooms, newly_left_rooms = res
|
|
|
|
|
|
tags_by_room = yield self.store.get_updated_tags(
|
|
|
user_id, since_token.account_data_key,
|
|
@@ -848,6 +848,7 @@ class SyncHandler(object):
|
|
|
else:
|
|
|
res = yield self._get_all_rooms(sync_result_builder, ignored_users)
|
|
|
room_entries, invited, newly_joined_rooms = res
|
|
|
+ newly_left_rooms = []
|
|
|
|
|
|
tags_by_room = yield self.store.get_tags_for_user(user_id)
|
|
|
|
|
@@ -885,7 +886,13 @@ class SyncHandler(object):
|
|
|
newly_left_users.add(event.state_key)
|
|
|
|
|
|
newly_left_users -= newly_joined_users
|
|
|
- defer.returnValue((newly_joined_rooms, newly_joined_users, [], newly_left_users))
|
|
|
+
|
|
|
+ defer.returnValue((
|
|
|
+ newly_joined_rooms,
|
|
|
+ newly_joined_users,
|
|
|
+ newly_left_rooms,
|
|
|
+ newly_left_users,
|
|
|
+ ))
|
|
|
|
|
|
@defer.inlineCallbacks
|
|
|
def _have_rooms_changed(self, sync_result_builder):
|
|
@@ -955,6 +962,7 @@ class SyncHandler(object):
|
|
|
mem_change_events_by_room_id.setdefault(event.room_id, []).append(event)
|
|
|
|
|
|
newly_joined_rooms = []
|
|
|
+ newly_left_rooms = []
|
|
|
room_entries = []
|
|
|
invited = []
|
|
|
for room_id, events in mem_change_events_by_room_id.iteritems():
|
|
@@ -964,6 +972,7 @@ class SyncHandler(object):
|
|
|
# We want to figure out if we joined the room at some point since
|
|
|
# the last sync (even if we have since left). This is to make sure
|
|
|
# we do send down the room, and with full state, where necessary
|
|
|
+ old_state_ids = None
|
|
|
if room_id in joined_room_ids or has_join:
|
|
|
old_state_ids = yield self.get_state_at(room_id, since_token)
|
|
|
old_mem_ev_id = old_state_ids.get((EventTypes.Member, user_id), None)
|
|
@@ -981,6 +990,26 @@ class SyncHandler(object):
|
|
|
if not non_joins:
|
|
|
continue
|
|
|
|
|
|
+ # Check if we have left the room. This can either be because we were
|
|
|
+ # joined before *or* that we since joined and then left.
|
|
|
+ if events[-1].membership != Membership.JOIN:
|
|
|
+ if has_join:
|
|
|
+ newly_left_rooms.append(room_id)
|
|
|
+ else:
|
|
|
+ if not old_state_ids:
|
|
|
+ old_state_ids = yield self.get_state_at(room_id, since_token)
|
|
|
+ old_mem_ev_id = old_state_ids.get(
|
|
|
+ (EventTypes.Member, user_id),
|
|
|
+ None,
|
|
|
+ )
|
|
|
+ old_mem_ev = None
|
|
|
+ if old_mem_ev_id:
|
|
|
+ old_mem_ev = yield self.store.get_event(
|
|
|
+ old_mem_ev_id, allow_none=True
|
|
|
+ )
|
|
|
+ if old_mem_ev and old_mem_ev.membership == Membership.JOIN:
|
|
|
+ newly_left_rooms.append(room_id)
|
|
|
+
|
|
|
# Only bother if we're still currently invited
|
|
|
should_invite = non_joins[-1].membership == Membership.INVITE
|
|
|
if should_invite:
|
|
@@ -1058,7 +1087,7 @@ class SyncHandler(object):
|
|
|
upto_token=since_token,
|
|
|
))
|
|
|
|
|
|
- defer.returnValue((room_entries, invited, newly_joined_rooms))
|
|
|
+ defer.returnValue((room_entries, invited, newly_joined_rooms, newly_left_rooms))
|
|
|
|
|
|
@defer.inlineCallbacks
|
|
|
def _get_all_rooms(self, sync_result_builder, ignored_users):
|