mirror of
https://mau.dev/maunium/synapse.git
synced 2024-11-15 22:42:23 +01:00
Add a 'user_left_room' distributor signal analogous to 'user_joined_room'
This commit is contained in:
parent
5ebc994f84
commit
f25764943c
2 changed files with 48 additions and 3 deletions
|
@ -260,6 +260,7 @@ class RoomMemberHandler(BaseHandler):
|
||||||
|
|
||||||
self.distributor = hs.get_distributor()
|
self.distributor = hs.get_distributor()
|
||||||
self.distributor.declare("user_joined_room")
|
self.distributor.declare("user_joined_room")
|
||||||
|
self.distributor.declare("user_left_room")
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_room_members(self, room_id, membership=Membership.JOIN):
|
def get_room_members(self, room_id, membership=Membership.JOIN):
|
||||||
|
@ -387,6 +388,12 @@ class RoomMemberHandler(BaseHandler):
|
||||||
do_auth=do_auth,
|
do_auth=do_auth,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if prev_state and prev_state.membership == Membership.JOIN:
|
||||||
|
user = self.hs.parse_userid(event.user_id)
|
||||||
|
self.distributor.fire(
|
||||||
|
"user_left_room", user=user, room_id=event.room_id
|
||||||
|
)
|
||||||
|
|
||||||
defer.returnValue({"room_id": room_id})
|
defer.returnValue({"room_id": room_id})
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
|
|
@ -222,14 +222,52 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
user=user, room_id=room_id
|
user=user, room_id=room_id
|
||||||
)
|
)
|
||||||
|
|
||||||
def _create_member(self, user_id, room_id):
|
@defer.inlineCallbacks
|
||||||
|
def test_simple_leave(self):
|
||||||
|
room_id = "!foo:red"
|
||||||
|
user_id = "@bob:red"
|
||||||
|
user = self.hs.parse_userid(user_id)
|
||||||
|
|
||||||
|
event = self._create_member(
|
||||||
|
user_id=user_id,
|
||||||
|
room_id=room_id,
|
||||||
|
membership=Membership.LEAVE,
|
||||||
|
)
|
||||||
|
|
||||||
|
prev_state = NonCallableMock()
|
||||||
|
prev_state.membership = Membership.JOIN
|
||||||
|
prev_state.sender = user_id
|
||||||
|
self.datastore.get_room_member.return_value = defer.succeed(prev_state)
|
||||||
|
|
||||||
|
event.state_events = {
|
||||||
|
(RoomMemberEvent.TYPE, user_id): event,
|
||||||
|
}
|
||||||
|
|
||||||
|
event.old_state_events = {
|
||||||
|
(RoomMemberEvent.TYPE, user_id): self._create_member(
|
||||||
|
user_id=user_id,
|
||||||
|
room_id=room_id,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
leave_signal_observer = Mock()
|
||||||
|
self.distributor.observe("user_left_room", leave_signal_observer)
|
||||||
|
|
||||||
|
# Actual invocation
|
||||||
|
yield self.room_member_handler.change_membership(event)
|
||||||
|
|
||||||
|
leave_signal_observer.assert_called_with(
|
||||||
|
user=user, room_id=room_id
|
||||||
|
)
|
||||||
|
|
||||||
|
def _create_member(self, user_id, room_id, membership=Membership.JOIN):
|
||||||
return self.hs.get_event_factory().create_event(
|
return self.hs.get_event_factory().create_event(
|
||||||
etype=RoomMemberEvent.TYPE,
|
etype=RoomMemberEvent.TYPE,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
state_key=user_id,
|
state_key=user_id,
|
||||||
room_id=room_id,
|
room_id=room_id,
|
||||||
membership=Membership.JOIN,
|
membership=membership,
|
||||||
content={"membership": Membership.JOIN},
|
content={"membership": membership},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue