summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--changelog.d/3898.bugfix1
-rw-r--r--synapse/handlers/sync.py40
2 files changed, 25 insertions, 16 deletions
diff --git a/changelog.d/3898.bugfix b/changelog.d/3898.bugfix
new file mode 100644
index 0000000000..4d3601a8b4
--- /dev/null
+++ b/changelog.d/3898.bugfix
@@ -0,0 +1 @@
+Always calculate heroes for rooms without avatars
diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py
index 09739f2862..48b7431433 100644
--- a/synapse/handlers/sync.py
+++ b/synapse/handlers/sync.py
@@ -559,15 +559,13 @@ class SyncHandler(object):
             state_filter=StateFilter.from_types([
                 (EventTypes.Name, ''),
                 (EventTypes.CanonicalAlias, ''),
+                (EventTypes.RoomAvatar, ''),
             ]),
         )
 
         # this is heavily cached, thus: fast.
         details = yield self.store.get_room_summary(room_id)
 
-        name_id = state_ids.get((EventTypes.Name, ''))
-        canonical_alias_id = state_ids.get((EventTypes.CanonicalAlias, ''))
-
         summary = {}
         empty_ms = MemberSummary([], 0)
 
@@ -579,21 +577,31 @@ class SyncHandler(object):
             details.get(Membership.INVITE, empty_ms).count
         )
 
-        # if the room has a name or canonical_alias set, we can skip
-        # calculating heroes.  we assume that if the event has contents, it'll
+        # if the room has no avatar, we need to calculate heroes.
+        # otherwise, if the room has a name or canonical_alias set, we can skip
+        # calculating heroes.
+        # we assume that if the event has contents, it'll
         # be a valid name or canonical_alias - i.e. we're checking that they
         # haven't been "deleted" by blatting {} over the top.
-        if name_id:
-            name = yield self.store.get_event(name_id, allow_none=True)
-            if name and name.content:
-                defer.returnValue(summary)
-
-        if canonical_alias_id:
-            canonical_alias = yield self.store.get_event(
-                canonical_alias_id, allow_none=True,
-            )
-            if canonical_alias and canonical_alias.content:
-                defer.returnValue(summary)
+        room_avatar_id = state_ids.get((EventTypes.RoomAvatar, ''))
+        if room_avatar_id:
+            room_avatar = yield self.store.get_event(room_avatar_id, allow_none=True)
+            if room_avatar and room_avatar.content:
+                # we have a room avatar; check to see if we can skip heroes
+                # because the room has an explicit name or canonical alias:
+                name_id = state_ids.get((EventTypes.Name, ''))
+                if name_id:
+                    name = yield self.store.get_event(name_id, allow_none=True)
+                    if name and name.content:
+                        defer.returnValue(summary)
+
+                canonical_alias_id = state_ids.get((EventTypes.CanonicalAlias, ''))
+                if canonical_alias_id:
+                    canonical_alias = yield self.store.get_event(
+                        canonical_alias_id, allow_none=Tue,
+                    )
+                    if canonical_alias and canonical_alias.content:
+                        defer.returnValue(summary)
 
         joined_user_ids = [
             r[0] for r in details.get(Membership.JOIN, empty_ms).members