summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Baker <dave@matrix.org>2016-04-28 11:49:36 +0100
committerDavid Baker <dave@matrix.org>2016-04-28 11:49:36 +0100
commitebbabc4986371c83d1d2659d10b27caad9b47951 (patch)
treeb21c1e6198779608514d660958f469a7bab96715
parentAdd the jinja template for individual notifs (diff)
downloadsynapse-ebbabc4986371c83d1d2659d10b27caad9b47951.tar.xz
Handle room invites in email notifs
-rw-r--r--res/templates/room.html14
-rw-r--r--synapse/push/mailer.py35
-rw-r--r--synapse/util/presentable_names.py6
3 files changed, 42 insertions, 13 deletions
diff --git a/res/templates/room.html b/res/templates/room.html
index f369575b98..6c68ee1fdc 100644
--- a/res/templates/room.html
+++ b/res/templates/room.html
@@ -13,9 +13,13 @@
             {% endif %}
         {% endif %}
     </div>
-    <div>
-        {% for notif in room.notifs %}
-            {% include 'notif.html' with context %}
-        {% endfor %}
-    </div>
+    {% if room.invite %}
+        <a href="{{ room.link }}">Join the conversation.</a>
+    {% else %}
+        <div>
+            {% for notif in room.notifs %}
+                {% include 'notif.html' with context %}
+            {% endfor %}
+        </div>
+    {% endif %}
 </div>
diff --git a/synapse/push/mailer.py b/synapse/push/mailer.py
index 7ef64f8f6d..d2cf24765a 100644
--- a/synapse/push/mailer.py
+++ b/synapse/push/mailer.py
@@ -39,6 +39,8 @@ MESSAGE_FROM_PERSON = "You have a message 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_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
 
@@ -148,17 +150,24 @@ class Mailer(object):
 
     @defer.inlineCallbacks
     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 = {
             "title": calculate_room_name(room_state, user_id),
             "hash": string_ordinal_total(room_id),  # See sender avatar hash
             "notifs": [],
+            "invite": is_invite
         }
 
-        for n in notifs:
-            vars = yield self.get_notif_vars(
-                n, user_id, notif_events[n['event_id']], room_state
-            )
-            room_vars['notifs'].append(vars)
+        if is_invite:
+            room_vars["link"] = self.make_room_link(room_id)
+        else:
+            for n in notifs:
+                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)
 
@@ -235,6 +244,18 @@ class Mailer(object):
                 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
             if len(notifs_by_room[room_id]) == 1:
                 # 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]:
                     state_event = state_by_room[room_id][("m.room.member", event.sender)]
                     sender_name = name_from_member_event(state_event)
+
                 if sender_name is not None and room_name is not None:
                     return MESSAGE_FROM_PERSON_IN_ROOM % (sender_name, room_name)
                 elif sender_name is not None:
@@ -268,6 +290,9 @@ class Mailer(object):
             # Stuff's happened in multiple different 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):
         return "https://matrix.to/%s/%s" % (
             notif['room_id'], notif['event_id']
diff --git a/synapse/util/presentable_names.py b/synapse/util/presentable_names.py
index 2ae01e453d..f80a7fe58e 100644
--- a/synapse/util/presentable_names.py
+++ b/synapse/util/presentable_names.py
@@ -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]):
                     return the_aliases[0]
 
+    if not fallback_to_members:
+        return None
+
     my_member_event = None
     if ("m.room.member", user_id) in room_state:
         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:
             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,
     # so find out who is in the room that isn't the user.
     if "m.room.member" in room_state_bytype: