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

Commit

Permalink
Add topic and name events to group of events that are batch persisted…
Browse files Browse the repository at this point in the history
… when creating a room. (#15229)
  • Loading branch information
H-Shay committed Mar 9, 2023
1 parent 88efc75 commit be4ea20
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 56 deletions.
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,
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

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

0 comments on commit be4ea20

Please sign in to comment.