handle fragments correctly on mxc URLs.

switch to vector.im permalinks as matrix.to isn't ready yet.
merge overlapping notifications together.
give one message of context after a notification (in the unlikely event it exists, but it's possible thanks to throttling).
include name of app in mail templates
This commit is contained in:
Matthew Hodgson 2016-05-05 01:56:43 +01:00
parent 1cf5c379cb
commit ce81ccb063
1 changed files with 45 additions and 14 deletions

View File

@ -35,16 +35,20 @@ import bleach
import time import time
import urllib import urllib
import logging
logger = logging.getLogger(__name__)
MESSAGE_FROM_PERSON_IN_ROOM = "You have a message from %(person)s in the %s room"
MESSAGE_FROM_PERSON = "You have a message from %(person)s"
MESSAGES_FROM_PERSON = "You have messages from %(person)s"
MESSAGES_IN_ROOM = "There are some messages for you in the %(room)s room"
MESSAGES_IN_ROOMS = "Here are some messages you may have missed"
INVITE_FROM_PERSON_TO_ROOM = "%(person)s has invited you to join the %(room)s room"
INVITE_FROM_PERSON = "%(person)s has invited you to chat"
CONTEXT_BEFORE = 0 MESSAGE_FROM_PERSON_IN_ROOM = "You have a message on %%app%% from %(person)s in the %s room..."
MESSAGE_FROM_PERSON = "You have a message on %%app%% from %(person)s..."
MESSAGES_FROM_PERSON = "You have messages on %%app%% from %(person)s..."
MESSAGES_IN_ROOM = "There are some messages on %%app%% for you in the %(room)s room..."
MESSAGES_IN_ROOMS = "Here are some messages on %%app%% you may have missed..."
INVITE_FROM_PERSON_TO_ROOM = "%(person)s has invited you to join the %(room)s room on %%app%%..."
INVITE_FROM_PERSON = "%(person)s has invited you to chat on %%app%%..."
CONTEXT_BEFORE = 1
CONTEXT_AFTER = 1
# From https://github.com/matrix-org/matrix-react-sdk/blob/master/src/HtmlUtils.js # From https://github.com/matrix-org/matrix-react-sdk/blob/master/src/HtmlUtils.js
ALLOWED_TAGS = [ ALLOWED_TAGS = [
@ -181,7 +185,25 @@ class Mailer(object):
notifvars = yield self.get_notif_vars( notifvars = yield self.get_notif_vars(
n, user_id, notif_events[n['event_id']], room_state n, user_id, notif_events[n['event_id']], room_state
) )
room_vars['notifs'].append(notifvars)
# merge overlapping notifs together.
# relies on the notifs being in chronological order.
merge = False
if room_vars['notifs'] and 'messages' in room_vars['notifs'][-1]:
prev_messages = room_vars['notifs'][-1]['messages']
for message in notifvars['messages']:
pm = filter(lambda pm: pm['id'] == message['id'], prev_messages)
if pm:
if not message["is_historical"]:
pm[0]["is_historical"] = False
merge = True
elif merge:
# we're merging, so append any remaining messages
# in this notif to the previous one
prev_messages.append(message)
if not merge:
room_vars['notifs'].append(notifvars)
defer.returnValue(room_vars) defer.returnValue(room_vars)
@ -189,7 +211,7 @@ class Mailer(object):
def get_notif_vars(self, notif, user_id, notif_event, room_state): def get_notif_vars(self, notif, user_id, notif_event, room_state):
results = yield self.store.get_events_around( results = yield self.store.get_events_around(
notif['room_id'], notif['event_id'], notif['room_id'], notif['event_id'],
before_limit=CONTEXT_BEFORE, after_limit=0 before_limit=CONTEXT_BEFORE, after_limit=CONTEXT_AFTER
) )
ret = { ret = {
@ -226,6 +248,7 @@ class Mailer(object):
ret = { ret = {
"msgtype": event.content["msgtype"], "msgtype": event.content["msgtype"],
"is_historical": event.event_id != notif['event_id'], "is_historical": event.event_id != notif['event_id'],
"id": event.event_id,
"ts": event.origin_server_ts, "ts": event.origin_server_ts,
"sender_name": sender_name, "sender_name": sender_name,
"sender_avatar_url": sender_avatar_url, "sender_avatar_url": sender_avatar_url,
@ -329,10 +352,12 @@ class Mailer(object):
return MESSAGES_IN_ROOMS return MESSAGES_IN_ROOMS
def make_room_link(self, room_id): def make_room_link(self, room_id):
return "https://matrix.to/%s" % (room_id,) # XXX: matrix.to
return "https://vector.im/#/room/%s" % (room_id,)
def make_notif_link(self, notif): def make_notif_link(self, notif):
return "https://matrix.to/%s/%s" % ( # XXX: matrix.to
return "https://vector.im/#/room/%s/%s" % (
notif['room_id'], notif['event_id'] notif['room_id'], notif['event_id']
) )
@ -342,16 +367,22 @@ class Mailer(object):
def mxc_to_http_filter(self, value, width, height, resize_method="crop"): def mxc_to_http_filter(self, value, width, height, resize_method="crop"):
if value[0:6] != "mxc://": if value[0:6] != "mxc://":
return "" return ""
serverAndMediaId = value[6:] serverAndMediaId = value[6:]
if '#' in serverAndMediaId:
(serverAndMediaId, fragment) = serverAndMediaId.split('#', 1)
fragment = "#" + fragment
params = { params = {
"width": width, "width": width,
"height": height, "height": height,
"method": resize_method, "method": resize_method,
} }
return "%s_matrix/media/v1/thumbnail/%s?%s" % ( return "%s_matrix/media/v1/thumbnail/%s?%s%s" % (
self.hs.config.public_baseurl, self.hs.config.public_baseurl,
serverAndMediaId, serverAndMediaId,
urllib.urlencode(params) urllib.urlencode(params),
fragment or "",
) )