|
|
|
@ -17,8 +17,8 @@ from ._base import BaseHandler |
|
|
|
|
|
|
|
|
|
from synapse.streams.config import PaginationConfig |
|
|
|
|
from synapse.api.constants import Membership, EventTypes |
|
|
|
|
from synapse.util import unwrapFirstError |
|
|
|
|
from synapse.util.logcontext import LoggingContext, preserve_fn |
|
|
|
|
from synapse.util.async import concurrently_execute |
|
|
|
|
from synapse.util.logcontext import LoggingContext |
|
|
|
|
from synapse.util.metrics import Measure |
|
|
|
|
from synapse.util.caches.response_cache import ResponseCache |
|
|
|
|
from synapse.push.clientformat import format_push_rules_for_user |
|
|
|
@ -250,58 +250,50 @@ class SyncHandler(BaseHandler): |
|
|
|
|
joined = [] |
|
|
|
|
invited = [] |
|
|
|
|
archived = [] |
|
|
|
|
deferreds = [] |
|
|
|
|
|
|
|
|
|
room_list_chunks = [room_list[i:i + 10] for i in xrange(0, len(room_list), 10)] |
|
|
|
|
for room_list_chunk in room_list_chunks: |
|
|
|
|
for event in room_list_chunk: |
|
|
|
|
if event.membership == Membership.JOIN: |
|
|
|
|
room_sync_deferred = preserve_fn( |
|
|
|
|
self.full_state_sync_for_joined_room |
|
|
|
|
)( |
|
|
|
|
room_id=event.room_id, |
|
|
|
|
sync_config=sync_config, |
|
|
|
|
now_token=now_token, |
|
|
|
|
timeline_since_token=timeline_since_token, |
|
|
|
|
ephemeral_by_room=ephemeral_by_room, |
|
|
|
|
tags_by_room=tags_by_room, |
|
|
|
|
account_data_by_room=account_data_by_room, |
|
|
|
|
) |
|
|
|
|
room_sync_deferred.addCallback(joined.append) |
|
|
|
|
deferreds.append(room_sync_deferred) |
|
|
|
|
elif event.membership == Membership.INVITE: |
|
|
|
|
invite = yield self.store.get_event(event.event_id) |
|
|
|
|
invited.append(InvitedSyncResult( |
|
|
|
|
room_id=event.room_id, |
|
|
|
|
invite=invite, |
|
|
|
|
)) |
|
|
|
|
elif event.membership in (Membership.LEAVE, Membership.BAN): |
|
|
|
|
# Always send down rooms we were banned or kicked from. |
|
|
|
|
if not sync_config.filter_collection.include_leave: |
|
|
|
|
if event.membership == Membership.LEAVE: |
|
|
|
|
if sync_config.user.to_string() == event.sender: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
leave_token = now_token.copy_and_replace( |
|
|
|
|
"room_key", "s%d" % (event.stream_ordering,) |
|
|
|
|
) |
|
|
|
|
room_sync_deferred = preserve_fn( |
|
|
|
|
self.full_state_sync_for_archived_room |
|
|
|
|
)( |
|
|
|
|
sync_config=sync_config, |
|
|
|
|
room_id=event.room_id, |
|
|
|
|
leave_event_id=event.event_id, |
|
|
|
|
leave_token=leave_token, |
|
|
|
|
timeline_since_token=timeline_since_token, |
|
|
|
|
tags_by_room=tags_by_room, |
|
|
|
|
account_data_by_room=account_data_by_room, |
|
|
|
|
) |
|
|
|
|
room_sync_deferred.addCallback(archived.append) |
|
|
|
|
deferreds.append(room_sync_deferred) |
|
|
|
|
|
|
|
|
|
yield defer.gatherResults( |
|
|
|
|
deferreds, consumeErrors=True |
|
|
|
|
).addErrback(unwrapFirstError) |
|
|
|
|
user_id = sync_config.user.to_string() |
|
|
|
|
|
|
|
|
|
@defer.inlineCallbacks |
|
|
|
|
def _generate_room_entry(event): |
|
|
|
|
if event.membership == Membership.JOIN: |
|
|
|
|
room_result = yield self.full_state_sync_for_joined_room( |
|
|
|
|
room_id=event.room_id, |
|
|
|
|
sync_config=sync_config, |
|
|
|
|
now_token=now_token, |
|
|
|
|
timeline_since_token=timeline_since_token, |
|
|
|
|
ephemeral_by_room=ephemeral_by_room, |
|
|
|
|
tags_by_room=tags_by_room, |
|
|
|
|
account_data_by_room=account_data_by_room, |
|
|
|
|
) |
|
|
|
|
joined.append(room_result) |
|
|
|
|
elif event.membership == Membership.INVITE: |
|
|
|
|
invite = yield self.store.get_event(event.event_id) |
|
|
|
|
invited.append(InvitedSyncResult( |
|
|
|
|
room_id=event.room_id, |
|
|
|
|
invite=invite, |
|
|
|
|
)) |
|
|
|
|
elif event.membership in (Membership.LEAVE, Membership.BAN): |
|
|
|
|
# Always send down rooms we were banned or kicked from. |
|
|
|
|
if not sync_config.filter_collection.include_leave: |
|
|
|
|
if event.membership == Membership.LEAVE: |
|
|
|
|
if user_id == event.sender: |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
leave_token = now_token.copy_and_replace( |
|
|
|
|
"room_key", "s%d" % (event.stream_ordering,) |
|
|
|
|
) |
|
|
|
|
room_result = yield self.full_state_sync_for_archived_room( |
|
|
|
|
sync_config=sync_config, |
|
|
|
|
room_id=event.room_id, |
|
|
|
|
leave_event_id=event.event_id, |
|
|
|
|
leave_token=leave_token, |
|
|
|
|
timeline_since_token=timeline_since_token, |
|
|
|
|
tags_by_room=tags_by_room, |
|
|
|
|
account_data_by_room=account_data_by_room, |
|
|
|
|
) |
|
|
|
|
archived.append(room_result) |
|
|
|
|
|
|
|
|
|
yield concurrently_execute(_generate_room_entry, room_list, 10) |
|
|
|
|
|
|
|
|
|
account_data_for_user = sync_config.filter_collection.filter_account_data( |
|
|
|
|
self.account_data_for_user(account_data) |
|
|
|
|