Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Add topic and name events to group of events that are batch persisted when creating a room. #15229

Merged
merged 3 commits into from
Mar 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/15229.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add topic and name events to group of events that are batch persisted when creating a room.
108 changes: 52 additions & 56 deletions synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ async def clone_existing_room(
new_room_id,
# we expect to override all the presets with initial_state, so this is
# somewhat arbitrary.
preset_config=RoomCreationPreset.PRIVATE_CHAT,
room_config={"preset": RoomCreationPreset.PRIVATE_CHAT},
invite_list=[],
initial_state=initial_state,
creation_content=creation_content,
Expand Down Expand Up @@ -904,13 +904,6 @@ async def create_room(
check_membership=False,
)

preset_config = config.get(
"preset",
RoomCreationPreset.PRIVATE_CHAT
if visibility == "private"
else RoomCreationPreset.PUBLIC_CHAT,
)

raw_initial_state = config.get("initial_state", [])

initial_state = OrderedDict()
Expand All @@ -929,7 +922,7 @@ async def create_room(
) = await self._send_events_for_new_room(
requester,
room_id,
preset_config=preset_config,
room_config=config,
invite_list=invite_list,
initial_state=initial_state,
creation_content=creation_content,
Expand All @@ -938,48 +931,6 @@ async def create_room(
creator_join_profile=creator_join_profile,
)

if "name" in config:
name = config["name"]
(
name_event,
last_stream_id,
) = await self.event_creation_handler.create_and_send_nonmember_event(
requester,
{
"type": EventTypes.Name,
"room_id": room_id,
"sender": user_id,
"state_key": "",
"content": {"name": name},
},
ratelimit=False,
prev_event_ids=[last_sent_event_id],
depth=depth,
)
last_sent_event_id = name_event.event_id
depth += 1

if "topic" in config:
topic = config["topic"]
(
topic_event,
last_stream_id,
) = await self.event_creation_handler.create_and_send_nonmember_event(
requester,
{
"type": EventTypes.Topic,
"room_id": room_id,
"sender": user_id,
"state_key": "",
"content": {"topic": topic},
},
ratelimit=False,
prev_event_ids=[last_sent_event_id],
depth=depth,
)
last_sent_event_id = topic_event.event_id
depth += 1

# we avoid dropping the lock between invites, as otherwise joins can
# start coming in and making the createRoom slow.
#
Expand Down Expand Up @@ -1047,7 +998,7 @@ async def _send_events_for_new_room(
self,
creator: Requester,
room_id: str,
preset_config: str,
room_config: JsonDict,
H-Shay marked this conversation as resolved.
Show resolved Hide resolved
invite_list: List[str],
initial_state: MutableStateMap,
creation_content: JsonDict,
Expand All @@ -1064,11 +1015,33 @@ async def _send_events_for_new_room(
Rate limiting should already have been applied by this point.
Args:
creator:
the user requesting the room creation
room_id:
room id for the room being created
room_config:
A dict of configuration options. This will be the body of
a /createRoom request; see
https://spec.matrix.org/latest/client-server-api/#post_matrixclientv3createroom
invite_list:
a list of user ids to invite to the room
initial_state:
A list of state events to set in the new room.
creation_content:
Extra keys, such as m.federate, to be added to the content of the m.room.create event.
room_alias:
alias for the room
power_level_content_override:
The power level content to override in the default power level event.
creator_join_profile:
Set to override the displayname and avatar for the creating
user in this room.
Returns:
A tuple containing the stream ID, event ID and depth of the last
event sent to the room.
"""

creator_id = creator.user.to_string()
event_keys = {"room_id": room_id, "sender": creator_id, "state_key": ""}
depth = 1
Expand All @@ -1079,9 +1052,6 @@ async def _send_events_for_new_room(
# created (but not persisted to the db) to determine state for future created events
# (as this info can't be pulled from the db)
state_map: MutableStateMap[str] = {}
# current_state_group of last event created. Used for computing event context of
# events to be batched
current_state_group: Optional[int] = None
clokep marked this conversation as resolved.
Show resolved Hide resolved

def create_event_dict(etype: str, content: JsonDict, **kwargs: Any) -> JsonDict:
e = {"type": etype, "content": content}
Expand Down Expand Up @@ -1135,6 +1105,14 @@ async def create_event(

return new_event, new_unpersisted_context

visibility = room_config.get("visibility", "private")
preset_config = room_config.get(
"preset",
RoomCreationPreset.PRIVATE_CHAT
if visibility == "private"
else RoomCreationPreset.PUBLIC_CHAT,
)

try:
config = self._presets_dict[preset_config]
except KeyError:
Expand Down Expand Up @@ -1286,6 +1264,24 @@ async def create_event(
)
events_to_send.append((encryption_event, encryption_context))

if "name" in room_config:
name = room_config["name"]
name_event, name_context = await create_event(
EventTypes.Name,
{"name": name},
True,
)
events_to_send.append((name_event, name_context))

if "topic" in room_config:
topic = room_config["topic"]
topic_event, topic_context = await create_event(
EventTypes.Topic,
{"topic": topic},
True,
)
events_to_send.append((topic_event, topic_context))

datastore = self.hs.get_datastores().state
events_and_context = (
await UnpersistedEventContext.batch_persist_unpersisted_contexts(
Expand Down