1 files changed, 12 insertions, 1 deletions
diff --git a/synapse/handlers/room_member.py b/synapse/handlers/room_member.py
index ffbc62ff44..0080eeaf8d 100644
--- a/synapse/handlers/room_member.py
+++ b/synapse/handlers/room_member.py
@@ -171,6 +171,17 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
if requester.is_guest:
content["kind"] = "guest"
+ # Check if we already have an event with a matching transaction ID. (We
+ # do this check just before we persist an event as well, but may as well
+ # do it up front for efficiency.)
+ if txn_id and requester.access_token_id:
+ existing_event_id = await self.store.get_event_id_from_transaction_id(
+ room_id, requester.user.to_string(), requester.access_token_id, txn_id,
+ )
+ if existing_event_id:
+ event_pos = await self.store.get_position_for_event(existing_event_id)
+ return existing_event_id, event_pos.stream
+
event, context = await self.event_creation_handler.create_event(
requester,
{
@@ -679,7 +690,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
if is_blocked:
raise SynapseError(403, "This room has been blocked on this server")
- await self.event_creation_handler.handle_new_client_event(
+ event = await self.event_creation_handler.handle_new_client_event(
requester, event, context, extra_users=[target_user], ratelimit=ratelimit
)
|