Handle room invites in email notifs

This commit is contained in:
David Baker 2016-04-28 11:49:36 +01:00
parent 5367708236
commit ebbabc4986
3 changed files with 42 additions and 13 deletions

View file

@ -13,9 +13,13 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
</div> </div>
<div> {% if room.invite %}
{% for notif in room.notifs %} <a href="{{ room.link }}">Join the conversation.</a>
{% include 'notif.html' with context %} {% else %}
{% endfor %} <div>
</div> {% for notif in room.notifs %}
{% include 'notif.html' with context %}
{% endfor %}
</div>
{% endif %}
</div> </div>

View file

@ -39,6 +39,8 @@ MESSAGE_FROM_PERSON = "You have a message from %s"
MESSAGES_FROM_PERSON = "You have messages from %s" MESSAGES_FROM_PERSON = "You have messages from %s"
MESSAGES_IN_ROOM = "There are some messages for you in the %s room" MESSAGES_IN_ROOM = "There are some messages for you in the %s room"
MESSAGES_IN_ROOMS = "Here are some messages you may have missed" MESSAGES_IN_ROOMS = "Here are some messages you may have missed"
INVITE_FROM_PERSON_TO_ROOM = "%s has invited you to join the %s room"
INVITE_FROM_PERSON = "%s has invited you to chat"
CONTEXT_BEFORE = 1 CONTEXT_BEFORE = 1
@ -148,17 +150,24 @@ class Mailer(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_room_vars(self, room_id, user_id, notifs, notif_events, room_state): def get_room_vars(self, room_id, user_id, notifs, notif_events, room_state):
my_member_event = room_state[("m.room.member", user_id)]
is_invite = my_member_event.content["membership"] == "invite"
room_vars = { room_vars = {
"title": calculate_room_name(room_state, user_id), "title": calculate_room_name(room_state, user_id),
"hash": string_ordinal_total(room_id), # See sender avatar hash "hash": string_ordinal_total(room_id), # See sender avatar hash
"notifs": [], "notifs": [],
"invite": is_invite
} }
for n in notifs: if is_invite:
vars = yield self.get_notif_vars( room_vars["link"] = self.make_room_link(room_id)
n, user_id, notif_events[n['event_id']], room_state else:
) for n in notifs:
room_vars['notifs'].append(vars) vars = yield self.get_notif_vars(
n, user_id, notif_events[n['event_id']], room_state
)
room_vars['notifs'].append(vars)
defer.returnValue(room_vars) defer.returnValue(room_vars)
@ -235,6 +244,18 @@ class Mailer(object):
state_by_room[room_id], user_id, fallback_to_members=False state_by_room[room_id], user_id, fallback_to_members=False
) )
my_member_event = state_by_room[room_id][("m.room.member", user_id)]
if my_member_event.content["membership"] == "invite":
inviter_member_event = state_by_room[room_id][
("m.room.member", my_member_event.sender)
]
inviter_name = name_from_member_event(inviter_member_event)
if room_name is None:
return INVITE_FROM_PERSON % (inviter_name,)
else:
return INVITE_FROM_PERSON_TO_ROOM % (inviter_name, room_name)
sender_name = None sender_name = None
if len(notifs_by_room[room_id]) == 1: if len(notifs_by_room[room_id]) == 1:
# There is just the one notification, so give some detail # There is just the one notification, so give some detail
@ -242,6 +263,7 @@ class Mailer(object):
if ("m.room.member", event.sender) in state_by_room[room_id]: if ("m.room.member", event.sender) in state_by_room[room_id]:
state_event = state_by_room[room_id][("m.room.member", event.sender)] state_event = state_by_room[room_id][("m.room.member", event.sender)]
sender_name = name_from_member_event(state_event) sender_name = name_from_member_event(state_event)
if sender_name is not None and room_name is not None: if sender_name is not None and room_name is not None:
return MESSAGE_FROM_PERSON_IN_ROOM % (sender_name, room_name) return MESSAGE_FROM_PERSON_IN_ROOM % (sender_name, room_name)
elif sender_name is not None: elif sender_name is not None:
@ -268,6 +290,9 @@ class Mailer(object):
# Stuff's happened in multiple different rooms # Stuff's happened in multiple different rooms
return MESSAGES_IN_ROOMS return MESSAGES_IN_ROOMS
def make_room_link(self, room_id):
return "https://matrix.to/%s" % (room_id,)
def make_notif_link(self, notif): def make_notif_link(self, notif):
return "https://matrix.to/%s/%s" % ( return "https://matrix.to/%s/%s" % (
notif['room_id'], notif['event_id'] notif['room_id'], notif['event_id']

View file

@ -52,6 +52,9 @@ def calculate_room_name(room_state, user_id, fallback_to_members=True):
if len(the_aliases) > 0 and _looks_like_an_alias(the_aliases[0]): if len(the_aliases) > 0 and _looks_like_an_alias(the_aliases[0]):
return the_aliases[0] return the_aliases[0]
if not fallback_to_members:
return None
my_member_event = None my_member_event = None
if ("m.room.member", user_id) in room_state: if ("m.room.member", user_id) in room_state:
my_member_event = room_state[("m.room.member", user_id)] my_member_event = room_state[("m.room.member", user_id)]
@ -66,9 +69,6 @@ def calculate_room_name(room_state, user_id, fallback_to_members=True):
else: else:
return "Room Invite" return "Room Invite"
if not fallback_to_members:
return None
# we're going to have to generate a name based on who's in the room, # we're going to have to generate a name based on who's in the room,
# so find out who is in the room that isn't the user. # so find out who is in the room that isn't the user.
if "m.room.member" in room_state_bytype: if "m.room.member" in room_state_bytype: