diff --git a/synapse/handlers/directory.py b/synapse/handlers/directory.py
index 164363cdc5..98ac0684fc 100644
--- a/synapse/handlers/directory.py
+++ b/synapse/handlers/directory.py
@@ -21,8 +21,6 @@ from synapse.api.errors import SynapseError
from synapse.api.events.room import RoomAliasesEvent
import logging
-import sqlite3
-
logger = logging.getLogger(__name__)
@@ -56,17 +54,11 @@ class DirectoryHandler(BaseHandler):
if not servers:
raise SynapseError(400, "Failed to get server list")
- try:
- yield self.store.create_room_alias_association(
- room_alias,
- room_id,
- servers
- )
- except sqlite3.IntegrityError:
- defer.returnValue("Already exists")
-
- # TODO: Send the room event.
- yield self._update_room_alias_events(user_id, room_id)
+ yield self.store.create_room_alias_association(
+ room_alias,
+ room_id,
+ servers
+ )
@defer.inlineCallbacks
def delete_association(self, user_id, room_alias):
@@ -136,7 +128,7 @@ class DirectoryHandler(BaseHandler):
})
@defer.inlineCallbacks
- def _update_room_alias_events(self, user_id, room_id):
+ def send_room_alias_update_event(self, user_id, room_id):
aliases = yield self.store.get_aliases_for_room(room_id)
event = self.event_factory.create_event(
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,
]
|