Пример #1
0
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)
Пример #2
0
    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: