diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index cfe1061ed3..d09743ed1b 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -106,20 +106,37 @@ class RoomCreationHandler(BaseHandler):
if not room_id:
raise StoreError(500, "Couldn't generate a room ID.")
+ if room_alias:
+ directory_handler = self.hs.get_handlers().directory_handler
+ yield directory_handler.create_association(
+ user_id=user_id,
+ room_id=room_id,
+ room_alias=room_alias,
+ servers=[self.hs.hostname],
+ )
+
user = self.hs.parse_userid(user_id)
creation_events = self._create_events_for_new_room(
user, room_id, is_public=is_public
)
+ room_member_handler = self.hs.get_handlers().room_member_handler
+
@defer.inlineCallbacks
def handle_event(event):
snapshot = yield self.store.snapshot_room(event)
logger.debug("Event: %s", event)
- yield self._on_new_room_event(
- event, snapshot, extra_users=[user], suppress_auth=True
- )
+ if event.type == RoomMemberEvent.TYPE:
+ yield room_member_handler.change_membership(
+ event,
+ do_auth=True
+ )
+ else:
+ yield self._on_new_room_event(
+ event, snapshot, extra_users=[user], suppress_auth=True
+ )
for event in creation_events:
yield handle_event(event)
@@ -146,16 +163,6 @@ class RoomCreationHandler(BaseHandler):
yield handle_event(topic_event)
- content = {"membership": Membership.JOIN}
- join_event = self.event_factory.create_event(
- etype=RoomMemberEvent.TYPE,
- state_key=user_id,
- room_id=room_id,
- user_id=user_id,
- membership=Membership.JOIN,
- content=content
- )
-
content = {"membership": Membership.INVITE}
for invitee in invite_list:
invite_event = self.event_factory.create_event(
@@ -165,35 +172,22 @@ class RoomCreationHandler(BaseHandler):
user_id=user_id,
content=content
)
-
- yield self.hs.get_handlers().room_member_handler.change_membership(
- invite_event,
- do_auth=False
- )
-
- yield self.hs.get_handlers().room_member_handler.change_membership(
- join_event,
- do_auth=False
- )
+ yield handle_event(invite_event)
result = {"room_id": room_id}
if room_alias:
result["room_alias"] = room_alias.to_string()
- directory_handler = self.hs.get_handlers().directory_handler
- yield directory_handler.create_association(
- user_id=user_id,
- room_id=room_id,
- room_alias=room_alias,
- servers=[self.hs.hostname],
- )
+ directory_handler.send_room_alias_update_event(user_id, room_id)
defer.returnValue(result)
def _create_events_for_new_room(self, creator, room_id, is_public=False):
+ creator_id = creator.to_string()
+
event_keys = {
"room_id": room_id,
- "user_id": creator.to_string(),
+ "user_id": creator_id,
}
def create(etype, **content):
@@ -208,6 +202,16 @@ class RoomCreationHandler(BaseHandler):
creator=creator.to_string(),
)
+ join_event = self.event_factory.create_event(
+ etype=RoomMemberEvent.TYPE,
+ state_key=creator_id,
+ content={
+ "membership": Membership.JOIN,
+ },
+ **event_keys
+ )
+
+
power_levels_event = self.event_factory.create_event(
etype=RoomPowerLevelsEvent.TYPE,
content={
@@ -236,6 +240,7 @@ class RoomCreationHandler(BaseHandler):
return [
creation_event,
+ join_event,
power_levels_event,
join_rules_event,
]
|