Support for channel notifications

Add condition type to check the sender's power level and add a base
rule using it for @channel notifications.
This commit is contained in:
David Baker 2017-10-05 12:39:18 +01:00
parent 44f8e383f3
commit fa969cfdde
3 changed files with 59 additions and 8 deletions

View file

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright 2015, 2016 OpenMarket Ltd
# Copyright 2015 New Vector Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -29,6 +30,12 @@ INEQUALITY_EXPR = re.compile("^([=<>]*)([0-9]*)$")
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 _test_ineq_condition(condition, number):
if 'is' not in condition:
return False
m = INEQUALITY_EXPR.match(condition['is'])
@ -41,19 +48,18 @@ def _room_member_count(ev, condition, room_member_count):
rhs = int(rhs)
if ineq == '' or ineq == '==':
return room_member_count == rhs
return number == rhs
elif ineq == '<':
return room_member_count < rhs
return number < rhs
elif ineq == '>':
return room_member_count > rhs
return number > rhs
elif ineq == '>=':
return room_member_count >= rhs
return number >= rhs
elif ineq == '<=':
return room_member_count <= rhs
return number <= rhs
else:
return False
def tweaks_for_actions(actions):
tweaks = {}
for a in actions:
@ -65,9 +71,10 @@ def tweaks_for_actions(actions):
class PushRuleEvaluatorForEvent(object):
def __init__(self, event, room_member_count):
def __init__(self, event, room_member_count, sender_power_level):
self._event = event
self._room_member_count = room_member_count
self._sender_power_level = sender_power_level
# Maps strings of e.g. 'content.body' -> event["content"]["body"]
self._value_cache = _flatten_dict(event)
@ -81,6 +88,10 @@ 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
)
else:
return True