summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/push/__init__.py13
-rw-r--r--synapse/push/httppusher.py16
-rw-r--r--synapse/storage/__init__.py35
3 files changed, 61 insertions, 3 deletions
diff --git a/synapse/push/__init__.py b/synapse/push/__init__.py
index 9cf996fb80..5f4e833add 100644
--- a/synapse/push/__init__.py
+++ b/synapse/push/__init__.py
@@ -62,6 +62,19 @@ class Pusher(object):
         return True
 
     @defer.inlineCallbacks
+    def get_context_for_event(self, ev):
+        name_aliases = yield self.store.get_room_name_and_aliases(
+            ev['room_id']
+        )
+
+        ctx = {'aliases': name_aliases[1]}
+        if name_aliases[0] is not None:
+            ctx['name'] = name_aliases[0]
+
+        defer.returnValue(ctx)
+
+
+    @defer.inlineCallbacks
     def start(self):
         if not self.last_token:
             # First-time setup: get a token to start from (we can't
diff --git a/synapse/push/httppusher.py b/synapse/push/httppusher.py
index bcfa06e2ab..7631a741fa 100644
--- a/synapse/push/httppusher.py
+++ b/synapse/push/httppusher.py
@@ -50,6 +50,7 @@ class HttpPusher(Pusher):
         self.data_minus_url.update(self.data)
         del self.data_minus_url['url']
 
+    @defer.inlineCallbacks
     def _build_notification_dict(self, event):
         # we probably do not want to push for every presence update
         # (we may want to be able to set up notifications when specific
@@ -57,9 +58,11 @@ class HttpPusher(Pusher):
         # Actually, presence events will not get this far now because we
         # need to filter them out in the main Pusher code.
         if 'event_id' not in event:
-            return None
+            defer.returnValue(None)
+
+        ctx = yield self.get_context_for_event(event)
 
-        return {
+        d = {
             'notification': {
                 'transition': 'new',
                 # everything is new for now: we don't have read receipts
@@ -85,9 +88,16 @@ class HttpPusher(Pusher):
             }
         }
 
+        if len(ctx['aliases']):
+            d['notification']['roomAlias'] = ctx['aliases'][0]
+        if 'name' in ctx:
+            d['notification']['roomName'] = ctx['name']
+
+        defer.returnValue(d)
+
     @defer.inlineCallbacks
     def dispatch_push(self, event):
-        notification_dict = self._build_notification_dict(event)
+        notification_dict = yield self._build_notification_dict(event)
         if not notification_dict:
             defer.returnValue([])
         try:
diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index fa7ad0eea8..191fe462a5 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -385,6 +385,41 @@ class DataStore(RoomMemberStore, RoomStore,
         defer.returnValue(events)
 
     @defer.inlineCallbacks
+    def get_room_name_and_aliases(self, room_id):
+        del_sql = (
+            "SELECT event_id FROM redactions WHERE redacts = e.event_id "
+            "LIMIT 1"
+        )
+
+        sql = (
+            "SELECT e.*, (%(redacted)s) AS redacted FROM events as e "
+            "INNER JOIN current_state_events as c ON e.event_id = c.event_id "
+            "INNER JOIN state_events as s ON e.event_id = s.event_id "
+            "WHERE c.room_id = ? "
+        ) % {
+            "redacted": del_sql,
+        }
+
+        sql += " AND (s.type = 'm.room.name' AND s.state_key = '')"
+        sql += " OR s.type = 'm.room.aliases'"
+        args = (room_id,)
+
+        results = yield self._execute_and_decode(sql, *args)
+
+        events = yield self._parse_events(results)
+
+        name = None
+        aliases = []
+
+        for e in events:
+            if e.type == 'm.room.name':
+                name = e.content['name']
+            elif e.type == 'm.room.aliases':
+                aliases.extend(e.content['aliases'])
+
+        defer.returnValue((name, aliases))
+
+    @defer.inlineCallbacks
     def _get_min_token(self):
         row = yield self._execute(
             None,