2022-09-25 14:53:10 +08:00
|
|
|
|
import re
|
2022-08-24 00:11:18 +08:00
|
|
|
|
from typing import Union, Tuple, Set
|
|
|
|
|
|
2022-08-31 17:45:18 +08:00
|
|
|
|
from nonebot import on_command, on_regex, on_endswith, on_keyword, on_startswith
|
2022-08-24 00:11:18 +08:00
|
|
|
|
import nonebot
|
2022-09-25 14:53:10 +08:00
|
|
|
|
from nonebot.adapters.onebot.v11 import MessageEvent, Bot, log
|
|
|
|
|
from nonebot.adapters.onebot import v11
|
2022-08-24 00:11:18 +08:00
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
通过猴子补丁,为nonebot的部分matcher注入其命令到默认state中
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_command_(cmd: Union[str, Tuple[str, ...]], state: dict = None, *args, **kwargs):
|
|
|
|
|
if state is None:
|
|
|
|
|
state = {}
|
|
|
|
|
if 'pm_name' not in state:
|
|
|
|
|
state['pm_name'] = cmd if isinstance(cmd, str) else cmd[0]
|
|
|
|
|
return on_command(cmd=cmd, state=state, _depth=1, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_endswith_(msg: Union[str, Tuple[str, ...]], state: dict = None, *args, **kwargs):
|
|
|
|
|
if state is None:
|
|
|
|
|
state = {}
|
|
|
|
|
if 'pm_name' not in state:
|
|
|
|
|
state['pm_name'] = msg if isinstance(msg, str) else msg[0]
|
|
|
|
|
return on_endswith(msg=msg, state=state, _depth=1, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
2022-08-31 17:45:18 +08:00
|
|
|
|
def on_startswith_(msg: Union[str, Tuple[str, ...]], state: dict = None, *args, **kwargs):
|
|
|
|
|
if state is None:
|
|
|
|
|
state = {}
|
|
|
|
|
if 'pm_name' not in state:
|
|
|
|
|
state['pm_name'] = msg if isinstance(msg, str) else msg[0]
|
|
|
|
|
return on_startswith(msg=msg, state=state, _depth=1, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
2022-08-24 00:11:18 +08:00
|
|
|
|
def on_regex_(pattern: str, state: dict = None, *args, **kwargs):
|
|
|
|
|
if state is None:
|
|
|
|
|
state = {}
|
|
|
|
|
if 'pm_name' not in state:
|
|
|
|
|
state['pm_name'] = pattern
|
|
|
|
|
return on_regex(pattern=pattern, state=state, _depth=1, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_keyword_(keywords: Set[str], state: dict = None, *args, **kwargs):
|
|
|
|
|
if state is None:
|
|
|
|
|
state = {}
|
|
|
|
|
if 'pm_name' not in state:
|
|
|
|
|
state['pm_name'] = list(keywords)[0]
|
|
|
|
|
return on_keyword(keywords=keywords, state=state, _depth=1, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
2022-09-25 14:53:10 +08:00
|
|
|
|
def _check_nickname(bot: Bot, event: MessageEvent) -> None:
|
|
|
|
|
"""检查消息开头是否存在昵称,去除并赋值 `event.to_me`。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
bot: Bot 对象
|
|
|
|
|
event: MessageEvent 对象
|
|
|
|
|
"""
|
|
|
|
|
first_msg_seg = event.message[0]
|
|
|
|
|
if first_msg_seg.type != "text":
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if nicknames := set(filter(lambda n: n, bot.config.nickname)):
|
|
|
|
|
# check if the user is calling me with my nickname
|
|
|
|
|
nickname_regex = "|".join(nicknames)
|
|
|
|
|
first_text = first_msg_seg.data["text"]
|
|
|
|
|
|
|
|
|
|
if m := re.search(rf"^({nickname_regex})([\s,,]*|$)", first_text, re.IGNORECASE):
|
|
|
|
|
nickname = m[1]
|
|
|
|
|
log("DEBUG", f"User is calling me {nickname}")
|
|
|
|
|
event.to_me = True
|
|
|
|
|
# first_msg_seg.data["text"] = first_text[m.end():]
|
|
|
|
|
|
2022-08-31 17:45:18 +08:00
|
|
|
|
|
2022-08-24 00:11:18 +08:00
|
|
|
|
nonebot.on_command = on_command_
|
|
|
|
|
nonebot.on_regex = on_regex_
|
2022-08-31 17:45:18 +08:00
|
|
|
|
nonebot.on_startswith = on_startswith_
|
2022-08-24 00:11:18 +08:00
|
|
|
|
nonebot.on_endswith = on_endswith_
|
|
|
|
|
nonebot.on_keyword = on_keyword_
|
2022-12-06 23:07:34 +08:00
|
|
|
|
# v11.bot._check_nickname = _check_nickname
|