Use notification levels in power_levels

Rather than making the condition directly require a specific power
level. This way the level require to notify a room can be configured
per room.
This commit is contained in:
David Baker 2017-10-10 15:23:00 +01:00
parent c9f034b4ac
commit 0f1eb3e914
3 changed files with 22 additions and 12 deletions

View file

@ -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',
},
],

View file

@ -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 = {}

View file

@ -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