diff --git a/synapse/push/baserules.py b/synapse/push/baserules.py
index 71f9ab6b25..9dce99ebec 100644
--- a/synapse/push/baserules.py
+++ b/synapse/push/baserules.py
@@ -249,8 +249,8 @@ BASE_APPEND_OVERRIDE_RULES = [
'_id': '_roomnotif_content',
},
{
- 'kind': 'sender_power_level',
- 'is': '>=50',
+ 'kind': 'sender_notification_permission',
+ 'key': 'room',
'_id': '_roomnotif_pl',
},
],
diff --git a/synapse/push/bulk_push_rule_evaluator.py b/synapse/push/bulk_push_rule_evaluator.py
index adc99bd4f6..db07a97a94 100644
--- a/synapse/push/bulk_push_rule_evaluator.py
+++ b/synapse/push/bulk_push_rule_evaluator.py
@@ -113,7 +113,7 @@ class BulkPushRuleEvaluator(object):
)
@defer.inlineCallbacks
- def _get_sender_power_level(self, event, context):
+ def _get_power_levels_and_sender_level(self, event, context):
pl_event_id = context.prev_state_ids.get(POWER_KEY)
if pl_event_id:
# fastpath: if there's a power level event, that's all we need, and
@@ -129,7 +129,9 @@ class BulkPushRuleEvaluator(object):
(e.type, e.state_key): e for e in auth_events.itervalues()
}
- defer.returnValue(get_user_power_level(event.sender, auth_events))
+ sender_level = get_user_power_level(event.sender, auth_events)
+
+ defer.returnValue((auth_events[POWER_KEY].content, sender_level))
@defer.inlineCallbacks
def action_for_event_by_user(self, event, context):
@@ -146,10 +148,10 @@ class BulkPushRuleEvaluator(object):
event, context
)
- sender_power_level = yield self._get_sender_power_level(event, context)
+ (power_levels, sender_power_level) = yield self._get_power_levels_and_sender_level(event, context)
evaluator = PushRuleEvaluatorForEvent(
- event, len(room_members), sender_power_level
+ event, len(room_members), sender_power_level, power_levels,
)
condition_cache = {}
diff --git a/synapse/push/push_rule_evaluator.py b/synapse/push/push_rule_evaluator.py
index 7cf777f16f..5011bef4f1 100644
--- a/synapse/push/push_rule_evaluator.py
+++ b/synapse/push/push_rule_evaluator.py
@@ -33,8 +33,15 @@ def _room_member_count(ev, condition, room_member_count):
return _test_ineq_condition(condition, room_member_count)
-def _sender_power_level(ev, condition, power_level):
- return _test_ineq_condition(condition, power_level)
+def _sender_notification_permission(ev, condition, sender_power_level, power_levels):
+ notif_level_key = condition.get('key')
+ if notif_level_key is None:
+ return False
+
+ notif_levels = power_levels.get('notifications', {})
+ room_notif_level = notif_levels.get(notif_level_key, 50)
+
+ return sender_power_level >= room_notif_level;
def _test_ineq_condition(condition, number):
@@ -74,10 +81,11 @@ def tweaks_for_actions(actions):
class PushRuleEvaluatorForEvent(object):
- def __init__(self, event, room_member_count, sender_power_level):
+ def __init__(self, event, room_member_count, sender_power_level, power_levels):
self._event = event
self._room_member_count = room_member_count
self._sender_power_level = sender_power_level
+ self._power_levels = power_levels
# Maps strings of e.g. 'content.body' -> event["content"]["body"]
self._value_cache = _flatten_dict(event)
@@ -91,9 +99,9 @@ class PushRuleEvaluatorForEvent(object):
return _room_member_count(
self._event, condition, self._room_member_count
)
- elif condition['kind'] == 'sender_power_level':
- return _sender_power_level(
- self._event, condition, self._sender_power_level
+ elif condition['kind'] == 'sender_notification_permission':
+ return _sender_notification_permission(
+ self._event, condition, self._sender_power_level, self._power_levels,
)
else:
return True
|