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,
|