From df1e4f259fda3009dacbb3211e999f7d89adaf87 Mon Sep 17 00:00:00 2001 From: Neil Johnson Date: Thu, 16 Aug 2018 11:10:53 +0100 Subject: [PATCH] WIP impl commiting to get feedback --- .../resource_limits_server_notices.py | 80 +++++++++++++++++-- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/synapse/server_notices/resource_limits_server_notices.py b/synapse/server_notices/resource_limits_server_notices.py index 94d0f9818..2b714a101 100644 --- a/synapse/server_notices/resource_limits_server_notices.py +++ b/synapse/server_notices/resource_limits_server_notices.py @@ -40,7 +40,8 @@ class ResourceLimitsServerNotices(object): self._notified_of_blocking = set() self._resouce_limited = False - + self._message_handler = hs.get_message_handler() + self._state = hs.get_state_handler() # Config checks? @defer.inlineCallbacks @@ -57,6 +58,72 @@ class ResourceLimitsServerNotices(object): return if self._limit_usage_by_mau is True: + room_id = yield self._server_notices_manager.get_notice_room_for_user(user_id) + + + # Alternate impl - currently inlcuded because I'm not sure I am on + # the right track and want to share WIP + + # logger.info("GET STATE EVENTS") + # currently_blocked = False + # events = [] + # try: + # events = yield self._message_handler.get_state_events(user_id, room_id, types=[(EventTypes.Pinned, None)]) + # except AuthError as e: + # # The user has yet to join the server notices room + # pass + # + # pinned_event_refs = [] + # for e in events: + # logger.info('events %s' % e) + # logger.info(type(e)) + # for key, event_ids in e['content'].items(): + # logger.info('Key Event %s %s' % (key, event_ids)) + # if key == 'pinned': + # pinned_event_refs = event_ids + # + # logger.info('pinned_event_refs %s' % pinned_event_refs) + # + # events = yield self._store.get_events(pinned_event_refs) + # logger.info(events) + # for event_id, event in events.items(): + # logger.info("event_id, event event.type %s %s %s" % (event_id, event, event.type)) + # if event.type == 'm.server_notice.usage_limit_reached': + # currently_blocked = True + # + # logger.info('Currently Blocked is %r' % currently_blocked) + + #for e in events: + # logger.info(e) + currently_blocked = False + logger.info("GET CURRENT STATE") + pinned_state_event = yield self._state.get_current_state(room_id, event_type=EventTypes.Pinned) + logger.info(events) + logger.info(events.get('content')) + + referenced_events = [] + if pinned_state_event is not None: + content = pinned_state_event.get('content') + if content is not None: + referenced_events = content.get('pinned') + + events = yield self._store.get_events(referenced_events) + logger.info(events) + for event_id, event in events.items(): + logger.info("event_id, event event.type %s %s %s" % (event_id, event, event.type)) + if event.type == 'm.server_notice.usage_limit_reached': + currently_blocked = True + + logger.info("currently_blocked is %r" % currently_blocked) + + #event = yield self._store.get_event(events.event_id) + #logger.info(event) + + #logger.info("GET CURRENT STATE IDs") + #events = yield self._state.get_current_state_ids(room_id) + #for k,v in events.items(): + # logger.info('%s %s' % (k,v)) + timestamp = yield self._store.user_last_seen_monthly_active(user_id) if timestamp is None: # This user will be blocked from receiving the notice anyway. @@ -69,7 +136,8 @@ class ResourceLimitsServerNotices(object): yield self.auth.check_auth_blocking() self._resouce_limited = False # Need to start removing notices - if user_id in self._notified_of_blocking: + # if user_id in self._notified_of_blocking: + if currently_blocked: # Send message to remove warning # send state event here # How do I do this? if drop the id, how to refer to it? @@ -79,14 +147,14 @@ class ResourceLimitsServerNotices(object): yield self._server_notices_manager.send_notice( user_id, content, EventTypes.Pinned, '', ) - - self._notified_of_blocking.remove(user_id) + logger.info('deactivate block') except AuthError as e: # Need to start notifying of blocking try: self._resouce_limited = True - if user_id not in self._notified_of_blocking: + #if user_id not in self._notified_of_blocking: + if not currently_blocked: # TODO use admin email contained in error once PR lands content = { 'body': e.msg, @@ -103,10 +171,10 @@ class ResourceLimitsServerNotices(object): event.event_id, ] } + logger.info("active block") yield self._server_notices_manager.send_notice( user_id, content, EventTypes.Pinned, '', ) - self._notified_of_blocking.add(user_id) except SynapseError as e: logger.error("Error sending server notice about resource limits: %s", e)