Wait for getting a Join in response to an invite/join dance.
parent
d12a7c3939
commit
1587ea26fe
|
@ -24,4 +24,5 @@ class BaseHandler(object):
|
||||||
self.notifier = hs.get_notifier()
|
self.notifier = hs.get_notifier()
|
||||||
self.room_lock = hs.get_room_lock_manager()
|
self.room_lock = hs.get_room_lock_manager()
|
||||||
self.state_handler = hs.get_state_handler()
|
self.state_handler = hs.get_state_handler()
|
||||||
|
self.distributor = hs.get_distributor()
|
||||||
self.hs = hs
|
self.hs = hs
|
||||||
|
|
|
@ -32,6 +32,15 @@ logger = logging.getLogger(__name__)
|
||||||
class FederationHandler(BaseHandler):
|
class FederationHandler(BaseHandler):
|
||||||
|
|
||||||
"""Handles events that originated from federation."""
|
"""Handles events that originated from federation."""
|
||||||
|
def __init__(self, hs):
|
||||||
|
super(FederationHandler, self).__init__(hs)
|
||||||
|
|
||||||
|
self.distributor.observe(
|
||||||
|
"user_joined_room",
|
||||||
|
self._on_user_joined
|
||||||
|
)
|
||||||
|
|
||||||
|
self.waiting_for_join_list = {}
|
||||||
|
|
||||||
@log_function
|
@log_function
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
@ -103,6 +112,13 @@ class FederationHandler(BaseHandler):
|
||||||
if not backfilled:
|
if not backfilled:
|
||||||
yield self.notifier.on_new_room_event(event, store_id)
|
yield self.notifier.on_new_room_event(event, store_id)
|
||||||
|
|
||||||
|
if event.type == RoomMemberEvent.TYPE:
|
||||||
|
if event.membership == Membership.JOIN:
|
||||||
|
user = self.hs.parse_userid(event.target_user_id)
|
||||||
|
self.distributor.fire(
|
||||||
|
"user_joined_room", user=user, room_id=event.room_id
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@log_function
|
@log_function
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
@ -152,8 +168,10 @@ class FederationHandler(BaseHandler):
|
||||||
|
|
||||||
yield federation.handle_new_event(new_event)
|
yield federation.handle_new_event(new_event)
|
||||||
|
|
||||||
store_id = yield self.store.persist_event(new_event)
|
# TODO (erikj): Time out here.
|
||||||
self.notifier.on_new_room_event(new_event, store_id)
|
d = defer.Deferred()
|
||||||
|
self.waiting_for_join_list.setdefault((joinee, room_id), []).append(d)
|
||||||
|
yield d
|
||||||
|
|
||||||
try:
|
try:
|
||||||
yield self.store.store_room(
|
yield self.store.store_room(
|
||||||
|
@ -166,3 +184,10 @@ class FederationHandler(BaseHandler):
|
||||||
|
|
||||||
|
|
||||||
defer.returnValue(True)
|
defer.returnValue(True)
|
||||||
|
|
||||||
|
|
||||||
|
@log_function
|
||||||
|
def _on_user_joined(self, user, room_id):
|
||||||
|
waiters = self.waiting_for_join_list.get((user.to_string(), room_id), [])
|
||||||
|
while waiters:
|
||||||
|
waiters.pop().callback(None)
|
||||||
|
|
Loading…
Reference in New Issue