Send room name and first alias in notification poke.

This commit is contained in:
David Baker 2015-01-15 16:56:18 +00:00
parent e3e2fc3255
commit 2ca2dbc821
3 changed files with 61 additions and 3 deletions

View File

@ -61,6 +61,19 @@ class Pusher(object):
return False
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:

View File

@ -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)
return {
ctx = yield self.get_context_for_event(event)
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:

View File

@ -384,6 +384,41 @@ class DataStore(RoomMemberStore, RoomStore,
events = yield self._parse_events(results)
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(