From eabc5f827107a24717655e0eec376adf88b574c4 Mon Sep 17 00:00:00 2001 From: Neil Johnson Date: Wed, 15 Aug 2018 15:04:52 +0100 Subject: [PATCH] wip cut at sending resource server notices --- .../resource_limits_server_notices.py | 65 ++++++++++--------- .../server_notices/server_notices_manager.py | 30 ++++++--- 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/synapse/server_notices/resource_limits_server_notices.py b/synapse/server_notices/resource_limits_server_notices.py index 0470f66205..94d0f98189 100644 --- a/synapse/server_notices/resource_limits_server_notices.py +++ b/synapse/server_notices/resource_limits_server_notices.py @@ -40,6 +40,7 @@ class ResourceLimitsServerNotices(object): self._notified_of_blocking = set() self._resouce_limited = False + # Config checks? @defer.inlineCallbacks @@ -69,43 +70,43 @@ class ResourceLimitsServerNotices(object): self._resouce_limited = False # Need to start removing notices if user_id in self._notified_of_blocking: - # Send message to remove warning - needs updating + # Send message to remove warning + # send state event here + # How do I do this? if drop the id, how to refer to it? content = { - 'body': '', - 'admin_email': '', + "pinned":[] } - self._send_server_notice(user_id, content) + yield self._server_notices_manager.send_notice( + user_id, content, EventTypes.Pinned, '', + ) + self._notified_of_blocking.remove(user_id) except AuthError as e: # Need to start notifying of blocking + try: + self._resouce_limited = True + if user_id not in self._notified_of_blocking: + # TODO use admin email contained in error once PR lands + content = { + 'body': e.msg, + 'admin_email': 'stunt@adminemail.com', + } + event = yield self._server_notices_manager.send_notice( + user_id, content, EventTypes.ServerNoticeLimitReached + ) - self._resouce_limited = True - if user_id not in self._notified_of_blocking: - # TODO use admin email contained in error once PR lands - content = { - 'body': e.msg, - 'admin_email': 'stunt@adminemail.com', - 'msgtype': 'm.text' - } - self._send_server_notice(user_id, content) - self._notified_of_blocking.add(user_id) + # send server notices state event here + # TODO Over writing pinned events + content = { + "pinned":[ + event.event_id, + ] + } + yield self._server_notices_manager.send_notice( + user_id, content, EventTypes.Pinned, '', + ) - - @defer.inlineCallbacks - def _send_server_notice(self, user_id, content): - """Sends Server notice - - Args: - user_id(str): The user to send to - content(str): The content of the message - - Returns: - Deferred[] - """ - try: - yield self._server_notices_manager.send_notice( - user_id, content - ) - except SynapseError as e: - logger.error("Error sending server notice about resource limits: %s", e) + self._notified_of_blocking.add(user_id) + except SynapseError as e: + logger.error("Error sending server notice about resource limits: %s", e) diff --git a/synapse/server_notices/server_notices_manager.py b/synapse/server_notices/server_notices_manager.py index a26deace53..3e57f8211a 100644 --- a/synapse/server_notices/server_notices_manager.py +++ b/synapse/server_notices/server_notices_manager.py @@ -46,7 +46,10 @@ class ServerNoticesManager(object): return self._config.server_notices_mxid is not None @defer.inlineCallbacks - def send_notice(self, user_id, event_content): + def send_notice( + self, user_id, event_content, + type=EventTypes.Message, state_key=None + ): """Send a notice to the given user Creates the server notices room, if none exists. @@ -54,9 +57,11 @@ class ServerNoticesManager(object): Args: user_id (str): mxid of user to send event to. event_content (dict): content of event to send + type(EventTypes): type of event + is_state_event(bool): Is the event a state event Returns: - Deferred[None] + Deferred[FrozenEvent] """ room_id = yield self.get_notice_room_for_user(user_id) @@ -65,15 +70,19 @@ class ServerNoticesManager(object): logger.info("Sending server notice to %s", user_id) - yield self._event_creation_handler.create_and_send_nonmember_event( - requester, { - "type": EventTypes.Message, - "room_id": room_id, - "sender": system_mxid, - "content": event_content, - }, - ratelimit=False, + event_dict = { + "type": type, + "room_id": room_id, + "sender": system_mxid, + "content": event_content, + } + if state_key: + event_dict['state_key'] = state_key + + res = yield self._event_creation_handler.create_and_send_nonmember_event( + requester, event_dict, ratelimit=False, ) + defer.returnValue(res) @cachedInlineCallbacks() def get_notice_room_for_user(self, user_id): @@ -141,6 +150,7 @@ class ServerNoticesManager(object): creator_join_profile=join_profile, ) room_id = info['room_id'] + yield self._store.add_tag_to_room(user_id, room_id, 'm.server_notice', None) logger.info("Created server notices room %s for %s", room_id, user_id) defer.returnValue(room_id)