summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
Diffstat (limited to 'synapse')
-rw-r--r--synapse/server_notices/resource_limits_server_notices.py69
-rw-r--r--synapse/server_notices/server_notices_manager.py30
2 files changed, 55 insertions, 44 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
-
-                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)
-
-
-    @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)
+                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
+                        )
+
+                        # 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, '',
+                        )
+
+                        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)