diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py
index 52202d8e63..66e57bd4d6 100644
--- a/synapse/handlers/sync.py
+++ b/synapse/handlers/sync.py
@@ -55,6 +55,7 @@ class JoinedSyncResult(collections.namedtuple("JoinedSyncResult", [
"ephemeral",
"account_data",
"unread_notification_count",
+ "unread_highlight_count",
])):
__slots__ = []
@@ -292,9 +293,14 @@ class SyncHandler(BaseHandler):
notifs = yield self.unread_notifs_for_room_id(
room_id, sync_config, ephemeral_by_room
)
+
notif_count = None
+ highlight_count = None
if notifs is not None:
notif_count = len(notifs)
+ highlight_count = len([
+ 1 for notif in notifs if _action_has_highlight(notif["actions"])
+ ])
current_state = yield self.get_state_at(room_id, now_token)
@@ -307,6 +313,7 @@ class SyncHandler(BaseHandler):
room_id, tags_by_room, account_data_by_room
),
unread_notification_count=notif_count,
+ unread_highlight_count=highlight_count,
))
def account_data_for_user(self, account_data):
@@ -529,9 +536,14 @@ class SyncHandler(BaseHandler):
notifs = yield self.unread_notifs_for_room_id(
room_id, sync_config, all_ephemeral_by_room
)
+
notif_count = None
+ highlight_count = None
if notifs is not None:
notif_count = len(notifs)
+ highlight_count = len([
+ 1 for notif in notifs if _action_has_highlight(notif["actions"])
+ ])
just_joined = yield self.check_joined_room(sync_config, state)
if just_joined:
@@ -553,7 +565,8 @@ class SyncHandler(BaseHandler):
account_data=self.account_data_for_room(
room_id, tags_by_room, account_data_by_room
),
- unread_notification_count=notif_count
+ unread_notification_count=notif_count,
+ unread_highlight_count=highlight_count,
)
logger.debug("Result for room %s: %r", room_id, room_sync)
@@ -692,9 +705,14 @@ class SyncHandler(BaseHandler):
notifs = yield self.unread_notifs_for_room_id(
room_id, sync_config, ephemeral_by_room
)
+
notif_count = None
+ highlight_count = None
if notifs is not None:
notif_count = len(notifs)
+ highlight_count = len([
+ 1 for notif in notifs if _action_has_highlight(notif["actions"])
+ ])
room_sync = JoinedSyncResult(
room_id=room_id,
@@ -705,6 +723,7 @@ class SyncHandler(BaseHandler):
room_id, tags_by_room, account_data_by_room
),
unread_notification_count=notif_count,
+ unread_highlight_count=highlight_count,
)
logger.debug("Room sync: %r", room_sync)
@@ -850,8 +869,19 @@ class SyncHandler(BaseHandler):
notifs = yield self.store.get_unread_event_push_actions_by_room_for_user(
room_id, sync_config.user.to_string(), last_unread_event_id
)
- else:
- # There is no new information in this period, so your notification
- # count is whatever it was last time.
- defer.returnValue(None)
- defer.returnValue(notifs)
+ defer.returnValue(notifs)
+
+ # There is no new information in this period, so your notification
+ # count is whatever it was last time.
+ defer.returnValue(None)
+
+
+def _action_has_highlight(actions):
+ for action in actions:
+ try:
+ if action.get("set_tweak", None) == "highlight":
+ return action.get("value", True)
+ except AttributeError:
+ pass
+
+ return False
diff --git a/synapse/rest/client/v2_alpha/sync.py b/synapse/rest/client/v2_alpha/sync.py
index 826f9db189..e300ced214 100644
--- a/synapse/rest/client/v2_alpha/sync.py
+++ b/synapse/rest/client/v2_alpha/sync.py
@@ -313,6 +313,7 @@ class SyncRestServlet(RestServlet):
ephemeral_events = filter.filter_room_ephemeral(room.ephemeral)
result["ephemeral"] = {"events": ephemeral_events}
result["unread_notification_count"] = room.unread_notification_count
+ result["unread_highlight_count"] = room.unread_highlight_count
return result
diff --git a/synapse/storage/event_push_actions.py b/synapse/storage/event_push_actions.py
index d99171ee87..6b7cebc9ce 100644
--- a/synapse/storage/event_push_actions.py
+++ b/synapse/storage/event_push_actions.py
@@ -17,7 +17,7 @@ from ._base import SQLBaseStore
from twisted.internet import defer
import logging
-import simplejson as json
+import ujson as json
logger = logging.getLogger(__name__)
@@ -84,7 +84,8 @@ class EventPushActionsStore(SQLBaseStore):
)
)
return [
- {"event_id": row[0], "actions": row[1]} for row in txn.fetchall()
+ {"event_id": row[0], "actions": json.loads(row[1])}
+ for row in txn.fetchall()
]
ret = yield self.runInteraction(
|