diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 6cb2f73ff4..a03a5f494c 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -234,8 +234,13 @@ class FederationHandler(BaseHandler):
if event.type == EventTypes.Member:
if event.membership == Membership.JOIN:
- user = UserID.from_string(event.state_key)
- yield user_joined_room(self.distributor, user, event.room_id)
+ context = yield self.state_handler.compute_event_context(
+ event, old_state=state, outlier=event.internal_metadata.is_outlier()
+ )
+ prev_state = context.current_state.get((event.type, event.state_key))
+ if not prev_state or prev_state.membership != Membership.JOIN:
+ user = UserID.from_string(event.state_key)
+ yield user_joined_room(self.distributor, user, event.room_id)
@defer.inlineCallbacks
def _filter_events_for_server(self, server_name, room_id, events):
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index 38bf2ef711..1e18038e15 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -525,8 +525,10 @@ class RoomMemberHandler(BaseHandler):
do_auth=do_auth,
)
- user = UserID.from_string(event.user_id)
- yield user_joined_room(self.distributor, user, room_id)
+ prev_state = context.current_state.get((event.type, event.state_key))
+ if not prev_state or prev_state.membership != Membership.JOIN:
+ user = UserID.from_string(event.user_id)
+ yield user_joined_room(self.distributor, user, room_id)
@defer.inlineCallbacks
def get_inviter(self, event):
|