async def test_rules(api: API): assert await rules.FromPeerRule(123).check(fake_message(api, peer_id=123)) assert not await rules.FromUserRule().check(fake_message(api, from_id=-1)) assert await rules.VBMLRule( "i am in love with <whom>", vbml.Patcher()).check(fake_message(api, text="i am in love with you")) == { "whom": "you" } assert await rules.FuncRule(lambda m: m.text.endswith("!")).check( fake_message(api, text="yes!")) assert not await rules.PeerRule(from_chat=True).check( fake_message(api, peer_id=1, from_id=1)) assert await rules.PayloadMapRule([ ("a", int), ("b", str) ]).check(fake_message(api, payload=json.dumps({ "a": 1, "b": "" }))) assert await rules.PayloadMapRule([("a", int), ("b", [("c", str), ("d", dict)])] ).check( fake_message(api, payload=json.dumps({ "a": 1, "b": { "c": "", "d": {} } }))) assert await rules.PayloadMapRule({ "a": int, "b": { "c": str, "d": dict } }).check( fake_message(api, payload=json.dumps({ "a": 1, "b": { "c": "", "d": {} } }))) assert await rules.StickerRule(sticker_ids=[1, 2]).check( fake_message(api, attachments=[{ "type": "sticker", "sticker": { "sticker_id": 2 } }])) assert (await AndFilter(rules.FromPeerRule(123), rules.FromPeerRule([1, 123])).check( fake_message(api, peer_id=123)) is not False) assert (await OrFilter(rules.FromPeerRule(123), rules.FromPeerRule([1, 123 ])).check(fake_message(api, peer_id=1)) is not False) assert await rules.RegexRule(r"Hi .*?").check( fake_message(api, text="Hi bro")) == { "match": () } assert await rules.RegexRule("Hi (.*?)$").check( fake_message(api, text="Hi bro")) == { "match": ("bro", ) } assert not await rules.RegexRule(r"Hi .*?").check( fake_message(api, text="Hi")) == { "match": () } assert rules.PayloadMapRule.transform_to_map({ "a": int, "b": { "c": str, "d": dict } }) == [ ("a", int), ("b", [("c", str), ("d", dict)]), ] labeler = BotLabeler() labeler.vbml_ignore_case = True assert (await labeler.get_custom_rules({"text": "privet"}) [0].check(fake_message(api, text="Privet")) == {}) labeler.vbml_ignore_case = False assert not await labeler.get_custom_rules({"text": "privet"})[0].check( fake_message(api, text="Private")) assert await rules.PayloadRule({ "cmd": "text" }).check(fake_message(api, payload='{"cmd":"text"}')) assert await rules.PayloadRule([{ "cmd": "text" }, { "cmd": "ne text" }]).check(fake_message(api, payload='{"cmd":"text"}')) assert await rules.StateRule(state=None).check(fake_message(api)) assert not await rules.StateRule(state=MockIntEnum.MOCK).check( fake_message(api)) assert await rules.StateGroupRule(state_group=None).check(fake_message(api) ) sg_mock_message = fake_message(api) sg_mock_message.state_peer = StatePeer(peer_id=1, state=MockIntEnum.MOCK, payload={}) assert await rules.StateGroupRule(state_group=MockIntEnum ).check(sg_mock_message)
async def check(self, message: Message) -> Union[dict, bool]: token = os.environ.get('SECRET_BOT_TOKEN') if token is None: logger.warning('failure in token read') await message.answer( message='Мне не удалось считать токен, поэтому я не смогу управлять замком. Возврат в меню', keyboard=KEYBOARD_ENTRYPOINT ) return False return True bl = BotBlueprint() bl.labeler.auto_rules = [ rules.PeerRule(from_chat=False), rules.FromPeerRule(ADMIN_HARDCODED_LIST), MyRule() ] @bl.labeler.message(command=AdminOpenLock.raw_message_name) @bl.labeler.message(payload={'cmd': AdminOpenLock.key}) async def handle_open_door_request(message: Message, **kwargs): state = await bl.state_dispenser.get(message.peer_id) if state and state.state == AdminDoorControlStates.OPENED: await message.answer( message='Уже был запрос на открытие двери. Возврат', keyboard=KEYBOARD_ENTRYPOINT ) return try: