Compare commits

..

16 Commits

Author SHA1 Message Date
Ju4tCode
3ea2c27e17 🔀 Merge pull request #138
PreRelease 2.0.0a8.post2
2021-01-02 04:10:10 -06:00
yanyongyu
17960b2868 🔖 PreRelease 2.0.0a8.post2 2021-01-02 18:04:44 +08:00
Ju4tCode
22416bf512 🔀 Merge pull request #137 2021-01-02 01:10:43 -06:00
yanyongyu
a4cb7f13be 🐛 fix error guess when reply to event #136 2021-01-02 14:42:13 +08:00
Ju4tCode
822709ceeb 🔀 Merge pull request #135
fix incorrect removing temp matcher
2021-01-01 21:02:18 -06:00
yanyongyu
4dffc879d9 🐛 fix incorrect remove temp matcher 2021-01-02 10:57:55 +08:00
Ju4tCode
f036057b2b 🔀 Merge pull request #133
Pre Release 2.0.0a8.post1
2021-01-01 09:55:13 -06:00
yanyongyu
38ab392b91 🚑 Fix Release 2.0.0a8.post1 2021-01-01 23:47:51 +08:00
Ju4tCode
a45d88ef29 🔀 Merge pull request #132
Fix doc typo
2021-01-01 09:32:06 -06:00
Lan
996c57df62 📝 Update creating-a-handler.md 2021-01-01 19:23:51 +08:00
Lan
8f69b2449d 📝 Update creating-a-matcher.md 2021-01-01 19:21:46 +08:00
Lan
db7e10cb4d ✏️ Fix typo 2021-01-01 18:21:02 +08:00
yanyongyu
b446fcc929 🐛 fix action failed info display error 2021-01-01 18:18:01 +08:00
yanyongyu
5cc5375cb5 🐛 fix missing group_id when PokeNotifyEvent 2021-01-01 18:01:05 +08:00
Ju4tCode
ebf3766cfb 🔀 Merge pull request #131
Fix GroupMessageEvent parse error
2021-01-01 15:25:45 +08:00
Mix
fbaf19e454 :critical: fix group event serialization error 2021-01-01 15:16:55 +08:00
46 changed files with 37 additions and 29 deletions

View File

@@ -69,7 +69,7 @@ async def handle2(bot: Bot, event: Event, state: T_State):
```python ```python
@matcher.got("key1") @matcher.got("key1")
@matcher.got("key2") @matcher.got("key2")
async def handle(bot: Bot, event: Event, state: State): async def handle(bot: Bot, event: Event, state: T_State):
pass pass
``` ```
@@ -169,12 +169,12 @@ matcher = on_command("test")
# 修改默认参数处理 # 修改默认参数处理
@matcher.args_parser @matcher.args_parser
async def parse(bot: Bot, event: Event, state: State): async def parse(bot: Bot, event: Event, state: T_State):
print(state["_current_key"], ":", str(event.get_message())) print(state["_current_key"], ":", str(event.get_message()))
state[state["_current_key"]] = str(event.get_message()) state[state["_current_key"]] = str(event.get_message())
@matcher.handle() @matcher.handle()
async def first_receive(bot: Bot, event: Event, state: State): async def first_receive(bot: Bot, event: Event, state: T_State):
# 获取用户原始命令,如:/test # 获取用户原始命令,如:/test
print(state["_prefix"]["raw_command"]) print(state["_prefix"]["raw_command"])
# 处理用户输入参数,如:/test arg1 arg2 # 处理用户输入参数,如:/test arg1 arg2
@@ -186,7 +186,7 @@ async def first_receive(bot: Bot, event: Event, state: State):
@matcher.got("arg1", prompt="参数?") @matcher.got("arg1", prompt="参数?")
async def arg_handle(bot: Bot, event: Event, state: State): async def arg_handle(bot: Bot, event: Event, state: T_State):
# 在这里对参数进行验证 # 在这里对参数进行验证
if state["arg1"] not in ["allow", "list"]: if state["arg1"] not in ["allow", "list"]:
await matcher.reject("参数不正确!请重新输入") await matcher.reject("参数不正确!请重新输入")

View File

@@ -21,7 +21,7 @@ async def handle_first_receive(bot: Bot, event: Event, state: T_State):
@weather.got("city", prompt="你想查询哪个城市的天气呢?") @weather.got("city", prompt="你想查询哪个城市的天气呢?")
async def handle_city(bot: Bot, event: Event, state: State): async def handle_city(bot: Bot, event: Event, state: T_State):
city = state["city"] city = state["city"]
if city not in ["上海", "北京"]: if city not in ["上海", "北京"]:
await weather.reject("你想查询的城市暂不支持,请重新输入!") await weather.reject("你想查询的城市暂不支持,请重新输入!")
@@ -115,16 +115,17 @@ rule 的出现使得 nonebot 对事件的响应可以非常自由nonebot 内
```python ```python
from nonebot.rule import Rule from nonebot.rule import Rule
from nonebot.typing import T_State
async def async_checker(bot: Bot, event: Event, state: State) -> bool: async def async_checker(bot: Bot, event: Event, state: T_State) -> bool:
return True return True
def sync_checker(bot: Bot, event: Event, state: State) -> bool: def sync_checker(bot: Bot, event: Event, state: T_State) -> bool:
return True return True
def check(arg1, args2): def check(arg1, args2):
async def _checker(bot: Bot, event: Event, state: State) -> bool: async def _checker(bot: Bot, event: Event, state: T_State) -> bool:
return bool(arg1 + arg2) return bool(arg1 + arg2)
return Rule(_check) return Rule(_check)

View File

@@ -1,4 +1,4 @@
[ [
"2.0.0a8", "2.0.0a8.post2",
"2.0.0a7" "2.0.0a7"
] ]

View File

@@ -69,7 +69,7 @@ async def handle2(bot: Bot, event: Event, state: T_State):
```python ```python
@matcher.got("key1") @matcher.got("key1")
@matcher.got("key2") @matcher.got("key2")
async def handle(bot: Bot, event: Event, state: State): async def handle(bot: Bot, event: Event, state: T_State):
pass pass
``` ```
@@ -169,12 +169,12 @@ matcher = on_command("test")
# 修改默认参数处理 # 修改默认参数处理
@matcher.args_parser @matcher.args_parser
async def parse(bot: Bot, event: Event, state: State): async def parse(bot: Bot, event: Event, state: T_State):
print(state["_current_key"], ":", str(event.get_message())) print(state["_current_key"], ":", str(event.get_message()))
state[state["_current_key"]] = str(event.get_message()) state[state["_current_key"]] = str(event.get_message())
@matcher.handle() @matcher.handle()
async def first_receive(bot: Bot, event: Event, state: State): async def first_receive(bot: Bot, event: Event, state: T_State):
# 获取用户原始命令,如:/test # 获取用户原始命令,如:/test
print(state["_prefix"]["raw_command"]) print(state["_prefix"]["raw_command"])
# 处理用户输入参数,如:/test arg1 arg2 # 处理用户输入参数,如:/test arg1 arg2
@@ -186,7 +186,7 @@ async def first_receive(bot: Bot, event: Event, state: State):
@matcher.got("arg1", prompt="参数?") @matcher.got("arg1", prompt="参数?")
async def arg_handle(bot: Bot, event: Event, state: State): async def arg_handle(bot: Bot, event: Event, state: T_State):
# 在这里对参数进行验证 # 在这里对参数进行验证
if state["arg1"] not in ["allow", "list"]: if state["arg1"] not in ["allow", "list"]:
await matcher.reject("参数不正确!请重新输入") await matcher.reject("参数不正确!请重新输入")

View File

@@ -21,7 +21,7 @@ async def handle_first_receive(bot: Bot, event: Event, state: T_State):
@weather.got("city", prompt="你想查询哪个城市的天气呢?") @weather.got("city", prompt="你想查询哪个城市的天气呢?")
async def handle_city(bot: Bot, event: Event, state: State): async def handle_city(bot: Bot, event: Event, state: T_State):
city = state["city"] city = state["city"]
if city not in ["上海", "北京"]: if city not in ["上海", "北京"]:
await weather.reject("你想查询的城市暂不支持,请重新输入!") await weather.reject("你想查询的城市暂不支持,请重新输入!")
@@ -115,16 +115,17 @@ rule 的出现使得 nonebot 对事件的响应可以非常自由nonebot 内
```python ```python
from nonebot.rule import Rule from nonebot.rule import Rule
from nonebot.typing import T_State
async def async_checker(bot: Bot, event: Event, state: State) -> bool: async def async_checker(bot: Bot, event: Event, state: T_State) -> bool:
return True return True
def sync_checker(bot: Bot, event: Event, state: State) -> bool: def sync_checker(bot: Bot, event: Event, state: T_State) -> bool:
return True return True
def check(arg1, args2): def check(arg1, args2):
async def _checker(bot: Bot, event: Event, state: State) -> bool: async def _checker(bot: Bot, event: Event, state: T_State) -> bool:
return bool(arg1 + arg2) return bool(arg1 + arg2)
return Rule(_check) return Rule(_check)

View File

@@ -421,19 +421,19 @@ class Bot(BaseBot):
message = escape(message) if isinstance(message, str) else message message = escape(message) if isinstance(message, str) else message
msg = message if isinstance(message, Message) else Message(message) msg = message if isinstance(message, Message) else Message(message)
at_sender = at_sender and hasattr(event, "user_id") at_sender = at_sender and getattr(event, "user_id", None)
params = {} params = {}
if hasattr(event, "user_id"): if getattr(event, "user_id", None):
params["user_id"] = getattr(event, "user_id") params["user_id"] = getattr(event, "user_id")
if hasattr(event, "group_id"): if getattr(event, "group_id", None):
params["group_id"] = getattr(event, "group_id") params["group_id"] = getattr(event, "group_id")
params.update(kwargs) params.update(kwargs)
if "message_type" not in params: if "message_type" not in params:
if "group_id" in params: if params.get("group_id", None):
params["message_type"] = "group" params["message_type"] = "group"
elif "user_id" in params: elif params.get("user_id", None):
params["message_type"] = "private" params["message_type"] = "private"
else: else:
raise ValueError("Cannot guess message type to reply!") raise ValueError("Cannot guess message type to reply!")

View File

@@ -184,7 +184,7 @@ class GroupMessageEvent(MessageEvent):
__event__ = "message.group" __event__ = "message.group"
message_type: Literal["group"] message_type: Literal["group"]
group_id: int group_id: int
anonymous: Anonymous anonymous: Optional[Anonymous] = None
@overrides(Event) @overrides(Event)
def get_event_description(self) -> str: def get_event_description(self) -> str:
@@ -319,6 +319,7 @@ class PokeNotifyEvent(NotifyEvent):
__event__ = "notice.notify.poke" __event__ = "notice.notify.poke"
sub_type: Literal["poke"] sub_type: Literal["poke"]
target_id: int target_id: int
group_id: Optional[int] = None
@overrides(Event) @overrides(Event)
def is_tome(self) -> bool: def is_tome(self) -> bool:

View File

@@ -28,7 +28,8 @@ class ActionFailed(BaseActionFailed, CQHTTPAdapterException):
self.info = kwargs self.info = kwargs
def __repr__(self): def __repr__(self):
return f"<ActionFailed " + ", ".join(f"{k=}" for k in self.info) + ">" return f"<ActionFailed " + ", ".join(
f"{k}={v}" for k, v in self.info.items()) + ">"
def __str__(self): def __str__(self):
return self.__repr__() return self.__repr__()

View File

@@ -117,8 +117,7 @@ async def _check_matcher(priority: int, bot: "Bot", event: "Event",
return None return None
async def _check_expire(Matcher: Type[Matcher]) -> Optional[Type[Matcher]]: async def _check_expire(Matcher: Type[Matcher]) -> Optional[Type[Matcher]]:
if Matcher.temp or (Matcher.expire_time and if Matcher.expire_time and datetime.now() > Matcher.expire_time:
datetime.now() > Matcher.expire_time):
return Matcher return Matcher
return None return None
@@ -128,14 +127,19 @@ async def _check_matcher(priority: int, bot: "Bot", event: "Event",
checking_expire_tasks = [ checking_expire_tasks = [
_check_expire(Matcher) for Matcher in current_matchers _check_expire(Matcher) for Matcher in current_matchers
] ]
results = await asyncio.gather(*checking_tasks, return_exceptions=True) results = await asyncio.gather(*checking_tasks)
expired = await asyncio.gather(*checking_expire_tasks) expired = await asyncio.gather(*checking_expire_tasks)
for expired_matcher in filter(lambda x: x, expired): for expired_matcher in filter(lambda x: x, expired):
try: try:
matchers[priority].remove(expired_matcher) # type: ignore matchers[priority].remove(expired_matcher) # type: ignore
except Exception: except Exception:
pass pass
return filter(lambda x: x, results) for temp_matcher in filter(lambda x: x and x.temp, results):
try:
matchers[priority].remove(temp_matcher) # type: ignore
except Exception:
pass
return filter(lambda x: x, results) # type: ignore
async def _run_matcher(Matcher: Type[Matcher], bot: "Bot", event: "Event", async def _run_matcher(Matcher: Type[Matcher], bot: "Bot", event: "Event",

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "nonebot2" name = "nonebot2"
version = "2.0.0-alpha.8" version = "2.0.0-alpha.8.post2"
description = "An asynchronous python bot framework." description = "An asynchronous python bot framework."
authors = ["yanyongyu <yanyongyu_1@126.com>"] authors = ["yanyongyu <yanyongyu_1@126.com>"]
license = "MIT" license = "MIT"