diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index be120cb12f..f28a602741 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -213,6 +213,7 @@ class RoomCreationHandler:
(
tombstone_event,
tombstone_unpersisted_context,
+ _,
) = await self.event_creation_handler.create_event(
requester,
{
@@ -1066,7 +1067,11 @@ class RoomCreationHandler:
content: JsonDict,
for_batch: bool,
**kwargs: Any,
- ) -> Tuple[EventBase, synapse.events.snapshot.UnpersistedEventContextBase]:
+ ) -> Tuple[
+ EventBase,
+ synapse.events.snapshot.UnpersistedEventContextBase,
+ Optional[dict],
+ ]:
"""
Creates an event and associated event context.
Args:
@@ -1088,6 +1093,7 @@ class RoomCreationHandler:
(
new_event,
new_unpersisted_context,
+ third_party_event,
) = await self.event_creation_handler.create_event(
creator,
event_dict,
@@ -1103,7 +1109,7 @@ class RoomCreationHandler:
prev_event = [new_event.event_id]
state_map[(new_event.type, new_event.state_key)] = new_event.event_id
- return new_event, new_unpersisted_context
+ return new_event, new_unpersisted_context, third_party_event
visibility = room_config.get("visibility", "private")
preset_config = room_config.get(
@@ -1121,7 +1127,7 @@ class RoomCreationHandler:
)
creation_content.update({"creator": creator_id})
- creation_event, unpersisted_creation_context = await create_event(
+ creation_event, unpersisted_creation_context, _ = await create_event(
EventTypes.Create, creation_content, False
)
creation_context = await unpersisted_creation_context.persist(creation_event)
@@ -1161,14 +1167,17 @@ class RoomCreationHandler:
current_state_group = event_to_state[member_event_id]
events_to_send = []
+ third_party_events_to_append = []
# We treat the power levels override specially as this needs to be one
# of the first events that get sent into a room.
pl_content = initial_state.pop((EventTypes.PowerLevels, ""), None)
if pl_content is not None:
- power_event, power_context = await create_event(
+ power_event, power_context, power_tp_event = await create_event(
EventTypes.PowerLevels, pl_content, True
)
events_to_send.append((power_event, power_context))
+ if power_tp_event:
+ third_party_events_to_append.append(power_tp_event)
else:
power_level_content: JsonDict = {
"users": {creator_id: 100},
@@ -1211,58 +1220,92 @@ class RoomCreationHandler:
# apply those.
if power_level_content_override:
power_level_content.update(power_level_content_override)
- pl_event, pl_context = await create_event(
+ pl_event, pl_context, pl_tp_event = await create_event(
EventTypes.PowerLevels,
power_level_content,
True,
)
events_to_send.append((pl_event, pl_context))
+ if pl_tp_event:
+ third_party_events_to_append.append(pl_tp_event)
if room_alias and (EventTypes.CanonicalAlias, "") not in initial_state:
- room_alias_event, room_alias_context = await create_event(
+ room_alias_event, room_alias_context, ra_tp_event = await create_event(
EventTypes.CanonicalAlias, {"alias": room_alias.to_string()}, True
)
events_to_send.append((room_alias_event, room_alias_context))
+ if ra_tp_event:
+ third_party_events_to_append.append(ra_tp_event)
if (EventTypes.JoinRules, "") not in initial_state:
- join_rules_event, join_rules_context = await create_event(
+ join_rules_event, join_rules_context, jr_tp_event = await create_event(
EventTypes.JoinRules,
{"join_rule": config["join_rules"]},
True,
)
events_to_send.append((join_rules_event, join_rules_context))
+ if jr_tp_event:
+ third_party_events_to_append.append(jr_tp_event)
if (EventTypes.RoomHistoryVisibility, "") not in initial_state:
- visibility_event, visibility_context = await create_event(
+ visibility_event, visibility_context, vis_tp_event = await create_event(
EventTypes.RoomHistoryVisibility,
{"history_visibility": config["history_visibility"]},
True,
)
events_to_send.append((visibility_event, visibility_context))
+ if vis_tp_event:
+ third_party_events_to_append.append(vis_tp_event)
if config["guest_can_join"]:
if (EventTypes.GuestAccess, "") not in initial_state:
- guest_access_event, guest_access_context = await create_event(
+ (
+ guest_access_event,
+ guest_access_context,
+ ga_tp_event,
+ ) = await create_event(
EventTypes.GuestAccess,
{EventContentFields.GUEST_ACCESS: GuestAccess.CAN_JOIN},
True,
)
events_to_send.append((guest_access_event, guest_access_context))
+ if ga_tp_event:
+ third_party_events_to_append.append(ga_tp_event)
for (etype, state_key), content in initial_state.items():
- event, context = await create_event(
+ event, context, tp_event = await create_event(
etype, content, True, state_key=state_key
)
events_to_send.append((event, context))
+ if tp_event:
+ third_party_events_to_append.append(tp_event)
if config["encrypted"]:
- encryption_event, encryption_context = await create_event(
+ encryption_event, encryption_context, encrypt_tp_event = await create_event(
EventTypes.RoomEncryption,
{"algorithm": RoomEncryptionAlgorithms.DEFAULT},
True,
state_key="",
)
events_to_send.append((encryption_event, encryption_context))
+ if encrypt_tp_event:
+ third_party_events_to_append.append(encrypt_tp_event)
+
+ for event_dict in third_party_events_to_append:
+ (
+ event,
+ unpersisted_context,
+ _,
+ ) = await self.event_creation_handler.create_event(
+ creator,
+ event_dict,
+ prev_event_ids=prev_event,
+ state_map=state_map,
+ for_batch=True,
+ current_state_group=current_state_group,
+ )
+ context = await unpersisted_context.persist(event)
+ events_to_send.append((event, context))
if "name" in room_config:
name = room_config["name"]
|