Skip to content
Snippets Groups Projects
Commit 4006d583 authored by Paul "LeoNerd" Evans's avatar Paul "LeoNerd" Evans
Browse files

Store serial numbers per room for typing event stream purposes

parent 9eb819e8
No related branches found
No related tags found
No related merge requests found
......@@ -46,6 +46,12 @@ class TypingNotificationHandler(BaseHandler):
self._member_typing_until = {} # clock time we expect to stop
self._member_typing_timer = {} # deferreds to manage theabove
# map room IDs to serial numbers
self._room_serials = {}
self._latest_room_serial = 0
# map room IDs to sets of users currently typing
self._room_typing = {}
@defer.inlineCallbacks
def started_typing(self, target_user, auth_user, room_id, timeout):
if not target_user.is_mine:
......@@ -117,12 +123,11 @@ class TypingNotificationHandler(BaseHandler):
ignore_user=user
)
for u in localusers:
self.push_update_to_clients(
if localusers:
self._push_update_local(
room_id=room_id,
observer_user=u,
observed_user=user,
typing=typing,
user=user,
typing=typing
)
deferreds = []
......@@ -151,18 +156,28 @@ class TypingNotificationHandler(BaseHandler):
room_id, localusers=localusers
)
for u in localusers:
self.push_update_to_clients(
if localusers:
self._push_update_local(
room_id=room_id,
observer_user=u,
observed_user=user,
user=user,
typing=content["typing"]
)
def push_update_to_clients(self, room_id, observer_user, observed_user,
typing):
# TODO(paul) steal this from presence.py
pass
def _push_update_local(self, room_id, user, typing):
if room_id not in self._room_serials:
self._room_serials[room_id] = 0
self._room_typing[room_id] = set()
room_set = self._room_typing[room_id]
if typing:
room_set.add(user)
elif user in room_set:
room_set.remove(user)
self._latest_room_serial += 1
self._room_serials[room_id] = self._latest_room_serial
self.notifier.on_new_user_event(rooms=[room_id])
class TypingNotificationEventSource(object):
......
......@@ -65,6 +65,9 @@ class TypingNotificationsTestCase(unittest.TestCase):
self.mock_config = Mock()
self.mock_config.signing_key = [MockKey()]
mock_notifier = Mock(spec=["on_new_user_event"])
self.on_new_user_event = mock_notifier.on_new_user_event
hs = HomeServer("test",
clock=self.clock,
db_pool=None,
......@@ -77,6 +80,7 @@ class TypingNotificationsTestCase(unittest.TestCase):
"get_destination_retry_timings",
]),
handlers=None,
notifier=mock_notifier,
resource_for_client=Mock(),
resource_for_federation=self.mock_federation_resource,
http_client=self.mock_http_client,
......@@ -85,11 +89,7 @@ class TypingNotificationsTestCase(unittest.TestCase):
)
hs.handlers = JustTypingNotificationHandlers(hs)
self.mock_update_client = Mock()
self.mock_update_client.return_value = defer.succeed(None)
self.handler = hs.get_handlers().typing_notification_handler
self.handler.push_update_to_clients = self.mock_update_client
self.datastore = hs.get_datastore()
self.datastore.get_destination_retry_timings.return_value = (
......@@ -158,11 +158,8 @@ class TypingNotificationsTestCase(unittest.TestCase):
timeout=20000,
)
self.mock_update_client.assert_has_calls([
call(observer_user=self.u_banana,
observed_user=self.u_apple,
room_id=self.room_id,
typing=True),
self.on_new_user_event.assert_has_calls([
call(rooms=[self.room_id]),
])
@defer.inlineCallbacks
......@@ -209,11 +206,8 @@ class TypingNotificationsTestCase(unittest.TestCase):
)
)
self.mock_update_client.assert_has_calls([
call(observer_user=self.u_apple,
observed_user=self.u_onion,
room_id=self.room_id,
typing=True),
self.on_new_user_event.assert_has_calls([
call(rooms=[self.room_id]),
])
@defer.inlineCallbacks
......@@ -243,6 +237,7 @@ class TypingNotificationsTestCase(unittest.TestCase):
self.handler._member_typing_timer[member] = (
self.clock.call_later(1002, lambda: 0)
)
self.handler._room_typing[self.room_id] = set((self.u_apple,))
yield self.handler.stopped_typing(
target_user=self.u_apple,
......@@ -250,11 +245,8 @@ class TypingNotificationsTestCase(unittest.TestCase):
room_id=self.room_id,
)
self.mock_update_client.assert_has_calls([
call(observer_user=self.u_banana,
observed_user=self.u_apple,
room_id=self.room_id,
typing=False),
self.on_new_user_event.assert_has_calls([
call(rooms=[self.room_id]),
])
yield put_json.await_calls()
......@@ -270,19 +262,13 @@ class TypingNotificationsTestCase(unittest.TestCase):
timeout=10000,
)
self.mock_update_client.assert_has_calls([
call(observer_user=self.u_banana,
observed_user=self.u_apple,
room_id=self.room_id,
typing=True),
self.on_new_user_event.assert_has_calls([
call(rooms=[self.room_id]),
])
self.mock_update_client.reset_mock()
self.on_new_user_event.reset_mock()
self.clock.advance_time(11)
self.mock_update_client.assert_has_calls([
call(observer_user=self.u_banana,
observed_user=self.u_apple,
room_id=self.room_id,
typing=False),
self.on_new_user_event.assert_has_calls([
call(rooms=[self.room_id]),
])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment