diff --git a/nonebot/drivers/fastapi.py b/nonebot/drivers/fastapi.py index c1e13f6d..3eb6b9bc 100644 --- a/nonebot/drivers/fastapi.py +++ b/nonebot/drivers/fastapi.py @@ -148,19 +148,17 @@ class Driver(BaseDriver): access_token: Optional[str] = Depends(get_auth_bearer)): secret = self.config.secret if secret is not None and secret != access_token: - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, - detail="Not authenticated", - headers={"WWW-Authenticate": "Bearer"}) + await websocket.close(code=status.WS_1008_POLICY_VIOLATION) websocket = WebSocket(websocket) if not x_self_id: logger.error(f"Error Connection Unkown: self_id {x_self_id}") - raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + await websocket.close(code=status.WS_1008_POLICY_VIOLATION) if x_self_id in self._clients: logger.error(f"Error Connection Conflict: self_id {x_self_id}") - raise HTTPException(status_code=status.HTTP_409_CONFLICT) + await websocket.close(code=status.WS_1008_POLICY_VIOLATION) # Create Bot Object if adapter in self._adapters: diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 0b6ae60d..762e891c 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -147,9 +147,7 @@ class Matcher: else: state[state["_current_key"]] = str(event.message) - if cls.handlers: - # 已有前置handlers则接受一条新的消息,否则视为接收初始消息 - cls.handlers.append(_key_getter) + cls.handlers.append(_key_getter) cls.handlers.append(_key_parser) def _decorator(func: Handler) -> Handler: diff --git a/nonebot/message.py b/nonebot/message.py index 0d41155a..d7963f00 100644 --- a/nonebot/message.py +++ b/nonebot/message.py @@ -65,7 +65,8 @@ async def handle_event(bot: Bot, event: Event): return # Trie Match - _, _ = TrieRule.get_value(bot, event, state) + if event.type == "message": + _, _ = TrieRule.get_value(bot, event, state) break_flag = False for priority in sorted(matchers.keys()): diff --git a/nonebot/plugin.py b/nonebot/plugin.py index 292c954b..63e06793 100644 --- a/nonebot/plugin.py +++ b/nonebot/plugin.py @@ -142,10 +142,12 @@ def on_endswith(msg: str, startswith(msg), permission, **kwargs) -def on_command(cmd: Tuple[str], +def on_command(cmd: Union[str, Tuple[str]], rule: Optional[Union[Rule, RuleChecker]] = None, permission: Permission = Permission(), **kwargs) -> Type[Matcher]: + if isinstance(cmd, str): + cmd = (cmd,) return on_message(command(cmd) & rule, permission, **kwargs) if rule else on_message( command(cmd), permission, **kwargs) diff --git a/nonebot/rule.py b/nonebot/rule.py index e76c2925..c13e2f1d 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -125,3 +125,11 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: return bool(pattern.search(str(event.message))) return Rule(_regex) + + +def to_me() -> Rule: + + async def _to_me(bot: Bot, event: Event, state: dict) -> bool: + return bool(event.to_me) + + return Rule(_to_me) diff --git a/tests/test_plugins/test_message.py b/tests/test_plugins/test_message.py index d68adb78..51b4e198 100644 --- a/tests/test_plugins/test_message.py +++ b/tests/test_plugins/test_message.py @@ -10,13 +10,12 @@ test_message = on_message(state={"default": 1}) @test_message.handle() async def test_handler(bot: Bot, event: Event, state: dict): - print("Test Matcher Received:", event) - print("Current State:", state) + print("[*] Test Matcher Received:", event) state["event"] = event await bot.send_private_msg(message="Received", user_id=event.user_id) @test_message.receive() async def test_receive(bot: Bot, event: Event, state: dict): - print("Test Matcher Received next time:", event) - print("Current State:", state) + print("[*] Test Matcher Received next time:", event) + print("[*] Current State:", state) diff --git a/tests/test_plugins/test_metaevent.py b/tests/test_plugins/test_metaevent.py index a165cf10..93609139 100644 --- a/tests/test_plugins/test_metaevent.py +++ b/tests/test_plugins/test_metaevent.py @@ -12,6 +12,6 @@ async def heartbeat(bot: Bot, event: Event, state: dict) -> bool: test_matcher = on_metaevent(heartbeat) -@test_matcher.handle() +@test_matcher.receive() async def handle_heartbeat(bot: Bot, event: Event, state: dict): print("[i] Heartbeat") diff --git a/tests/test_plugins/test_package/test_command.py b/tests/test_plugins/test_package/test_command.py index 8e6d4af7..34501ecd 100644 --- a/tests/test_plugins/test_package/test_command.py +++ b/tests/test_plugins/test_package/test_command.py @@ -1,14 +1,29 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from nonebot.rule import Rule +from nonebot.rule import to_me from nonebot.typing import Event from nonebot.plugin import on_command from nonebot.adapters.cqhttp import Bot -test_command = on_command(("帮助",)) +test_command = on_command("帮助", to_me()) @test_command.handle() async def test_handler(bot: Bot, event: Event, state: dict): - print(state["_prefix"]) + print("[!] Command:", state["_prefix"]) + args = str(event.message)[len(state["_prefix"]):].strip() + if args: + state["help"] = args + else: + await bot.send_private_msg(message="命令:\n1. test1\n2. test2", + user_id=event.user_id) + + +@test_command.got("help", prompt="你要帮助的命令是?") +async def test_handler(bot: Bot, event: Event, state: dict): + print("[!] Command 帮助:", state["help"]) + if state["help"] not in ["test1", "test2"]: + await bot.send_private_msg(message=f"{state['help']} 不支持,请重新输入!") + test_command.reject() + await bot.send_private_msg(message=f"{state['help']} 帮助:\n...")