Compare commits

..

189 Commits

Author SHA1 Message Date
N791
d8c36e8eff 🍻 publish plugin nonebot-plugin-ehentai-search (#2884) 2024-08-17 10:48:42 +08:00
noneflow[bot]
1cc5d1af33 📝 Update changelog 2024-08-16 13:27:05 +00:00
shengwang52005
88074cf5c3 🍻 publish plugin pokepoke_miss (#2878) 2024-08-16 13:25:54 +00:00
noneflow[bot]
5d637eed95 📝 Update changelog 2024-08-15 03:35:09 +00:00
lm175
362c43ce5f 🍻 publish plugin 聊天截图伪造 (#2879) 2024-08-15 03:34:08 +00:00
noneflow[bot]
622b8eb51e 📝 Update changelog 2024-08-13 11:23:45 +00:00
hanasa2023
c369dcf781 🍻 publish plugin ba-tools (#2863) 2024-08-13 11:22:46 +00:00
noneflow[bot]
53d1e1dee9 📝 Update changelog 2024-08-13 07:39:10 +00:00
Leo Q
75f5825cff 📝 Docs: 添加 Windows Powershell 设置环境变量方法 (#2874)
Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
2024-08-13 15:38:17 +08:00
noneflow[bot]
d05c90787c 📝 Update changelog 2024-08-12 15:23:00 +00:00
BEISNWKZNAN
e07ba36a4a 🍻 publish plugin 精华消息管理 (#2872) 2024-08-12 15:22:10 +00:00
noneflow[bot]
f7c05d9a08 📝 Update changelog 2024-08-11 15:24:59 +00:00
kawaiior
59c5a1a35d 🍻 publish plugin B站收藏夹监视器 (#2868) 2024-08-11 15:24:07 +00:00
noneflow[bot]
3eb653821e 📝 Update changelog 2024-08-11 12:47:36 +00:00
Ju4tCode
214bc838c2 📝 Docs: 更新 localstore 插件文档 (#2871) 2024-08-11 20:46:41 +08:00
noneflow[bot]
79c7ea5bab 📝 Update changelog 2024-08-11 07:17:00 +00:00
Ju4tCode
b59b1be6ff Feature: 优化依赖注入在 pydantic v2 下的性能 (#2870) 2024-08-11 15:15:59 +08:00
noneflow[bot]
aeb75a6ce3 📝 Update changelog 2024-08-11 07:05:13 +00:00
iam57ao
847325a119 🍻 publish plugin Alist (#2864) 2024-08-11 07:04:22 +00:00
noneflow[bot]
26eabfaf6f 📝 Update changelog 2024-08-09 12:18:53 +00:00
月ヶ瀬
40a7b97220 ✏️ Plugin: 修改插件 system-command 信息 (#2862)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-08-09 20:18:01 +08:00
noneflow[bot]
91b40748c4 📝 Update changelog 2024-08-09 12:14:40 +00:00
SamuNatsu
013a2f94d6 🍻 publish plugin nonebot-plugin-deer-pipe (#2858) 2024-08-09 12:13:51 +00:00
noneflow[bot]
74d280ed75 📝 Update changelog 2024-08-08 09:04:11 +00:00
luosheng520qaq
b7d46de10e 🍻 publish plugin 漂流瓶 (#2860) 2024-08-08 09:03:15 +00:00
noneflow[bot]
c37b5bbbca 📝 Update changelog 2024-08-07 13:11:34 +00:00
zhongwen-4
5e08e73698 🍻 publish plugin 奇怪的小功能 (#2850) 2024-08-07 13:10:40 +00:00
pre-commit-ci[bot]
b27bb92d03 ⬆️ auto update by pre-commit hooks (#2857)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-08-06 14:43:44 +08:00
noneflow[bot]
6bf8858cc6 📝 Update changelog 2024-08-06 06:20:30 +00:00
Ju4tCode
c97a780645 Feature: 添加遗漏的类型标注 (#2856) 2024-08-06 14:19:17 +08:00
noneflow[bot]
976c1cd8e0 📝 Update changelog 2024-08-03 13:21:57 +00:00
ALittleBot
26fd6f8a6c ✏️ Plugin: 修改 nonebot-plugin-fishing 插件作者 (#2854) 2024-08-03 21:20:57 +08:00
noneflow[bot]
0020ad28ba 📝 Update changelog 2024-08-03 09:53:27 +00:00
CCYellowStar2
ba9ca63f10 🍻 publish plugin SunoAI音乐生成 (#2852) 2024-08-03 09:52:24 +00:00
noneflow[bot]
28b5b732c2 📝 Update changelog 2024-07-29 12:38:05 +00:00
KomoriDev
b944da8445 🍻 publish plugin 谁是卷王 (#2848) 2024-07-29 12:37:02 +00:00
noneflow[bot]
5cab166d6b 📝 Update changelog 2024-07-28 15:04:05 +00:00
zhaomaoniu
546cdb4229 🍻 publish plugin GPT-SoVITS 语音合成 (#2846) 2024-07-28 15:02:59 +00:00
noneflow[bot]
77790fad1f 📝 Update changelog 2024-07-28 12:41:01 +00:00
Alpaca4610
bcf849c98f 🍻 publish plugin 基于清影的AI视频生成 (#2842) 2024-07-28 12:40:00 +00:00
noneflow[bot]
f7b3c8af02 📝 Update changelog 2024-07-26 03:42:50 +00:00
tkgs0
cced60589c 🍻 publish plugin 命令行 (#2839) 2024-07-26 03:41:42 +00:00
noneflow[bot]
62adb32c94 📝 Update changelog 2024-07-22 07:10:44 +00:00
Lonely-Sails
6ab752dcdb ✏️ Bot: 更新 Minecraft QQBot 信息 (#2838) 2024-07-22 15:09:31 +08:00
noneflow[bot]
4d6f071739 📝 Update changelog 2024-07-21 14:58:12 +00:00
wyf7685
bd140c2ceb 🍻 publish plugin exe_code (#2834) 2024-07-21 14:57:09 +00:00
noneflow[bot]
59d9991aa4 📝 Update changelog 2024-07-21 12:56:40 +00:00
Lonely-Sails
55e7f59e40 🍻 publish bot Minecraft_QQBot (#2836) 2024-07-21 12:55:37 +00:00
noneflow[bot]
bb83483020 📝 Update changelog 2024-07-21 12:36:25 +00:00
This-is-XiaoDeng
5300ef5119 🍻 publish plugin nonebot-plugin-autopush (#2832) 2024-07-21 12:35:17 +00:00
noneflow[bot]
5a50d4203c 📝 Update changelog 2024-07-21 10:07:54 +00:00
SwedishDoveCooker
01a96f3086 🍻 publish plugin vv_helper (#2820) 2024-07-21 10:06:53 +00:00
noneflow[bot]
0570d779ee 📝 Update changelog 2024-07-21 04:51:31 +00:00
Cvandia
18d0bc2c81 🍻 publish plugin nonebot_plugin_game_torrent (#2826) 2024-07-21 04:50:31 +00:00
Ju4tCode
87e0d8148f 👷 Fix: preview alias and commit status (#2831) 2024-07-21 12:40:50 +08:00
Ju4tCode
53d8989145 🐛 Fix: website preview CD (#2830) 2024-07-21 12:14:18 +08:00
noneflow[bot]
5433b4ebdf 📝 Update changelog 2024-07-21 03:29:14 +00:00
wyeeeee
f10cecf16a 🍻 publish plugin 每日油价 (#2821) 2024-07-21 03:28:10 +00:00
Ju4tCode
60a3f6f4cc 👷 Security: 拆分 PR Website CI/CD (#2829) 2024-07-21 11:23:15 +08:00
noneflow[bot]
f70ae89098 📝 Update changelog 2024-07-20 06:04:34 +00:00
Ju4tCode
2f60c5e9b4 🚨 Fix: 错误的类型标注和 annotated 处理 (#2828) 2024-07-20 14:03:32 +08:00
noneflow[bot]
015ddd9517 📝 Update changelog 2024-07-18 15:18:51 +00:00
StarXinXin
f1539d9ec4 🍻 publish bot 星辰 Bot (#2823) 2024-07-18 15:17:48 +00:00
noneflow[bot]
2d0444ba75 📝 Update changelog 2024-07-18 13:35:13 +00:00
shiyihang2007
ed2c222e83 🍻 publish plugin wordle (#2817) 2024-07-18 13:34:08 +00:00
noneflow[bot]
ed048913a4 📝 Update changelog 2024-07-17 15:07:06 +00:00
SuperGuGuGu
121ba17698 ✏️ Plugin: 移除 kanonbot 插件 (#2819) 2024-07-17 23:05:55 +08:00
noneflow[bot]
d0f5a76c47 📝 Update changelog 2024-07-15 14:21:24 +00:00
NCBM
f809f1d089 🍻 publish plugin 再润 (#2815) 2024-07-15 14:20:12 +00:00
noneflow[bot]
070ad18781 📝 Update changelog 2024-07-13 13:10:45 +00:00
Shenyi Chen
56119ef1cc ✏️ Plugin: 更新插件 sparkapi 信息 (#2812) 2024-07-13 21:09:41 +08:00
noneflow[bot]
30195a35dc 📝 Update changelog 2024-07-13 12:07:10 +00:00
Asankilp
0500b7baab 🍻 publish plugin 漫展/展览查询 (#2810) 2024-07-13 12:06:04 +00:00
noneflow[bot]
08473a5c25 📝 Update changelog 2024-07-11 09:47:40 +00:00
Lumine
37ad14c277 ✏️ Plugin: 修改插件 miragetank & charpic 信息 (#2807) 2024-07-11 17:46:41 +08:00
noneflow[bot]
3e8c6ce541 📝 Update changelog 2024-07-11 09:41:38 +00:00
shi-yingyingjiang
3dd5539dc7 🍻 publish plugin 鸣潮wiki (#2801) 2024-07-11 09:40:36 +00:00
noneflow[bot]
559a0320a8 📝 Update changelog 2024-07-11 09:34:58 +00:00
1v7w
8646d885f0 🍻 publish plugin cloudfare R2 客服端 (#2805) 2024-07-11 09:33:53 +00:00
noneflow[bot]
84c008cdce 📝 Update changelog 2024-07-10 13:41:24 +00:00
QuickLAW
2671cb5b72 🍻 publish plugin AnyMate小助手 (#2760) 2024-07-10 13:40:12 +00:00
noneflow[bot]
379440708f 📝 Update changelog 2024-07-06 12:54:50 +00:00
noneflow[bot]
4d070f5b48 🔖 Release 2.3.2 2024-07-06 12:34:00 +00:00
Ju4tCode
82138454bc 🔖 bump version 2.3.2 (#2799) 2024-07-06 20:24:00 +08:00
noneflow[bot]
d98fe53d56 📝 Update changelog 2024-07-05 12:49:09 +00:00
Komorebi
278b9e92c2 📝 Docs: 修改导航栏开源之夏链接 (#2798) 2024-07-05 20:48:06 +08:00
noneflow[bot]
45418ccfae 📝 Update changelog 2024-07-04 15:06:15 +00:00
fallllllllsleep
2ad2922565 📝 Docs: on_keyword 参数类型错误 (#2795)
Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
2024-07-04 23:04:58 +08:00
pre-commit-ci[bot]
84ebcb4ce6 ⬆️ auto update by pre-commit hooks (#2794)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-07-02 21:50:54 +08:00
noneflow[bot]
6a0caacfd6 📝 Update changelog 2024-07-02 13:30:22 +00:00
tianyisama
a8f3940cbc 🍻 publish plugin 指令更新NapCat (#2790) 2024-07-02 13:29:12 +00:00
noneflow[bot]
15d3910462 📝 Update changelog 2024-07-01 13:18:15 +00:00
Autuamn
edfd0eb887 🍻 publish plugin QQ群-Discord 互通 (#2787) 2024-07-01 13:17:10 +00:00
noneflow[bot]
fe63717848 📝 Update changelog 2024-06-28 12:30:26 +00:00
Dongyanmio
63424bc3ac 🍻 publish plugin nonebot_plugin_obastatus (#2779) 2024-06-28 12:29:23 +00:00
noneflow[bot]
99b1d0ed96 📝 Update changelog 2024-06-25 15:18:44 +00:00
BraveCowardp
90c7fd4747 🍻 publish plugin b站消息转发 (#2784) 2024-06-25 15:17:40 +00:00
noneflow[bot]
c1a9758a18 📝 Update changelog 2024-06-25 15:06:02 +00:00
WMGray
17e7a0c029 🍻 publish plugin Daily Task (#2768) 2024-06-25 15:04:50 +00:00
noneflow[bot]
df6a948c08 📝 Update changelog 2024-06-25 14:05:42 +00:00
zifox666
9f19eb7a96 🍻 publish plugin EVE ONLINE 多功能机器人 (#2781) 2024-06-25 14:04:38 +00:00
noneflow[bot]
2b68428526 📝 Update changelog 2024-06-25 13:45:54 +00:00
kanbereina
d62c6561c2 🍻 publish plugin NTQQ自动登录/断连重启 (#2783) 2024-06-25 13:44:51 +00:00
noneflow[bot]
fc3bb5ff1f 📝 Update changelog 2024-06-25 13:13:53 +00:00
CCYellowStar2
76b1bbb443 🍻 publish plugin asmr (#2774) 2024-06-25 13:12:48 +00:00
noneflow[bot]
7b724925ba 📝 Update changelog 2024-06-20 12:50:21 +00:00
uy/sun
62dc2574c7 🐛 Fix: 修复 ForwardRef eval 时参数 recursive_guard 缺失 (#2778) 2024-06-20 20:49:17 +08:00
noneflow[bot]
ea40ae3a18 📝 Update changelog 2024-06-19 18:08:39 +00:00
ElainaFanBoy
f94e7d9b5b 🍻 publish plugin 日麻猜手牌小游戏 (#2776) 2024-06-19 18:07:12 +00:00
noneflow[bot]
c8ba973280 📝 Update changelog 2024-06-19 10:08:21 +00:00
SherkeyXD
35e062c588 🍻 publish plugin 绝地潜兵信息查询小助手 (#2771) 2024-06-19 10:07:19 +00:00
noneflow[bot]
53724487d3 📝 Update changelog 2024-06-19 08:56:41 +00:00
LiLuo-B
a3003b0ff6 🍻 publish plugin MCSM小助手 (#2770) 2024-06-19 08:55:32 +00:00
noneflow[bot]
96ecd415cd 📝 Update changelog 2024-06-18 21:42:46 +00:00
syagina
e8ef4735ea 🍻 publish plugin 多模态AI工具 (#2754) 2024-06-18 21:41:43 +00:00
noneflow[bot]
b78b08ed81 📝 Update changelog 2024-06-14 14:23:26 +00:00
phquathi
e11ea52276 🍻 publish plugin nonebot-plugin-easymarkdown (#2766) 2024-06-14 14:22:20 +00:00
noneflow[bot]
819e7334b2 📝 Update changelog 2024-06-14 14:08:12 +00:00
AzideCupric
1ebafaa9a5 🍻 publish plugin 峯驰外包 (#2764) 2024-06-14 14:07:04 +00:00
noneflow[bot]
3554292d5f 📝 Update changelog 2024-06-12 11:08:37 +00:00
BraveCowardp
ec9ef9a760 🍻 publish plugin 鸣潮抽卡记录分析 (#2762) 2024-06-12 11:07:23 +00:00
noneflow[bot]
74663c7c5e 📝 Update changelog 2024-06-11 13:48:36 +00:00
ajdgg
cbc99be031 🍻 publish plugin nonebot-plugin-xjie-weather (#2755) 2024-06-11 13:47:34 +00:00
noneflow[bot]
81e9bdd7ec 📝 Update changelog 2024-06-08 04:39:27 +00:00
KomoriDev
323038ecc6 🍻 publish plugin 颜值评分 (#2751) 2024-06-08 04:38:23 +00:00
noneflow[bot]
7091beb809 📝 Update changelog 2024-06-07 09:42:23 +00:00
ikarosf
010c48d30f 🍻 publish plugin 学园偶像大师算分插件 (#2749) 2024-06-07 09:41:19 +00:00
noneflow[bot]
a5b2dd38d5 📝 Update changelog 2024-06-05 13:38:04 +00:00
050644zf
fa5f295fe7 🍻 publish plugin nonebot-plugin-lynchpined (#2747) 2024-06-05 13:36:59 +00:00
pre-commit-ci[bot]
7f7b23bd2f ⬆️ auto update by pre-commit hooks (#2746)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-06-04 10:40:10 +08:00
noneflow[bot]
0434e12b8a 📝 Update changelog 2024-06-03 04:39:22 +00:00
yejue
425d140161 🍻 publish plugin QQShell (#2744) 2024-06-03 04:38:08 +00:00
noneflow[bot]
64d8f7843a 📝 Update changelog 2024-06-02 14:31:34 +00:00
CCYellowStar2
a0a6427540 🍻 publish plugin ai唱歌 (#2742) 2024-06-02 14:30:24 +00:00
noneflow[bot]
31fe8e6582 📝 Update changelog 2024-05-30 06:14:11 +00:00
mobyw
38e42919b7 📝 Docs: 修复单元测试示例代码 (#2741) 2024-05-30 14:13:11 +08:00
noneflow[bot]
c769f95688 📝 Update changelog 2024-05-29 12:53:55 +00:00
yejue
d642897a5b 🍻 publish plugin 复读姬+1 PlusOne (#2731) 2024-05-29 12:52:45 +00:00
noneflow[bot]
d7931f8ec2 📝 Update changelog 2024-05-27 13:22:56 +00:00
Sclock
8a0b989718 🍻 publish plugin 高优先级关闭信号钩子插件 (#2736) 2024-05-27 13:21:55 +00:00
noneflow[bot]
4fbbb646c3 📝 Update changelog 2024-05-25 14:17:07 +00:00
cubstaryow
75856e63f6 🍻 publish plugin 插件响应鉴权 (#2726) 2024-05-25 14:16:03 +00:00
noneflow[bot]
98213f50db 📝 Update changelog 2024-05-25 04:21:01 +00:00
Weltolk
5bce1db24e 📝 Docs: 修改依赖注入定义链接 (#2733) 2024-05-25 12:19:48 +08:00
noneflow[bot]
380ace5780 📝 Update changelog 2024-05-21 20:14:18 +00:00
Ljzd-PRO
6e5b01a3d4 🍻 publish plugin DG-Lab-Play (#2728) 2024-05-21 20:13:16 +00:00
noneflow[bot]
622e8e8af3 🔖 Release 2.3.1 2024-05-20 14:19:50 +00:00
Ju4tCode
2bbb83d3f2 🔖 bump version 2.3.1 (#2725) 2024-05-20 22:09:51 +08:00
noneflow[bot]
54756134d4 📝 Update changelog 2024-05-20 13:31:40 +00:00
Alpaca4610
932b212e04 🍻 publish plugin 自定义人格和AI绘图的混合聊天BOT (#2723) 2024-05-20 13:30:32 +00:00
noneflow[bot]
3b40e5b20c 📝 Update changelog 2024-05-18 15:32:15 +00:00
ajdgg
f594db207d 🍻 publish plugin nonebot-plugin-calc24 (#2720) 2024-05-18 15:31:14 +00:00
noneflow[bot]
70e23427e8 📝 Update changelog 2024-05-18 14:47:10 +00:00
WindowsSov8forUs
c1a303fd3d 🍻 publish plugin nonebot-plugin-tsugu-bangdream-bot (#2718) 2024-05-18 14:46:02 +00:00
noneflow[bot]
a62b9a5e1a 📝 Update changelog 2024-05-18 03:44:44 +00:00
Komorebi
36eece311a 📝 Docs: 修正 匹配扩展 中的示例 (#2722) 2024-05-18 11:43:39 +08:00
noneflow[bot]
29ea5f5787 📝 Update changelog 2024-05-17 05:58:08 +00:00
CCLMSY
c00e3aacfc 🍻 publish plugin 科大讯飞星火大语言模型官方API聊天机器人插件 (#2716) 2024-05-17 05:57:07 +00:00
noneflow[bot]
cf9f78528c 📝 Update changelog 2024-05-15 02:03:18 +00:00
Tarrailt
68d4795de6 📝 Docs: 更新 Mirai 适配器说明 (#2715)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-05-15 10:02:12 +08:00
noneflow[bot]
e689d7f7d2 📝 Update changelog 2024-05-14 17:06:21 +00:00
RF-Tar-Railt
a607f868c2 🍻 publish adapter Mirai (#2713) 2024-05-14 17:05:19 +00:00
noneflow[bot]
84ac1c4bad 📝 Update changelog 2024-05-14 15:27:34 +00:00
worldmozara
e11ff528e2 🗑️ 移除已在 PyPI 上删除的 covid 插件和 molar-mass 插件 (#2712) 2024-05-14 23:26:26 +08:00
noneflow[bot]
047f4d1878 📝 Update changelog 2024-05-14 04:28:53 +00:00
LiLuo-B
0294c33baf 🍻 publish plugin nonebot_plugin_valve_server_query (#2710) 2024-05-14 04:27:43 +00:00
noneflow[bot]
11a8b6e40b 📝 Update changelog 2024-05-13 14:06:07 +00:00
ConcyWee
cade86b62a 🍻 publish plugin 库洛游戏信息 (#2702) 2024-05-13 14:04:58 +00:00
noneflow[bot]
df836ec1c6 📝 Update changelog 2024-05-12 09:46:03 +00:00
zhaomaoniu
12cc00a3d3 🍻 publish plugin BanG Dream! Tsugu Frontend (#2707) 2024-05-12 09:45:00 +00:00
noneflow[bot]
24aa81f0be 📝 Update changelog 2024-05-12 09:33:27 +00:00
Yan-Zero
339706a3a6 🍻 publish plugin 神秘学助手 (#2699) 2024-05-12 09:32:25 +00:00
noneflow[bot]
b43c9adb7a 📝 Update changelog 2024-05-12 02:42:57 +00:00
Ekac00
c2783039d4 🍻 publish plugin nonebot-plugin-furryfusion (#2704) 2024-05-12 02:41:50 +00:00
noneflow[bot]
c4706e4123 📝 Update changelog 2024-05-12 02:30:10 +00:00
Ekac00
8a997540b3 🍻 publish plugin nonebot-plugin-RanFurryPic (#2701) 2024-05-12 02:28:59 +00:00
noneflow[bot]
045022b22a 📝 Update changelog 2024-05-09 07:10:05 +00:00
Ju4tCode
723fa4b3d8 🐛 Fix: State ForwardRef 检测错误 (#2698) 2024-05-09 15:08:49 +08:00
noneflow[bot]
41b59cff06 📝 Update changelog 2024-05-09 02:38:47 +00:00
yejue
bed1b46527 🍻 publish plugin with_ai_agents (#2696) 2024-05-09 02:37:44 +00:00
pre-commit-ci[bot]
ad695ca6e8 ⬆️ auto update by pre-commit hooks (#2695)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-05-07 13:35:53 +08:00
noneflow[bot]
33e997708c 📝 Update changelog 2024-05-05 05:48:08 +00:00
zhaomaoniu
56b6ee1d38 🍻 publish plugin nonebot_plugin_anime_downloader (#2690) 2024-05-05 05:47:03 +00:00
noneflow[bot]
27b2cf52a5 📝 Update changelog 2024-05-05 04:56:01 +00:00
eya46
b532130f6e 📝 Docs: 添加 Tailchat 适配器说明 (#2694)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
2024-05-05 12:54:51 +08:00
noneflow[bot]
d16b8594ad 📝 Update changelog 2024-05-05 04:42:08 +00:00
eya46
ad8442c6de 🍻 publish adapter Tailchat (#2692) 2024-05-05 04:40:57 +00:00
noneflow[bot]
4edf7e2c2c 📝 Update changelog 2024-05-01 14:29:42 +00:00
StarHeart
ea49318809 📝 Docs: 添加 uwu logo (#2689) 2024-05-01 22:28:36 +08:00
239 changed files with 7867 additions and 2084 deletions

View File

@@ -0,0 +1,99 @@
name: Site Deploy (Preview CD)
on:
workflow_run:
workflows: ["Site Deploy (Preview CI)"]
types:
- completed
jobs:
preview-cd:
runs-on: ubuntu-latest
concurrency:
group: pull-request-preview-${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}
cancel-in-progress: true
if: ${{ github.event.workflow_run.conclusion == 'success' }}
environment: pull request
permissions:
actions: read
statuses: write
pull-requests: write
steps:
- name: Set Commit Status
uses: actions/github-script@v7
with:
script: |
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: context.payload.workflow_run.head_sha,
context: 'Website Preview',
description: 'Deploying...',
state: 'pending',
})
- name: Download Artifact
uses: actions/download-artifact@v4
with:
name: website-preview
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}
- name: Restore Context
run: |
cat action.env >> $GITHUB_ENV
- name: Set Deploy Name
run: |
echo "DEPLOY_NAME=deploy-preview-${{ env.PR_NUMBER }}" >> $GITHUB_ENV
- name: Deploy to Netlify
id: deploy
uses: nwtgck/actions-netlify@v3
with:
publish-dir: ./website/build
production-deploy: false
deploy-message: "Deploy ${{ env.DEPLOY_NAME }}@${{ github.event.workflow_run.head_sha }}"
alias: ${{ env.DEPLOY_NAME }}
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.SITE_ID }}
# action netlify has no pull request context, so we need to comment by ourselves
- name: Comment on Pull Request
uses: marocchino/sticky-pull-request-comment@v2
with:
header: website
number: ${{ env.PR_NUMBER }}
message: |
:rocket: Deployed to ${{ steps.deploy.outputs.deploy-url }}
- name: Set Commit Status
uses: actions/github-script@v7
if: always()
with:
script: |
if (`${{ job.status }}` === 'success') {
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: context.payload.workflow_run.head_sha,
context: 'Website Preview',
description: `Deployed to ${{ steps.deploy.outputs.deploy-url }}`,
state: 'success',
target_url: `${{ steps.deploy.outputs.deploy-url }}`,
})
} else {
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: context.payload.workflow_run.head_sha,
context: 'Website Preview',
description: `Deploy ${{ job.status }}`,
state: 'failure',
})
}

View File

@@ -0,0 +1,42 @@
name: Site Deploy (Preview CI)
on:
pull_request:
jobs:
preview-ci:
runs-on: ubuntu-latest
concurrency:
group: pull-request-preview-${{ github.event.number }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Setup Python Environment
uses: ./.github/actions/setup-python
- name: Setup Node Environment
uses: ./.github/actions/setup-node
- name: Build API Doc
uses: ./.github/actions/build-api-doc
- name: Build Doc
run: yarn build
- name: Export Context
run: |
echo "PR_NUMBER=${{ github.event.number }}" >> ./action.env
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: website-preview
path: |
./website/build
./action.env
retention-days: 1

View File

@@ -1,46 +0,0 @@
name: Site Deploy(Preview)
on:
pull_request_target:
jobs:
preview:
runs-on: ubuntu-latest
concurrency:
group: pull-request-preview-${{ github.event.number }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Setup Python Environment
uses: ./.github/actions/setup-python
- name: Setup Node Environment
uses: ./.github/actions/setup-node
- name: Build API Doc
uses: ./.github/actions/build-api-doc
- name: Build Doc
run: yarn build
- name: Get Deploy Name
run: |
echo "DEPLOY_NAME=deploy-preview-${{ github.event.number }}" >> $GITHUB_ENV
- name: Deploy to Netlify
uses: nwtgck/actions-netlify@v3
with:
publish-dir: "./website/build"
production-deploy: false
github-token: ${{ secrets.GITHUB_TOKEN }}
deploy-message: "Deploy ${{ env.DEPLOY_NAME }}@${{ github.sha }}"
enable-commit-comment: false
alias: ${{ env.DEPLOY_NAME }}
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.SITE_ID }}

View File

@@ -7,7 +7,7 @@ ci:
autoupdate_commit_msg: ":arrow_up: auto update by pre-commit hooks" autoupdate_commit_msg: ":arrow_up: auto update by pre-commit hooks"
repos: repos:
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.4.2 rev: v0.5.6
hooks: hooks:
- id: ruff - id: ruff
args: [--fix, --exit-non-zero-on-fix] args: [--fix, --exit-non-zero-on-fix]
@@ -20,7 +20,7 @@ repos:
stages: [commit] stages: [commit]
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 24.4.2 rev: 24.8.0
hooks: hooks:
- id: black - id: black
stages: [commit] stages: [commit]

View File

@@ -123,6 +123,7 @@ NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架
| Discord[仓库](https://github.com/nonebot/adapter-discord)[协议](https://discord.com/developers/docs/intro) | ✅ | Discord Bot 协议 | | Discord[仓库](https://github.com/nonebot/adapter-discord)[协议](https://discord.com/developers/docs/intro) | ✅ | Discord Bot 协议 |
| DoDo[仓库](https://github.com/nonebot/adapter-dodo)[协议](https://open.imdodo.com/) | ✅ | DoDo Bot 协议 | | DoDo[仓库](https://github.com/nonebot/adapter-dodo)[协议](https://open.imdodo.com/) | ✅ | DoDo Bot 协议 |
| Kritor[仓库](https://github.com/nonebot/adapter-kritor)[协议](https://github.com/KarinJS/kritor) | ✅ | Kritor (OnebotX) 协议QQ 机器人接口标准 | | Kritor[仓库](https://github.com/nonebot/adapter-kritor)[协议](https://github.com/KarinJS/kritor) | ✅ | Kritor (OnebotX) 协议QQ 机器人接口标准 |
| Mirai[仓库](https://github.com/nonebot/adapter-mirai)[协议](https://docs.mirai.mamoe.net/mirai-api-http/) | ✅ | QQ 协议 |
| 钉钉([仓库](https://github.com/nonebot/adapter-ding)[协议](https://open.dingtalk.com/document/) | 🤗 | 寻找 Maintainer暂不可用 | | 钉钉([仓库](https://github.com/nonebot/adapter-ding)[协议](https://open.dingtalk.com/document/) | 🤗 | 寻找 Maintainer暂不可用 |
| 开黑啦([仓库](https://github.com/Tian-que/nonebot-adapter-kaiheila)[协议](https://developer.kookapp.cn/) | ↗️ | 由社区贡献 | | 开黑啦([仓库](https://github.com/Tian-que/nonebot-adapter-kaiheila)[协议](https://developer.kookapp.cn/) | ↗️ | 由社区贡献 |
| Mirai[仓库](https://github.com/ieew/nonebot_adapter_mirai2)[协议](https://docs.mirai.mamoe.net/mirai-api-http/) | ↗️ | QQ 协议,由社区贡献 | | Mirai[仓库](https://github.com/ieew/nonebot_adapter_mirai2)[协议](https://docs.mirai.mamoe.net/mirai-api-http/) | ↗️ | QQ 协议,由社区贡献 |
@@ -132,6 +133,7 @@ NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架
| Walle-Q[仓库](https://github.com/onebot-walle/nonebot_adapter_walleq) | ↗️ | QQ 协议,由社区贡献 | | Walle-Q[仓库](https://github.com/onebot-walle/nonebot_adapter_walleq) | ↗️ | QQ 协议,由社区贡献 |
| Villa[仓库](https://github.com/CMHopeSunshine/nonebot-adapter-villa) | ❌ | 米游社大别野 Bot 协议,官方已下线 | | Villa[仓库](https://github.com/CMHopeSunshine/nonebot-adapter-villa) | ❌ | 米游社大别野 Bot 协议,官方已下线 |
| Rocket.Chat[仓库](https://github.com/IUnlimit/nonebot-adapter-rocketchat)[协议](https://developer.rocket.chat/) | ↗️ | Rocket.Chat Bot 协议,由社区贡献 | | Rocket.Chat[仓库](https://github.com/IUnlimit/nonebot-adapter-rocketchat)[协议](https://developer.rocket.chat/) | ↗️ | Rocket.Chat Bot 协议,由社区贡献 |
| Tailchat[仓库](https://github.com/eya46/nonebot-adapter-tailchat)[协议](https://tailchat.msgbyte.com/) | ↗️ | Tailchat 开放平台 Bot 协议,由社区贡献 |
- 坚实后盾:支持多种 web 框架,可自定义替换、组合 - 坚实后盾:支持多种 web 框架,可自定义替换、组合

View File

@@ -59,6 +59,16 @@
"tags": [], "tags": [],
"is_official": false "is_official": false
}, },
{
"module_name": "nonebot.adapters.mirai",
"project_link": "nonebot-adapter-mirai",
"name": "Mirai",
"desc": "mirai-api-http v2 协议适配",
"author": "RF-Tar-Railt",
"homepage": "https://github.com/nonebot/adapter-mirai",
"tags": [],
"is_official": true
},
{ {
"module_name": "nonebot.adapters.mirai2", "module_name": "nonebot.adapters.mirai2",
"project_link": "nonebot_adapter_mirai2", "project_link": "nonebot_adapter_mirai2",
@@ -238,5 +248,15 @@
} }
], ],
"is_official": true "is_official": true
},
{
"module_name": "nonebot_adapter_tailchat",
"project_link": "nonebot-adapter-tailchat",
"name": "Tailchat",
"desc": "Tailchat 适配器",
"author": "eya46",
"homepage": "https://github.com/eya46/nonebot-adapter-tailchat",
"tags": [],
"is_official": false
} }
] ]

View File

@@ -607,5 +607,30 @@
} }
], ],
"is_official": false "is_official": false
},
{
"name": "星辰 Bot",
"desc": "欢迎使用 星辰 Bot 项目!这是一款基于 NoneBot2 打造的智能 QQ 机器人旨在为用户提供丰富的功能体验。无论是获取一言的灵感探索历史上的今天还是穿梭60s世界星辰 Bot 为您打开了全新的交流之门。快来尝试吧!",
"author": "StarXinXin",
"homepage": "https://github.com/StarXinXin/StarsBot",
"tags": [],
"is_official": false
},
{
"name": "Minecraft_QQBot",
"desc": "基于 NoneBot2 的 Minecraft 群服互联 QQ 机器人,支持多服务器多种方式连接。",
"author": "Lonely-Sails",
"homepage": "https://github.com/Minecraft-QQBot/BotServer",
"tags": [
{
"label": "Minecraft",
"color": "#ea5252"
},
{
"label": "娱乐",
"color": "#37a7e7"
}
],
"is_official": false
} }
] ]

View File

@@ -855,22 +855,33 @@
{ {
"module_name": "nonebot_plugin_charpic", "module_name": "nonebot_plugin_charpic",
"project_link": "nonebot-plugin-charpic", "project_link": "nonebot-plugin-charpic",
"author": "RafuiiChan", "author": "1umine",
"tags": [], "tags": [
{
"label": "字符画",
"color": "#ea5252"
},
{
"label": "多平台适配",
"color": "#ea5252"
}
],
"is_official": false "is_official": false
}, },
{ {
"module_name": "nonebot_plugin_miragetank", "module_name": "nonebot_plugin_miragetank",
"project_link": "nonebot-plugin-miragetank", "project_link": "nonebot-plugin-miragetank",
"author": "RafuiiChan", "author": "1umine",
"tags": [], "tags": [
"is_official": false {
}, "label": "幻影坦克",
{ "color": "#ea5252"
"module_name": "nonebot_plugin_covid", },
"project_link": "nonebot-plugin-covid", {
"author": "nicklly", "label": "多平台适配",
"tags": [], "color": "#ea5252"
}
],
"is_official": false "is_official": false
}, },
{ {
@@ -2543,13 +2554,6 @@
"tags": [], "tags": [],
"is_official": false "is_official": false
}, },
{
"module_name": "nonebot_plugin_molar_mass",
"project_link": "nonebot-plugin-molar-mass",
"author": "kifuan",
"tags": [],
"is_official": false
},
{ {
"module_name": "nonebot_plugin_report_manager", "module_name": "nonebot_plugin_report_manager",
"project_link": "nonebot-plugin-report-manager", "project_link": "nonebot-plugin-report-manager",
@@ -4568,18 +4572,6 @@
], ],
"is_official": false "is_official": false
}, },
{
"module_name": "nonebot_plugin_kanonbot",
"project_link": "nonebot-plugin-kanonbot",
"author": "SuperGuGuGu",
"tags": [
{
"label": "KanonBot",
"color": "#44ddff"
}
],
"is_official": false
},
{ {
"module_name": "nonebot_plugin_mcversion", "module_name": "nonebot_plugin_mcversion",
"project_link": "nonebot-plugin-mcversion", "project_link": "nonebot-plugin-mcversion",
@@ -5577,7 +5569,7 @@
{ {
"module_name": "nonebot_plugin_fishing", "module_name": "nonebot_plugin_fishing",
"project_link": "nonebot-plugin-fishing", "project_link": "nonebot-plugin-fishing",
"author": "C14H22O", "author": "ALittleBot",
"tags": [ "tags": [
{ {
"label": "钓鱼", "label": "钓鱼",
@@ -5903,5 +5895,822 @@
} }
], ],
"is_official": false "is_official": false
},
{
"module_name": "nonebot_plugin_anime_downloader",
"project_link": "nonebot-plugin-anime-downloader",
"author": "zhaomaoniu",
"tags": [
{
"label": "Anime",
"color": "#ff7474"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_with_ai_agents",
"project_link": "nonebot-plugin-with-ai-agents",
"author": "yejue",
"tags": [
{
"label": "AI 智能体",
"color": "#5dac81"
},
{
"label": "多平台模型",
"color": "#5dac81"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_RanFurryPic",
"project_link": "nonebot-plugin-RanFurryPic",
"author": "Ekac00",
"tags": [
{
"label": "furry",
"color": "#8cb9e3"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_furryfusion",
"project_link": "nonebot-plugin-furryfusion",
"author": "Ekac00",
"tags": [
{
"label": "furry",
"color": "#8cb9e3"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_mysticism",
"project_link": "nonebot-plugin-mysticism",
"author": "Yan-Zero",
"tags": [
{
"label": "占卜",
"color": "#ea5252"
},
{
"label": "tarot",
"color": "#ea5252"
},
{
"label": "神秘学",
"color": "#2d4168"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_tsugu_frontend",
"project_link": "nonebot-plugin-tsugu-frontend",
"author": "zhaomaoniu",
"tags": [
{
"label": "BanGDream",
"color": "#e70050"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_kurogames",
"project_link": "nonebot-plugin-kurogames",
"author": "ConcyWee",
"tags": [
{
"label": "战双帕弥什",
"color": "#ea5252"
},
{
"label": "鸣潮",
"color": "#ea5252"
},
{
"label": "库洛",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_valve_server_query",
"project_link": "nonebot-plugin-valve-server-query",
"author": "LiLuo-B",
"tags": [
{
"label": "valve",
"color": "#ea5252"
},
{
"label": "query",
"color": "#ea5252"
},
{
"label": "a2s",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_sparkapi",
"project_link": "nonebot-plugin-sparkapi",
"author": "CCLMSY",
"tags": [
{
"label": "AI",
"color": "#00ff00"
},
{
"label": "星火",
"color": "#0000ff"
},
{
"label": "Chat",
"color": "#ff0000"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_tsugu_bangdream_bot",
"project_link": "nonebot-plugin-tsugu-bangdream-bot",
"author": "WindowsSov8forUs",
"tags": [
{
"label": "tsugu",
"color": "#ffee88"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_calc24",
"project_link": "nonebot-plugin-calc24",
"author": "ajdgg",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_nai3_bot",
"project_link": "nonebot-plugin-nai3-bot",
"author": "Alpaca4610",
"tags": [
{
"label": "NovelAI",
"color": "#52ea52"
},
{
"label": "NAI3",
"color": "#52ea52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_dg_lab_play",
"project_link": "nonebot-plugin-dg-lab-play",
"author": "Ljzd-PRO",
"tags": [
{
"label": "dg-lab",
"color": "#fee99d"
},
{
"label": "dg-lab-v3",
"color": "#fee99d"
},
{
"label": "t:game",
"color": "#019bf1"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_authrespond",
"project_link": "nonebot-plugin-authrespond",
"author": "cubstaryow",
"tags": [
{
"label": "黑名单",
"color": "#e81616"
},
{
"label": "cubplugins",
"color": "#28a5d1"
},
{
"label": "权限控制",
"color": "#c75d59"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_shutdown_hook",
"project_link": "nonebot-plugin-shutdown-hook",
"author": "Sclock",
"tags": [
{
"label": "工具",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_plus_one",
"project_link": "nonebot-plugin-plus-one",
"author": "yejue",
"tags": [
{
"label": "复读姬",
"color": "#df3cda"
},
{
"label": "船新版本",
"color": "#28d98e"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_aising",
"project_link": "nonebot-plugin-aising",
"author": "CCYellowStar2",
"tags": [
{
"label": "唱歌",
"color": "#ea5252"
},
{
"label": "NeuCoSVC",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_qqshell",
"project_link": "nonebot-plugin-qqshell",
"author": "yejue",
"tags": [
{
"label": "SSH",
"color": "#cd2a8f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_lynchpined",
"project_link": "nonebot-plugin-lynchpined",
"author": "050644zf",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_gakuenImasCalculator",
"project_link": "nonebot-plugin-gakuenImasCalculator",
"author": "ikarosf",
"tags": [
{
"label": "游戏",
"color": "#ea5252"
},
{
"label": "工具",
"color": "#ea5f52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_beauty_rater",
"project_link": "nonebot-plugin-beauty-rater",
"author": "KomoriDev",
"tags": [
{
"label": "🌐",
"color": "#e7f4ff"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_xjie_weather",
"project_link": "nonebot-plugin-xjie-weather",
"author": "ajdgg",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_wwgachalogs",
"project_link": "nonebot-plugin-wwgachalogs",
"author": "BraveCowardp",
"tags": [
{
"label": "鸣潮",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_saalc",
"project_link": "nonebot-plugin-saalc",
"author": "AzideCupric",
"tags": [
{
"label": "SAA",
"color": "#17a5fe"
},
{
"label": "Alconna",
"color": "#fe9517"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_easymarkdown",
"project_link": "nonebot-plugin-easymarkdown",
"author": "phquathi",
"tags": [
{
"label": "code",
"color": "#5284ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_multigpt",
"project_link": "nonebot-plugin-multigpt",
"author": "syagina",
"tags": [
{
"label": "GPT",
"color": "#52d7ea"
},
{
"label": "PPT",
"color": "#ea52c7"
},
{
"label": "多模",
"color": "#eac252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_mcsm",
"project_link": "nonebot-plugin-mcsm",
"author": "LiLuo-B",
"tags": [
{
"label": "MCSM",
"color": "#ea5252"
},
{
"label": "应用托管",
"color": "#5272ea"
},
{
"label": "服务器管理",
"color": "#4cc275"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_helldivers",
"project_link": "nonebot-plugin-helldivers",
"author": "SherkeyXD",
"tags": [
{
"label": "helldivers",
"color": "#ffd700"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_mahjong_hand_guess",
"project_link": "nonebot-plugin-mahjong-hand-guess",
"author": "ElainaFanBoy",
"tags": [
{
"label": "game",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_asmr",
"project_link": "nonebot-plugin-asmr",
"author": "CCYellowStar2",
"tags": [
{
"label": "asmr",
"color": "#ea5252"
},
{
"label": "音声",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_ntqq_restart",
"project_link": "nonebot-plugin-ntqq-restart",
"author": "kanbereina",
"tags": [
{
"label": "llonebot",
"color": "#f9e642"
},
{
"label": "NTQQ",
"color": "#ede9e9"
},
{
"label": "Windows",
"color": "#52aaea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_eve_tool",
"project_link": "nonebot-plugin-eve-tool",
"author": "zifox666",
"tags": [
{
"label": "game",
"color": "#ea5252"
},
{
"label": "eve",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_daily_task",
"project_link": "nonebot-plugin-daily-task",
"author": "WMGray",
"tags": [
{
"label": "每日任务",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_biliforward",
"project_link": "nonebot-plugin-biliforward",
"author": "BraveCowardp",
"tags": [
{
"label": "bilibili",
"color": "#ea5252"
},
{
"label": "哔哩哔哩",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_obastatus",
"project_link": "nonebot-plugin-obastatus",
"author": "Dongyanmio",
"tags": [
{
"label": "BMCLAPI",
"color": "#5f82ba"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_dcqq_relay",
"project_link": "nonebot-plugin-dcqq-relay",
"author": "Autuamn",
"tags": [
{
"label": "消息互通",
"color": "#428fdb"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_ncupdate",
"project_link": "nonebot-plugin-ncupdate",
"author": "tianyisama",
"tags": [
{
"label": "NapCat",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_anymate",
"project_link": "nonebot-plugin-anymate",
"author": "QuickLAW",
"tags": [
{
"label": "server",
"color": "#ea5252"
},
{
"label": "func",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_cfr2",
"project_link": "nonebot-plugin-cfr2",
"author": "1v7w",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_WWwiki",
"project_link": "nonebot-plugin-WWwiki",
"author": "shi-yingyingjiang",
"tags": [
{
"label": "鸣潮",
"color": "#ea5252"
},
{
"label": "wiki",
"color": "#30af29"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_acgnshow",
"project_link": "nonebot-plugin-acgnshow",
"author": "Asankilp",
"tags": [
{
"label": "bilibili",
"color": "#f21010"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_runagain",
"project_link": "nonebot-plugin-runagain",
"author": "NCBM",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_wordle_simple",
"project_link": "nonebot-plugin-wordle-simple",
"author": "shiyihang2007",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_daily_oil_price",
"project_link": "nonebot-plugin-daily-oil-price",
"author": "wyeeeee",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_game_torrent",
"project_link": "nonebot-plugin-game-torrent",
"author": "Cvandia",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_weiweibot",
"project_link": "nonebot-plugin-weiweibot",
"author": "SwedishDoveCooker",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_autopush",
"project_link": "nonebot-plugin-autopush",
"author": "This-is-XiaoDeng",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_exe_code",
"project_link": "nonebot-plugin-exe-code",
"author": "wyf7685",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_system_command",
"project_link": "nonebot-plugin-system-command",
"author": "tkgs0",
"tags": [
{
"label": "shell",
"color": "#0078d4"
},
{
"label": "cmd",
"color": "#24292f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_cogvideox",
"project_link": "nonebot-plugin-cogvideox",
"author": "Alpaca4610",
"tags": [
{
"label": "AI",
"color": "#ea5252"
},
{
"label": "视频生成",
"color": "#1a30b7"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_gpt_sovits",
"project_link": "nonebot-plugin-gpt-sovits",
"author": "zhaomaoniu",
"tags": [
{
"label": "GPT-SoVITS",
"color": "#000000"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_wakatime",
"project_link": "nonebot-plugin-wakatime",
"author": "KomoriDev",
"tags": [
{
"label": "WakaTime",
"color": "#000000"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_sunoai",
"project_link": "nonebot-plugin-sunoai",
"author": "CCYellowStar2",
"tags": [
{
"label": "SunoAi",
"color": "#ea5252"
},
{
"label": "AI歌曲",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_function",
"project_link": "nonebot-plugin-function",
"author": "zhongwen-4",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_web_bottle",
"project_link": "nonebot-plugin-web-bottle",
"author": "luosheng520qaq",
"tags": [
{
"label": "漂流瓶",
"color": "#689dd0"
},
{
"label": "审核",
"color": "#e3567b"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_deer_pipe",
"project_link": "nonebot-plugin-deer-pipe",
"author": "SamuNatsu",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_alist",
"project_link": "nonebot-plugin-alist",
"author": "iam57ao",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_bili_fav_watcher",
"project_link": "nonebot-plugin-bili-fav-watcher",
"author": "kawaiior",
"tags": [
{
"label": "bilibili",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_essence_message",
"project_link": "nonebot-plugin-essence-message",
"author": "BEISNWKZNAN",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_ba_tools",
"project_link": "nonebot-plugin-ba-tools",
"author": "hanasa2023",
"tags": [
{
"label": "蔚蓝档案",
"color": "#00fcf8"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_fakepic",
"project_link": "nonebot-plugin-fakepic",
"author": "lm175",
"tags": [
{
"label": "图片生成",
"color": "#3a82ff"
}
],
"is_official": false
},
{
"module_name": "pokepoke_miss",
"project_link": "pokepoke-miss",
"author": "shengwang52005",
"tags": [
{
"label": "舞萌",
"color": "#f7fe0e"
},
{
"label": "戳一戳",
"color": "#e80606"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_ehentai_search",
"project_link": "nonebot-plugin-ehentai-search",
"author": "N791",
"tags": [
{
"label": "ehentai",
"color": "#ffe700"
}
],
"is_official": false
} }
] ]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

377
envs/test/poetry.lock generated
View File

@@ -1,14 +1,14 @@
# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
[[package]] [[package]]
name = "annotated-types" name = "annotated-types"
version = "0.6.0" version = "0.7.0"
description = "Reusable constraint types to use with typing.Annotated" description = "Reusable constraint types to use with typing.Annotated"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
{file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
] ]
[[package]] [[package]]
@@ -44,13 +44,13 @@ requests = ">=2.21,<3.0"
[[package]] [[package]]
name = "certifi" name = "certifi"
version = "2024.2.2" version = "2024.7.4"
description = "Python package for providing Mozilla's CA Bundle." description = "Python package for providing Mozilla's CA Bundle."
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.6"
files = [ files = [
{file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"},
{file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"},
] ]
[[package]] [[package]]
@@ -165,63 +165,63 @@ files = [
[[package]] [[package]]
name = "coverage" name = "coverage"
version = "7.5.0" version = "7.5.4"
description = "Code coverage measurement for Python" description = "Code coverage measurement for Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"},
{file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"},
{file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"},
{file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"},
{file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"},
{file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"},
{file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"},
{file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"},
{file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"},
{file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"},
{file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"},
{file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"},
{file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"},
{file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"},
{file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"},
{file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"},
{file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"},
{file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"},
{file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"},
{file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"},
{file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"},
{file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"},
{file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"},
{file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"},
{file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"},
{file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"},
{file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"},
{file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"},
{file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"},
{file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"},
{file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"},
{file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"},
{file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"},
{file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"},
{file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"},
{file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"},
{file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"},
{file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"},
{file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"},
{file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"},
{file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"},
{file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"},
{file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"},
{file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"},
{file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"},
{file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"},
{file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"},
{file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"},
{file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"},
{file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"},
{file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"},
{file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"},
] ]
[package.dependencies] [package.dependencies]
@@ -298,22 +298,22 @@ files = [
[[package]] [[package]]
name = "importlib-metadata" name = "importlib-metadata"
version = "7.1.0" version = "8.0.0"
description = "Read metadata from Python packages" description = "Read metadata from Python packages"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"},
{file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"},
] ]
[package.dependencies] [package.dependencies]
zipp = ">=0.5" zipp = ">=0.5"
[package.extras] [package.extras]
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
perf = ["ipython"] perf = ["ipython"]
testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"]
[[package]] [[package]]
name = "iniconfig" name = "iniconfig"
@@ -514,13 +514,13 @@ files = [
[[package]] [[package]]
name = "nonebot2" name = "nonebot2"
version = "2.2.1" version = "2.3.1"
description = "An asynchronous python bot framework." description = "An asynchronous python bot framework."
optional = false optional = false
python-versions = ">=3.8,<4.0" python-versions = "<4.0,>=3.9"
files = [ files = [
{file = "nonebot2-2.2.1-py3-none-any.whl", hash = "sha256:88f2bb456bf90922925bbe489a9effe3b09300f3aa50bfa75ee50d8a83d7330f"}, {file = "nonebot2-2.3.1-py3-none-any.whl", hash = "sha256:91ac0abebe6c403c2443b11a49e065b79e6199460bdd61a32148366b35f81c4d"},
{file = "nonebot2-2.2.1.tar.gz", hash = "sha256:fe57692300571b00724999238545d8d894523460e6835a11b326a2e1cdf98fc4"}, {file = "nonebot2-2.3.1.tar.gz", hash = "sha256:ac5a1a1759f15310e9183b606ce6bdbe52a90287bf36a69201be548e23d41e6c"},
] ]
[package.dependencies] [package.dependencies]
@@ -560,13 +560,13 @@ typing-extensions = ">=4.0.0,<5.0.0"
[[package]] [[package]]
name = "packaging" name = "packaging"
version = "24.0" version = "24.1"
description = "Core utilities for Python packages" description = "Core utilities for Python packages"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.8"
files = [ files = [
{file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
{file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
] ]
[[package]] [[package]]
@@ -586,109 +586,122 @@ testing = ["pytest", "pytest-benchmark"]
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "2.7.1" version = "2.8.2"
description = "Data validation using Python type hints" description = "Data validation using Python type hints"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"},
{file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"},
] ]
[package.dependencies] [package.dependencies]
annotated-types = ">=0.4.0" annotated-types = ">=0.4.0"
pydantic-core = "2.18.2" pydantic-core = "2.20.1"
typing-extensions = ">=4.6.1" typing-extensions = [
{version = ">=4.12.2", markers = "python_version >= \"3.13\""},
{version = ">=4.6.1", markers = "python_version < \"3.13\""},
]
[package.extras] [package.extras]
email = ["email-validator (>=2.0.0)"] email = ["email-validator (>=2.0.0)"]
[[package]] [[package]]
name = "pydantic-core" name = "pydantic-core"
version = "2.18.2" version = "2.20.1"
description = "Core functionality for Pydantic validation and serialization" description = "Core functionality for Pydantic validation and serialization"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"},
{file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"},
{file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"},
{file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"},
{file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"},
{file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"},
{file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"},
{file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"},
{file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"},
{file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"},
{file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"},
{file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"},
{file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"},
{file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"},
{file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"},
{file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"},
{file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"},
{file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"},
{file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"},
{file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"},
{file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"},
{file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"},
{file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"},
{file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"},
{file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"},
{file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"},
{file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"},
{file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"},
{file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"},
{file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"},
{file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"},
{file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"},
{file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"},
{file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"},
{file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"},
{file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"},
{file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"},
{file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"},
{file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"},
{file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"},
{file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"},
{file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"},
{file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"},
{file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"},
{file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"},
{file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"},
{file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"},
{file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"},
{file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"},
{file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"},
{file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"},
{file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"},
{file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"},
{file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"},
{file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"},
{file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"},
{file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"},
{file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"},
{file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"},
{file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"},
{file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"},
{file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"},
{file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"},
{file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"},
{file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"},
{file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"},
{file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"},
{file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"},
{file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"},
{file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"},
{file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"},
{file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"},
{file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"},
{file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"},
{file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"},
{file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"},
{file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"},
{file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"},
{file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"},
{file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"},
{file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"},
{file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"},
{file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"},
{file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"},
{file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"},
{file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"},
{file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"},
{file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"},
{file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"},
] ]
[package.dependencies] [package.dependencies]
@@ -707,13 +720,13 @@ files = [
[[package]] [[package]]
name = "pytest" name = "pytest"
version = "8.2.0" version = "8.2.2"
description = "pytest: simple powerful testing with Python" description = "pytest: simple powerful testing with Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"},
{file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"},
] ]
[package.dependencies] [package.dependencies]
@@ -729,13 +742,13 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments
[[package]] [[package]]
name = "pytest-asyncio" name = "pytest-asyncio"
version = "0.23.6" version = "0.23.7"
description = "Pytest support for asyncio" description = "Pytest support for asyncio"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pytest-asyncio-0.23.6.tar.gz", hash = "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"}, {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"},
{file = "pytest_asyncio-0.23.6-py3-none-any.whl", hash = "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a"}, {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"},
] ]
[package.dependencies] [package.dependencies]
@@ -799,13 +812,13 @@ cli = ["click (>=5.0)"]
[[package]] [[package]]
name = "requests" name = "requests"
version = "2.31.0" version = "2.32.3"
description = "Python HTTP for Humans." description = "Python HTTP for Humans."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.8"
files = [ files = [
{file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
{file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
] ]
[package.dependencies] [package.dependencies]
@@ -831,24 +844,24 @@ files = [
[[package]] [[package]]
name = "typing-extensions" name = "typing-extensions"
version = "4.11.0" version = "4.12.2"
description = "Backported and Experimental Type Hints for Python 3.8+" description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
{file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
] ]
[[package]] [[package]]
name = "urllib3" name = "urllib3"
version = "2.2.1" version = "2.2.2"
description = "HTTP library with thread-safe connection pooling, file post, and more." description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"},
{file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"},
] ]
[package.extras] [package.extras]
@@ -859,13 +872,13 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]] [[package]]
name = "werkzeug" name = "werkzeug"
version = "3.0.2" version = "3.0.3"
description = "The comprehensive WSGI web application library." description = "The comprehensive WSGI web application library."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "werkzeug-3.0.2-py3-none-any.whl", hash = "sha256:3aac3f5da756f93030740bc235d3e09449efcf65f2f55e3602e1d851b8f48795"}, {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"},
{file = "werkzeug-3.0.2.tar.gz", hash = "sha256:e39b645a6ac92822588e7b39a692e7828724ceae0b0d702ef96701f90e70128d"}, {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"},
] ]
[package.dependencies] [package.dependencies]
@@ -1007,18 +1020,18 @@ multidict = ">=4.0"
[[package]] [[package]]
name = "zipp" name = "zipp"
version = "3.18.1" version = "3.19.2"
description = "Backport of pathlib-compatible object wrapper for zip files" description = "Backport of pathlib-compatible object wrapper for zip files"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"},
{file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"},
] ]
[package.extras] [package.extras]
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"

View File

@@ -8,17 +8,20 @@ FrontMatter:
""" """
from collections.abc import Generator from collections.abc import Generator
from functools import cached_property
from dataclasses import dataclass, is_dataclass from dataclasses import dataclass, is_dataclass
from typing_extensions import Self, get_args, get_origin, is_typeddict from typing_extensions import Self, get_args, get_origin, is_typeddict
from typing import ( from typing import (
TYPE_CHECKING, TYPE_CHECKING,
Any, Any,
Union, Union,
Generic,
TypeVar, TypeVar,
Callable, Callable,
Optional, Optional,
Protocol, Protocol,
Annotated, Annotated,
overload,
) )
from pydantic import VERSION, BaseModel from pydantic import VERSION, BaseModel
@@ -46,8 +49,8 @@ __all__ = (
"DEFAULT_CONFIG", "DEFAULT_CONFIG",
"FieldInfo", "FieldInfo",
"ModelField", "ModelField",
"TypeAdapter",
"extract_field_info", "extract_field_info",
"model_field_validate",
"model_fields", "model_fields",
"model_config", "model_config",
"model_dump", "model_dump",
@@ -63,9 +66,10 @@ __autodoc__ = {
if PYDANTIC_V2: # pragma: pydantic-v2 if PYDANTIC_V2: # pragma: pydantic-v2
from pydantic import GetCoreSchemaHandler
from pydantic import TypeAdapter as TypeAdapter
from pydantic_core import CoreSchema, core_schema from pydantic_core import CoreSchema, core_schema
from pydantic._internal._repr import display_as_type from pydantic._internal._repr import display_as_type
from pydantic import TypeAdapter, GetCoreSchemaHandler
from pydantic.fields import FieldInfo as BaseFieldInfo from pydantic.fields import FieldInfo as BaseFieldInfo
Required = Ellipsis Required = Ellipsis
@@ -125,6 +129,25 @@ if PYDANTIC_V2: # pragma: pydantic-v2
"""Construct a ModelField from given infos.""" """Construct a ModelField from given infos."""
return cls._construct(name, annotation, field_info or FieldInfo()) return cls._construct(name, annotation, field_info or FieldInfo())
def __hash__(self) -> int:
# Each ModelField is unique for our purposes,
# to allow store them in a set.
return id(self)
@cached_property
def type_adapter(self) -> TypeAdapter:
"""TypeAdapter of the field.
Cache the TypeAdapter to avoid creating it multiple times.
Pydantic v2 uses too much cpu time to create TypeAdapter.
See: https://github.com/pydantic/pydantic/issues/9834
"""
return TypeAdapter(
Annotated[self.annotation, self.field_info],
config=None if self._annotation_has_config() else DEFAULT_CONFIG,
)
def _annotation_has_config(self) -> bool: def _annotation_has_config(self) -> bool:
"""Check if the annotation has config. """Check if the annotation has config.
@@ -152,10 +175,9 @@ if PYDANTIC_V2: # pragma: pydantic-v2
"""Get the display of the type of the field.""" """Get the display of the type of the field."""
return display_as_type(self.annotation) return display_as_type(self.annotation)
def __hash__(self) -> int: def validate_value(self, value: Any) -> Any:
# Each ModelField is unique for our purposes, """Validate the value pass to the field."""
# to allow store them in a set. return self.type_adapter.validate_python(value)
return id(self)
def extract_field_info(field_info: BaseFieldInfo) -> dict[str, Any]: def extract_field_info(field_info: BaseFieldInfo) -> dict[str, Any]:
"""Get FieldInfo init kwargs from a FieldInfo instance.""" """Get FieldInfo init kwargs from a FieldInfo instance."""
@@ -164,15 +186,6 @@ if PYDANTIC_V2: # pragma: pydantic-v2
kwargs["annotation"] = field_info.rebuild_annotation() kwargs["annotation"] = field_info.rebuild_annotation()
return kwargs return kwargs
def model_field_validate(
model_field: ModelField, value: Any, config: Optional[ConfigDict] = None
) -> Any:
"""Validate the value pass to the field."""
type: Any = Annotated[model_field.annotation, model_field.field_info]
return TypeAdapter(
type, config=None if model_field._annotation_has_config() else config
).validate_python(value)
def model_fields(model: type[BaseModel]) -> list[ModelField]: def model_fields(model: type[BaseModel]) -> list[ModelField]:
"""Get field list of a model.""" """Get field list of a model."""
@@ -305,6 +318,45 @@ else: # pragma: pydantic-v1
) )
return cls._construct(name, annotation, field_info or FieldInfo()) return cls._construct(name, annotation, field_info or FieldInfo())
def validate_value(self, value: Any) -> Any:
"""Validate the value pass to the field."""
v, errs_ = self.validate(value, {}, loc=())
if errs_:
raise ValueError(value, self)
return v
class TypeAdapter(Generic[T]):
@overload
def __init__(
self,
type: type[T],
*,
config: Optional[ConfigDict] = ...,
) -> None: ...
@overload
def __init__(
self,
type: Any,
*,
config: Optional[ConfigDict] = ...,
) -> None: ...
def __init__(
self,
type: Any,
*,
config: Optional[ConfigDict] = None,
) -> None:
self.type = type
self.config = config
def validate_python(self, value: Any) -> T:
return type_validate_python(self.type, value)
def validate_json(self, value: Union[str, bytes]) -> T:
return type_validate_json(self.type, value)
def extract_field_info(field_info: BaseFieldInfo) -> dict[str, Any]: def extract_field_info(field_info: BaseFieldInfo) -> dict[str, Any]:
"""Get FieldInfo init kwargs from a FieldInfo instance.""" """Get FieldInfo init kwargs from a FieldInfo instance."""
@@ -314,22 +366,6 @@ else: # pragma: pydantic-v1
kwargs.update(field_info.extra) kwargs.update(field_info.extra)
return kwargs return kwargs
def model_field_validate(
model_field: ModelField, value: Any, config: Optional[type[ConfigDict]] = None
) -> Any:
"""Validate the value pass to the field.
Set config before validate to ensure validate correctly.
"""
if model_field.model_config is not config:
model_field.set_config(config or ConfigDict)
v, errs_ = model_field.validate(value, {}, loc=())
if errs_:
raise ValueError(value, model_field)
return v
def model_fields(model: type[BaseModel]) -> list[ModelField]: def model_fields(model: type[BaseModel]) -> list[ModelField]:
"""Get field list of a model.""" """Get field list of a model."""

View File

@@ -9,9 +9,9 @@ from typing import Any, Callable, ForwardRef
from loguru import logger from loguru import logger
from nonebot.compat import ModelField
from nonebot.exception import TypeMisMatch from nonebot.exception import TypeMisMatch
from nonebot.typing import evaluate_forwardref from nonebot.typing import evaluate_forwardref
from nonebot.compat import DEFAULT_CONFIG, ModelField, model_field_validate
def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature: def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature:
@@ -51,6 +51,6 @@ def check_field_type(field: ModelField, value: Any) -> Any:
"""检查字段类型是否匹配""" """检查字段类型是否匹配"""
try: try:
return model_field_validate(field, value, DEFAULT_CONFIG) return field.validate_value(value)
except ValueError: except ValueError:
raise TypeMisMatch(field, value) raise TypeMisMatch(field, value)

View File

@@ -15,7 +15,7 @@ def combine_driver(driver: type[D]) -> type[D]: ...
@overload @overload
def combine_driver( def combine_driver(
driver: type[D], _m: type[Mixin], *mixins: type[Mixin] driver: type[D], __m: type[Mixin], /, *mixins: type[Mixin]
) -> type["CombinedDriver"]: ... ) -> type["CombinedDriver"]: ...

View File

@@ -76,7 +76,7 @@ T = TypeVar("T")
current_bot: ContextVar[Bot] = ContextVar("current_bot") current_bot: ContextVar[Bot] = ContextVar("current_bot")
current_event: ContextVar[Event] = ContextVar("current_event") current_event: ContextVar[Event] = ContextVar("current_event")
current_matcher: ContextVar["Matcher"] = ContextVar("current_matcher") current_matcher: ContextVar["Matcher"] = ContextVar("current_matcher")
current_handler: ContextVar[Dependent] = ContextVar("current_handler") current_handler: ContextVar[Dependent[Any]] = ContextVar("current_handler")
@dataclass @dataclass

View File

@@ -17,8 +17,14 @@ from pydantic.fields import FieldInfo as PydanticFieldInfo
from nonebot.dependencies import Param, Dependent from nonebot.dependencies import Param, Dependent
from nonebot.dependencies.utils import check_field_type from nonebot.dependencies.utils import check_field_type
from nonebot.typing import T_State, T_Handler, T_DependencyCache
from nonebot.compat import FieldInfo, ModelField, PydanticUndefined, extract_field_info from nonebot.compat import FieldInfo, ModelField, PydanticUndefined, extract_field_info
from nonebot.typing import (
_STATE_FLAG,
T_State,
T_Handler,
T_DependencyCache,
origin_is_annotated,
)
from nonebot.utils import ( from nonebot.utils import (
get_name, get_name,
run_sync, run_sync,
@@ -96,7 +102,7 @@ class DependParam(Param):
""" """
def __init__( def __init__(
self, *args, dependent: Dependent, use_cache: bool, **kwargs: Any self, *args, dependent: Dependent[Any], use_cache: bool, **kwargs: Any
) -> None: ) -> None:
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.dependent = dependent self.dependent = dependent
@@ -108,7 +114,7 @@ class DependParam(Param):
@classmethod @classmethod
def _from_field( def _from_field(
cls, cls,
sub_dependent: Dependent, sub_dependent: Dependent[Any],
use_cache: bool, use_cache: bool,
validate: Union[bool, PydanticFieldInfo], validate: Union[bool, PydanticFieldInfo],
) -> Self: ) -> Self:
@@ -184,7 +190,7 @@ class DependParam(Param):
use_cache: bool = self.use_cache use_cache: bool = self.use_cache
dependency_cache = {} if dependency_cache is None else dependency_cache dependency_cache = {} if dependency_cache is None else dependency_cache
sub_dependent: Dependent = self.dependent sub_dependent = self.dependent
call = cast(Callable[..., Any], sub_dependent.call) call = cast(Callable[..., Any], sub_dependent.call)
# solve sub dependency with current cache # solve sub dependency with current cache
@@ -349,7 +355,9 @@ class StateParam(Param):
cls, param: inspect.Parameter, allow_types: tuple[type[Param], ...] cls, param: inspect.Parameter, allow_types: tuple[type[Param], ...]
) -> Optional[Self]: ) -> Optional[Self]:
# param type is T_State # param type is T_State
if param.annotation is T_State: if origin_is_annotated(
get_origin(param.annotation)
) and _STATE_FLAG in get_args(param.annotation):
return cls() return cls()
# legacy: param is named "state" and has no type annotation # legacy: param is named "state" and has no type annotation
elif param.annotation == param.empty and param.name == "state": elif param.annotation == param.empty and param.name == "state":

View File

@@ -114,7 +114,7 @@ def on(
rule: Optional[Union[Rule, T_RuleChecker]] = None, rule: Optional[Union[Rule, T_RuleChecker]] = None,
permission: Optional[Union[Permission, T_PermissionChecker]] = None, permission: Optional[Union[Permission, T_PermissionChecker]] = None,
*, *,
handlers: Optional[list[Union[T_Handler, Dependent]]] = None, handlers: Optional[list[Union[T_Handler, Dependent[Any]]]] = None,
temp: bool = False, temp: bool = False,
expire_time: Optional[Union[datetime, timedelta]] = None, expire_time: Optional[Union[datetime, timedelta]] = None,
priority: int = 1, priority: int = 1,

View File

@@ -21,7 +21,7 @@ def on(
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
*, *,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -32,7 +32,7 @@ def on_metaevent(
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
*, *,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -43,7 +43,7 @@ def on_message(
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
*, *,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -54,7 +54,7 @@ def on_notice(
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
*, *,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -65,7 +65,7 @@ def on_request(
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
*, *,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -78,7 +78,7 @@ def on_startswith(
ignorecase: bool = ..., ignorecase: bool = ...,
*, *,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -91,7 +91,7 @@ def on_endswith(
ignorecase: bool = ..., ignorecase: bool = ...,
*, *,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -104,7 +104,7 @@ def on_fullmatch(
ignorecase: bool = ..., ignorecase: bool = ...,
*, *,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -116,7 +116,7 @@ def on_keyword(
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
*, *,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -130,7 +130,7 @@ def on_command(
force_whitespace: str | bool | None = ..., force_whitespace: str | bool | None = ...,
*, *,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -144,7 +144,7 @@ def on_shell_command(
parser: ArgumentParser | None = ..., parser: ArgumentParser | None = ...,
*, *,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -157,7 +157,7 @@ def on_regex(
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
*, *,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -169,7 +169,7 @@ def on_type(
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
*, *,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -194,7 +194,7 @@ class CommandGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -209,7 +209,7 @@ class CommandGroup(_Group):
aliases: set[str | tuple[str, ...]] | None = ..., aliases: set[str | tuple[str, ...]] | None = ...,
force_whitespace: str | bool | None = ..., force_whitespace: str | bool | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -224,7 +224,7 @@ class CommandGroup(_Group):
aliases: set[str | tuple[str, ...]] | None = ..., aliases: set[str | tuple[str, ...]] | None = ...,
parser: ArgumentParser | None = ..., parser: ArgumentParser | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -239,7 +239,7 @@ class MatcherGroup(_Group):
type: str = ..., type: str = ...,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -252,7 +252,7 @@ class MatcherGroup(_Group):
type: str = ..., type: str = ...,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -264,7 +264,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -276,7 +276,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -288,7 +288,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -300,7 +300,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -314,7 +314,7 @@ class MatcherGroup(_Group):
ignorecase: bool = ..., ignorecase: bool = ...,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -328,7 +328,7 @@ class MatcherGroup(_Group):
ignorecase: bool = ..., ignorecase: bool = ...,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -342,7 +342,7 @@ class MatcherGroup(_Group):
ignorecase: bool = ..., ignorecase: bool = ...,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -355,7 +355,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -370,7 +370,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -385,7 +385,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -399,7 +399,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,
@@ -412,7 +412,7 @@ class MatcherGroup(_Group):
*, *,
rule: Rule | T_RuleChecker | None = ..., rule: Rule | T_RuleChecker | None = ...,
permission: Permission | T_PermissionChecker | None = ..., permission: Permission | T_PermissionChecker | None = ...,
handlers: list[T_Handler | Dependent] | None = ..., handlers: list[T_Handler | Dependent[Any]] | None = ...,
temp: bool = ..., temp: bool = ...,
expire_time: datetime | timedelta | None = ..., expire_time: datetime | timedelta | None = ...,
priority: int = ..., priority: int = ...,

View File

@@ -13,7 +13,6 @@ FrontMatter:
import sys import sys
import types import types
import warnings import warnings
import contextlib
import typing as t import typing as t
import typing_extensions as t_ext import typing_extensions as t_ext
from typing import TYPE_CHECKING, TypeVar from typing import TYPE_CHECKING, TypeVar
@@ -86,9 +85,7 @@ def all_literal_values(type_: type[t.Any]) -> list[t.Any]:
def origin_is_annotated(origin: t.Optional[type[t.Any]]) -> bool: def origin_is_annotated(origin: t.Optional[type[t.Any]]) -> bool:
"""判断是否是 Annotated 类型""" """判断是否是 Annotated 类型"""
with contextlib.suppress(TypeError): return origin is t_ext.Annotated
return origin is not None and issubclass(origin, t_ext.Annotated)
return False
NONE_TYPES = {None, type(None), t.Literal[None], t_ext.Literal[None]} NONE_TYPES = {None, type(None), t.Literal[None], t_ext.Literal[None]}
@@ -104,11 +101,23 @@ def is_none_type(type_: type[t.Any]) -> bool:
def evaluate_forwardref( def evaluate_forwardref(
ref: t.ForwardRef, globalns: dict[str, t.Any], localns: dict[str, t.Any] ref: t.ForwardRef, globalns: dict[str, t.Any], localns: dict[str, t.Any]
) -> t.Any: ) -> t.Any:
return ref._evaluate(globalns, localns, frozenset()) # Python 3.13/3.12.4+ made `recursive_guard` a kwarg,
# so name it explicitly to avoid:
# TypeError: ForwardRef._evaluate()
# missing 1 required keyword-only argument: 'recursive_guard'
return ref._evaluate(globalns, localns, recursive_guard=frozenset())
# state # state
T_State: TypeAlias = dict[t.Any, t.Any] # use annotated flag to avoid ForwardRef recreate generic type (py >= 3.11)
class StateFlag:
def __repr__(self) -> str:
return "StateFlag()"
_STATE_FLAG = StateFlag()
T_State: TypeAlias = t.Annotated[dict[t.Any, t.Any], _STATE_FLAG]
"""事件处理状态 State 类型""" """事件处理状态 State 类型"""
_DependentCallable: TypeAlias = t.Union[ _DependentCallable: TypeAlias = t.Union[

980
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "nonebot2" name = "nonebot2"
version = "2.3.0" version = "2.3.2"
description = "An asynchronous python bot framework." description = "An asynchronous python bot framework."
authors = ["yanyongyu <yyy@nonebot.dev>"] authors = ["yanyongyu <yyy@nonebot.dev>"]
license = "MIT" license = "MIT"

View File

@@ -7,6 +7,10 @@ async def get_bot(b: Bot) -> Bot:
return b return b
async def postpone_bot(b: "Bot") -> Bot:
return b
async def legacy_bot(bot): async def legacy_bot(bot):
return bot return bot

View File

@@ -8,6 +8,10 @@ async def event(e: Event) -> Event:
return e return e
async def postpone_event(e: "Event") -> Event:
return e
async def legacy_event(event): async def legacy_event(event):
return event return event

View File

@@ -9,6 +9,10 @@ async def matcher(m: Matcher) -> Matcher:
return m return m
async def postpone_matcher(m: "Matcher") -> Matcher:
return m
async def legacy_matcher(matcher): async def legacy_matcher(matcher):
return matcher return matcher
@@ -27,7 +31,7 @@ class BarMatcher(Matcher): ...
async def union_matcher( async def union_matcher(
m: Union[FooMatcher, BarMatcher] m: Union[FooMatcher, BarMatcher],
) -> Union[FooMatcher, BarMatcher]: ) -> Union[FooMatcher, BarMatcher]:
return m return m

View File

@@ -25,6 +25,10 @@ async def state(x: T_State) -> T_State:
return x return x
async def postpone_state(x: "T_State") -> T_State:
return x
async def legacy_state(state): async def legacy_state(state):
return state return state

View File

@@ -1,13 +1,14 @@
from typing import Any, Optional
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any, Optional, Annotated
import pytest import pytest
from pydantic import BaseModel from pydantic import BaseModel, ValidationError
from nonebot.compat import ( from nonebot.compat import (
DEFAULT_CONFIG, DEFAULT_CONFIG,
Required, Required,
FieldInfo, FieldInfo,
TypeAdapter,
PydanticUndefined, PydanticUndefined,
model_dump, model_dump,
custom_validation, custom_validation,
@@ -31,6 +32,21 @@ async def test_field_info():
assert FieldInfo(test="test").extra["test"] == "test" assert FieldInfo(test="test").extra["test"] == "test"
@pytest.mark.asyncio
async def test_type_adapter():
t = TypeAdapter(Annotated[int, FieldInfo(ge=1)])
assert t.validate_python(2) == 2
with pytest.raises(ValidationError):
t.validate_python(0)
assert t.validate_json("2") == 2
with pytest.raises(ValidationError):
t.validate_json("0")
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_model_dump(): async def test_model_dump():
class TestModel(BaseModel): class TestModel(BaseModel):

View File

@@ -129,6 +129,7 @@ async def test_bot(app: App):
union_bot, union_bot,
legacy_bot, legacy_bot,
generic_bot, generic_bot,
postpone_bot,
not_legacy_bot, not_legacy_bot,
generic_bot_none, generic_bot_none,
) )
@@ -138,6 +139,11 @@ async def test_bot(app: App):
ctx.pass_params(bot=bot) ctx.pass_params(bot=bot)
ctx.should_return(bot) ctx.should_return(bot)
async with app.test_dependent(postpone_bot, allow_types=[BotParam]) as ctx:
bot = ctx.create_bot()
ctx.pass_params(bot=bot)
ctx.should_return(bot)
async with app.test_dependent(legacy_bot, allow_types=[BotParam]) as ctx: async with app.test_dependent(legacy_bot, allow_types=[BotParam]) as ctx:
bot = ctx.create_bot() bot = ctx.create_bot()
ctx.pass_params(bot=bot) ctx.pass_params(bot=bot)
@@ -188,6 +194,7 @@ async def test_event(app: App):
legacy_event, legacy_event,
event_message, event_message,
generic_event, generic_event,
postpone_event,
event_plain_text, event_plain_text,
not_legacy_event, not_legacy_event,
generic_event_none, generic_event_none,
@@ -201,6 +208,10 @@ async def test_event(app: App):
ctx.pass_params(event=fake_event) ctx.pass_params(event=fake_event)
ctx.should_return(fake_event) ctx.should_return(fake_event)
async with app.test_dependent(postpone_event, allow_types=[EventParam]) as ctx:
ctx.pass_params(event=fake_event)
ctx.should_return(fake_event)
async with app.test_dependent(legacy_event, allow_types=[EventParam]) as ctx: async with app.test_dependent(legacy_event, allow_types=[EventParam]) as ctx:
ctx.pass_params(event=fake_event) ctx.pass_params(event=fake_event)
ctx.should_return(fake_event) ctx.should_return(fake_event)
@@ -273,6 +284,7 @@ async def test_state(app: App):
legacy_state, legacy_state,
command_start, command_start,
regex_matched, regex_matched,
postpone_state,
not_legacy_state, not_legacy_state,
command_whitespace, command_whitespace,
shell_command_args, shell_command_args,
@@ -302,6 +314,10 @@ async def test_state(app: App):
ctx.pass_params(state=fake_state) ctx.pass_params(state=fake_state)
ctx.should_return(fake_state) ctx.should_return(fake_state)
async with app.test_dependent(postpone_state, allow_types=[StateParam]) as ctx:
ctx.pass_params(state=fake_state)
ctx.should_return(fake_state)
async with app.test_dependent(legacy_state, allow_types=[StateParam]) as ctx: async with app.test_dependent(legacy_state, allow_types=[StateParam]) as ctx:
ctx.pass_params(state=fake_state) ctx.pass_params(state=fake_state)
ctx.should_return(fake_state) ctx.should_return(fake_state)
@@ -414,6 +430,7 @@ async def test_matcher(app: App):
union_matcher, union_matcher,
legacy_matcher, legacy_matcher,
generic_matcher, generic_matcher,
postpone_matcher,
not_legacy_matcher, not_legacy_matcher,
generic_matcher_none, generic_matcher_none,
) )
@@ -425,6 +442,10 @@ async def test_matcher(app: App):
ctx.pass_params(matcher=fake_matcher) ctx.pass_params(matcher=fake_matcher)
ctx.should_return(fake_matcher) ctx.should_return(fake_matcher)
async with app.test_dependent(postpone_matcher, allow_types=[MatcherParam]) as ctx:
ctx.pass_params(matcher=fake_matcher)
ctx.should_return(fake_matcher)
async with app.test_dependent(legacy_matcher, allow_types=[MatcherParam]) as ctx: async with app.test_dependent(legacy_matcher, allow_types=[MatcherParam]) as ctx:
ctx.pass_params(matcher=fake_matcher) ctx.pass_params(matcher=fake_matcher)
ctx.should_return(fake_matcher) ctx.should_return(fake_matcher)
@@ -553,7 +574,7 @@ async def test_default(app: App):
async def test_priority(): async def test_priority():
from plugins.param.priority import complex_priority from plugins.param.priority import complex_priority
dependent = Dependent.parse( dependent = Dependent[None].parse(
call=complex_priority, call=complex_priority,
allow_types=[ allow_types=[
DependParam, DependParam,

View File

@@ -34,7 +34,7 @@ NoneBot 采用了一套自行定义的依赖注入系统,可以让事件的处
#### 什么是依赖注入 #### 什么是依赖注入
[**『依赖注入』**](https://zh.m.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**『依赖』**。 [**『依赖注入』**](https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**『依赖』**。
系统(在这里是指 NoneBot将负责做任何需要的事情为你的代码提供这些必要依赖即**『注入』**依赖性) 系统(在这里是指 NoneBot将负责做任何需要的事情为你的代码提供这些必要依赖即**『注入』**依赖性)

View File

@@ -154,7 +154,7 @@ rule = keyword("hello", "hi")
```python ```python
from nonebot import on_keyword from nonebot import on_keyword
matcher = on_keyword("hello", "hi") matcher = on_keyword({"hello", "hi"})
``` ```
### `command` ### `command`

View File

@@ -73,10 +73,12 @@ CUSTOM_CONFIG=config in dotenv
同时,设置环境变量: 同时,设置环境变量:
```bash ```bash
# windows # windows cmd
set CUSTOM_CONFIG "config in environment variables" set CUSTOM_CONFIG 'config in environment variables'
# windows powershell
$Env:CUSTOM_CONFIG='config in environment variables'
# linux/macOS # linux/macOS
export CUSTOM_CONFIG="config in environment variables" export CUSTOM_CONFIG='config in environment variables'
``` ```
那最终 NoneBot 所读取的内容为环境变量中的内容,即 `config in environment variables`。 那最终 NoneBot 所读取的内容为环境变量中的内容,即 `config in environment variables`。
@@ -295,8 +297,10 @@ DRIVER=~fastapi+~httpx+~websockets
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set DRIVER '~fastapi+~httpx+~websockets' set DRIVER '~fastapi+~httpx+~websockets'
# windows powershell
$Env:DRIVER='~fastapi+~httpx+~websockets'
# linux/macOS # linux/macOS
export DRIVER='~fastapi+~httpx+~websockets' export DRIVER='~fastapi+~httpx+~websockets'
``` ```
@@ -331,8 +335,10 @@ HOST=127.0.0.1
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set HOST '127.0.0.1' set HOST '127.0.0.1'
# windows powershell
$Env:HOST='127.0.0.1'
# linux/macOS # linux/macOS
export HOST='127.0.0.1' export HOST='127.0.0.1'
``` ```
@@ -367,8 +373,10 @@ PORT=8080
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set PORT '8080' set PORT '8080'
# windows powershell
$Env:PORT='8080'
# linux/macOS # linux/macOS
export PORT='8080' export PORT='8080'
``` ```
@@ -407,8 +415,10 @@ LOG_LEVEL=DEBUG
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set LOG_LEVEL 'DEBUG' set LOG_LEVEL 'DEBUG'
# windows powershell
$Env:LOG_LEVEL='DEBUG'
# linux/macOS # linux/macOS
export LOG_LEVEL='DEBUG' export LOG_LEVEL='DEBUG'
``` ```
@@ -443,8 +453,10 @@ API_TIMEOUT=10.0
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set API_TIMEOUT '10.0' set API_TIMEOUT '10.0'
# windows powershell
$Env:API_TIMEOUT='10.0'
# linux/macOS # linux/macOS
export API_TIMEOUT='10.0' export API_TIMEOUT='10.0'
``` ```
@@ -479,8 +491,10 @@ SUPERUSERS=["123123123"]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set SUPERUSERS '["123123123"]' set SUPERUSERS '["123123123"]'
# windows powershell
$Env:SUPERUSERS='["123123123"]'
# linux/macOS # linux/macOS
export SUPERUSERS='["123123123"]' export SUPERUSERS='["123123123"]'
``` ```
@@ -515,8 +529,10 @@ NICKNAME=["bot"]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set NICKNAME '["bot"]' set NICKNAME '["bot"]'
# windows powershell
$Env:NICKNAME='["bot"]'
# linux/macOS # linux/macOS
export NICKNAME='["bot"]' export NICKNAME='["bot"]'
``` ```
@@ -554,9 +570,12 @@ COMMAND_SEP=[".", " "]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set COMMAND_START '["/", ""]' set COMMAND_START '["/", ""]'
set COMMAND_SEP '[".", " "]' set COMMAND_SEP '[".", " "]'
# windows powershell
$Env:COMMAND_START='["/", ""]'
$Env:COMMAND_SEP='[".", " "]'
# linux/macOS # linux/macOS
export COMMAND_START='["/", ""]' export COMMAND_START='["/", ""]'
export COMMAND_SEP='[".", " "]' export COMMAND_SEP='[".", " "]'
@@ -592,8 +611,10 @@ SESSION_EXPIRE_TIMEOUT=00:02:00
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set SESSION_EXPIRE_TIMEOUT '00:02:00' set SESSION_EXPIRE_TIMEOUT '00:02:00'
# windows powershell
$Env:SESSION_EXPIRE_TIMEOUT='00:02:00'
# linux/macOS # linux/macOS
export SESSION_EXPIRE_TIMEOUT='00:02:00' export SESSION_EXPIRE_TIMEOUT='00:02:00'
``` ```

View File

@@ -487,7 +487,7 @@ matcher = on_alconna(
```python ```python
from nonebot_plugin_alconna import Match, on_alconna from nonebot_plugin_alconna import Match, on_alconna
from nonebot_plugin_alconna.builtins.plugins.discord import DiscordSlashExtension from nonebot_plugin_alconna.builtins.extensions.discord import DiscordSlashExtension
alc = Alconna( alc = Alconna(

View File

@@ -31,17 +31,17 @@ require("nonebot_plugin_localstore")
import nonebot_plugin_localstore as store import nonebot_plugin_localstore as store
# 获取插件缓存目录 # 获取插件缓存目录
cache_dir = store.get_cache_dir("plugin_name") cache_dir = store.get_plugin_cache_dir()
# 获取插件缓存文件 # 获取插件缓存文件
cache_file = store.get_cache_file("plugin_name", "file_name") cache_file = store.get_plugin_cache_file("file_name")
# 获取插件数据目录 # 获取插件数据目录
data_dir = store.get_data_dir("plugin_name") data_dir = store.get_plugin_data_dir()
# 获取插件数据文件 # 获取插件数据文件
data_file = store.get_data_file("plugin_name", "file_name") data_file = store.get_plugin_data_file("file_name")
# 获取插件配置目录 # 获取插件配置目录
config_dir = store.get_config_dir("plugin_name") config_dir = store.get_plugin_config_dir()
# 获取插件配置文件 # 获取插件配置文件
config_file = store.get_config_file("plugin_name", "file_name") config_file = store.get_plugin_config_file("file_name")
``` ```
:::danger 警告 :::danger 警告
@@ -53,9 +53,61 @@ config_file = store.get_config_file("plugin_name", "file_name")
```python ```python
from pathlib import Path from pathlib import Path
data_file = store.get_data_file("plugin_name", "file_name") data_file = store.get_plugin_data_file("file_name")
# 写入文件内容 # 写入文件内容
data_file.write_text("Hello World!") data_file.write_text("Hello World!")
# 读取文件内容 # 读取文件内容
data = data_file.read_text() data = data_file.read_text()
``` ```
:::note 提示
对于嵌套插件,子插件的存储目录将位于父插件存储目录下。
:::
## 配置项
### localstore_cache_dir
自定义缓存目录
默认值:
- macOS: `~/Library/Caches/<AppName>`
- Unix: `~/.cache/<AppName>` (XDG default)
- Windows: `C:\Users\<username>\AppData\Local\<AppName>\Cache`
```dotenv
LOCALSTORE_CACHE_DIR=/tmp/cache
```
### localstore_data_dir
自定义数据目录
默认值:
- macOS: `~/Library/Application Support/<AppName>`
- Unix: `~/.local/share/<AppName>` or in $XDG_DATA_HOME, if defined
- Win XP (not roaming): `C:\Documents and Settings\<username>\Application Data\<AppName>`
- Win 7 (not roaming): `C:\Users\<username>\AppData\Local\<AppName>`
```dotenv
LOCALSTORE_DATA_DIR=/tmp/data
```
### localstore_config_dir
自定义配置目录
默认值:
- macOS: same as user_data_dir
- Unix: `~/.config/<AppName>`
- Win XP (roaming): `C:\Documents and Settings\<username>\Local Settings\Application Data\<AppName>`
- Win 7 (roaming): `C:\Users\<username>\AppData\Roaming\<AppName>`
```dotenv
LOCALSTORE_CONFIG_DIR=/tmp/config
```

View File

@@ -150,7 +150,7 @@ async def test_weather(app: App):
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message("/天气 北京"), message=Message("/天气 北京"),
user=User(user_id=123456789), user=User(id="user"),
) )
``` ```
@@ -165,7 +165,7 @@ async def test_weather(app: App):
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message("/天气 北京"), message=Message("/天气 北京"),
user=User(user_id=123456789), user=User(id="user"),
) )
async with app.test_matcher(weather) as ctx: async with app.test_matcher(weather) as ctx:
bot = ctx.create_bot() bot = ctx.create_bot()
@@ -184,7 +184,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio

View File

@@ -56,7 +56,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -95,7 +95,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -131,7 +131,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -202,7 +202,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -264,7 +264,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio

View File

@@ -58,7 +58,7 @@ const navbar = {
docId: "developer/plugin-publishing", docId: "developer/plugin-publishing",
}, },
{ label: "社区", type: "doc", docId: "community/contact" }, { label: "社区", type: "doc", docId: "community/contact" },
{ label: "开源之夏", type: "doc", docId: "ospp/2023" }, { label: "开源之夏", type: "doc", docId: "ospp/2024" },
{ label: "商店", to: "/store/plugins" }, { label: "商店", to: "/store/plugins" },
{ label: "更新日志", to: "/changelog" }, { label: "更新日志", to: "/changelog" },
{ label: "论坛", href: "https://discussions.nonebot.dev" }, { label: "论坛", href: "https://discussions.nonebot.dev" },
@@ -251,6 +251,12 @@ const siteConfig = {
src: "https://cdn.wwads.cn/js/makemoney.js", src: "https://cdn.wwads.cn/js/makemoney.js",
async: true, async: true,
}, },
// uwu logo
{
type: "text/javascript",
charset: "UTF-8",
src: "/uwu.js",
},
], ],
presets: [ presets: [

View File

@@ -47,6 +47,7 @@ function HomeHero(): JSX.Element {
return ( return (
<div className="home-hero"> <div className="home-hero">
<img src="/img/uwu.svg" alt="uwu" className="home-hero-uwu" />
<img src={logo!.src} alt={logo!.alt} className="home-hero-logo" /> <img src={logo!.src} alt={logo!.alt} className="home-hero-logo" />
<h1 className="home-hero-title"> <h1 className="home-hero-title">
<span className="text-primary">None</span> <span className="text-primary">None</span>

View File

@@ -39,3 +39,16 @@
@apply inline-block !max-w-[600px]; @apply inline-block !max-w-[600px];
} }
} }
.home-hero-uwu {
@apply hidden;
}
[data-uwu="true"] .home-hero-uwu {
@apply block max-w-xs;
}
[data-uwu="true"] .home-hero-logo,
[data-uwu="true"] .home-hero-title {
@apply hidden;
}

View File

@@ -5,6 +5,144 @@ toc_max_heading_level: 2
# 更新日志 # 更新日志
## 最近更新
### 🚀 新功能
- Feature: 优化依赖注入在 pydantic v2 下的性能 [@yanyongyu](https://github.com/yanyongyu) ([#2870](https://github.com/nonebot/nonebot2/pull/2870))
- Feature: 添加遗漏的类型标注 [@yanyongyu](https://github.com/yanyongyu) ([#2856](https://github.com/nonebot/nonebot2/pull/2856))
### 🐛 Bug 修复
- Fix: 错误的类型标注和 annotated 处理 [@yanyongyu](https://github.com/yanyongyu) ([#2828](https://github.com/nonebot/nonebot2/pull/2828))
### 📝 文档
- Docs: 添加 Windows Powershell 设置环境变量方法 [@LeoQuote](https://github.com/LeoQuote) ([#2874](https://github.com/nonebot/nonebot2/pull/2874))
- Docs: 更新 localstore 插件文档 [@yanyongyu](https://github.com/yanyongyu) ([#2871](https://github.com/nonebot/nonebot2/pull/2871))
### 💫 杂项
- Plugin: 修改插件 system-command 信息 [@tkgs0](https://github.com/tkgs0) ([#2862](https://github.com/nonebot/nonebot2/pull/2862))
- Plugin: 修改 nonebot-plugin-fishing 插件作者 [@ALittleBot](https://github.com/ALittleBot) ([#2854](https://github.com/nonebot/nonebot2/pull/2854))
- Bot: 更新 Minecraft QQBot 信息 [@Lonely-Sails](https://github.com/Lonely-Sails) ([#2838](https://github.com/nonebot/nonebot2/pull/2838))
- Plugin: 移除 kanonbot 插件 [@SuperGuGuGu](https://github.com/SuperGuGuGu) ([#2819](https://github.com/nonebot/nonebot2/pull/2819))
- Plugin: 更新插件 sparkapi 信息 [@CCLMSY](https://github.com/CCLMSY) ([#2812](https://github.com/nonebot/nonebot2/pull/2812))
- Plugin: 修改插件 miragetank \& charpic 信息 [@1umine](https://github.com/1umine) ([#2807](https://github.com/nonebot/nonebot2/pull/2807))
### 🍻 插件发布
- Plugin: pokepoke_miss [@noneflow](https://github.com/noneflow) ([#2883](https://github.com/nonebot/nonebot2/pull/2883))
- Plugin: 聊天截图伪造 [@noneflow](https://github.com/noneflow) ([#2880](https://github.com/nonebot/nonebot2/pull/2880))
- Plugin: ba-tools [@noneflow](https://github.com/noneflow) ([#2867](https://github.com/nonebot/nonebot2/pull/2867))
- Plugin: 精华消息管理 [@noneflow](https://github.com/noneflow) ([#2873](https://github.com/nonebot/nonebot2/pull/2873))
- Plugin: B站收藏夹监视器 [@noneflow](https://github.com/noneflow) ([#2869](https://github.com/nonebot/nonebot2/pull/2869))
- Plugin: Alist [@noneflow](https://github.com/noneflow) ([#2865](https://github.com/nonebot/nonebot2/pull/2865))
- Plugin: 🦌管签到 [@noneflow](https://github.com/noneflow) ([#2859](https://github.com/nonebot/nonebot2/pull/2859))
- Plugin: 漂流瓶 [@noneflow](https://github.com/noneflow) ([#2861](https://github.com/nonebot/nonebot2/pull/2861))
- Plugin: 奇怪的小功能 [@noneflow](https://github.com/noneflow) ([#2851](https://github.com/nonebot/nonebot2/pull/2851))
- Plugin: SunoAI音乐生成 [@noneflow](https://github.com/noneflow) ([#2853](https://github.com/nonebot/nonebot2/pull/2853))
- Plugin: 谁是卷王 [@noneflow](https://github.com/noneflow) ([#2849](https://github.com/nonebot/nonebot2/pull/2849))
- Plugin: GPT-SoVITS 语音合成 [@noneflow](https://github.com/noneflow) ([#2847](https://github.com/nonebot/nonebot2/pull/2847))
- Plugin: 基于清影的AI视频生成 [@noneflow](https://github.com/noneflow) ([#2843](https://github.com/nonebot/nonebot2/pull/2843))
- Plugin: 命令行 [@noneflow](https://github.com/noneflow) ([#2840](https://github.com/nonebot/nonebot2/pull/2840))
- Plugin: exe_code [@noneflow](https://github.com/noneflow) ([#2835](https://github.com/nonebot/nonebot2/pull/2835))
- Plugin: nonebot-plugin-autopush [@noneflow](https://github.com/noneflow) ([#2833](https://github.com/nonebot/nonebot2/pull/2833))
- Plugin: vv_helper [@noneflow](https://github.com/noneflow) ([#2825](https://github.com/nonebot/nonebot2/pull/2825))
- Plugin: nonebot_plugin_game_torrent [@noneflow](https://github.com/noneflow) ([#2827](https://github.com/nonebot/nonebot2/pull/2827))
- Plugin: 每日油价 [@noneflow](https://github.com/noneflow) ([#2822](https://github.com/nonebot/nonebot2/pull/2822))
- Plugin: wordle [@noneflow](https://github.com/noneflow) ([#2818](https://github.com/nonebot/nonebot2/pull/2818))
- Plugin: 再润 [@noneflow](https://github.com/noneflow) ([#2816](https://github.com/nonebot/nonebot2/pull/2816))
- Plugin: 漫展/展览查询 [@noneflow](https://github.com/noneflow) ([#2811](https://github.com/nonebot/nonebot2/pull/2811))
- Plugin: 鸣潮wiki [@noneflow](https://github.com/noneflow) ([#2804](https://github.com/nonebot/nonebot2/pull/2804))
- Plugin: cloudfare R2 客服端 [@noneflow](https://github.com/noneflow) ([#2806](https://github.com/nonebot/nonebot2/pull/2806))
- Plugin: AnyMate小助手 [@noneflow](https://github.com/noneflow) ([#2761](https://github.com/nonebot/nonebot2/pull/2761))
### 🍻 机器人发布
- Bot: Minecraft_QQBot [@noneflow](https://github.com/noneflow) ([#2837](https://github.com/nonebot/nonebot2/pull/2837))
- Bot: 星辰 Bot [@noneflow](https://github.com/noneflow) ([#2824](https://github.com/nonebot/nonebot2/pull/2824))
## v2.3.2
### 🐛 Bug 修复
- Fix: 修复 ForwardRef eval 时参数 recursive_guard 缺失 [@he0119](https://github.com/he0119) ([#2778](https://github.com/nonebot/nonebot2/pull/2778))
### 📝 文档
- Docs: 修改导航栏开源之夏链接 [@KomoriDev](https://github.com/KomoriDev) ([#2798](https://github.com/nonebot/nonebot2/pull/2798))
- Docs: `on_keyword` 参数类型错误 [@TaskManagerOL](https://github.com/TaskManagerOL) ([#2795](https://github.com/nonebot/nonebot2/pull/2795))
- Docs: 修复单元测试示例代码 [@mobyw](https://github.com/mobyw) ([#2741](https://github.com/nonebot/nonebot2/pull/2741))
- Docs: 修改依赖注入定义链接 [@Weltolk](https://github.com/Weltolk) ([#2733](https://github.com/nonebot/nonebot2/pull/2733))
### 🍻 插件发布
- Plugin: 指令更新NapCat [@noneflow](https://github.com/noneflow) ([#2791](https://github.com/nonebot/nonebot2/pull/2791))
- Plugin: QQ群-Discord 互通 [@noneflow](https://github.com/noneflow) ([#2788](https://github.com/nonebot/nonebot2/pull/2788))
- Plugin: nonebot_plugin_obastatus [@noneflow](https://github.com/noneflow) ([#2780](https://github.com/nonebot/nonebot2/pull/2780))
- Plugin: b站消息转发 [@noneflow](https://github.com/noneflow) ([#2785](https://github.com/nonebot/nonebot2/pull/2785))
- Plugin: Daily Task [@noneflow](https://github.com/noneflow) ([#2769](https://github.com/nonebot/nonebot2/pull/2769))
- Plugin: EVE ONLINE 多功能机器人
版本 - v0.2.3
[@noneflow](https://github.com/noneflow) ([#2782](https://github.com/nonebot/nonebot2/pull/2782))
- Plugin: NTQQ自动登录/断连重启 [@noneflow](https://github.com/noneflow) ([#2786](https://github.com/nonebot/nonebot2/pull/2786))
- Plugin: asmr [@noneflow](https://github.com/noneflow) ([#2775](https://github.com/nonebot/nonebot2/pull/2775))
- Plugin: 日麻猜手牌小游戏 [@noneflow](https://github.com/noneflow) ([#2777](https://github.com/nonebot/nonebot2/pull/2777))
- Plugin: 绝地潜兵信息查询小助手 [@noneflow](https://github.com/noneflow) ([#2772](https://github.com/nonebot/nonebot2/pull/2772))
- Plugin: MCSM小助手 [@noneflow](https://github.com/noneflow) ([#2773](https://github.com/nonebot/nonebot2/pull/2773))
- Plugin: 多模态AI工具 [@noneflow](https://github.com/noneflow) ([#2758](https://github.com/nonebot/nonebot2/pull/2758))
- Plugin: nonebot-plugin-easymarkdown [@noneflow](https://github.com/noneflow) ([#2767](https://github.com/nonebot/nonebot2/pull/2767))
- Plugin: 峯驰外包 [@noneflow](https://github.com/noneflow) ([#2765](https://github.com/nonebot/nonebot2/pull/2765))
- Plugin: 鸣潮抽卡记录分析 [@noneflow](https://github.com/noneflow) ([#2763](https://github.com/nonebot/nonebot2/pull/2763))
- Plugin: nonebot-plugin-xjie-weather [@noneflow](https://github.com/noneflow) ([#2756](https://github.com/nonebot/nonebot2/pull/2756))
- Plugin: 颜值评分 [@noneflow](https://github.com/noneflow) ([#2752](https://github.com/nonebot/nonebot2/pull/2752))
- Plugin: 学园偶像大师算分插件 [@noneflow](https://github.com/noneflow) ([#2750](https://github.com/nonebot/nonebot2/pull/2750))
- Plugin: nonebot-plugin-lynchpined [@noneflow](https://github.com/noneflow) ([#2748](https://github.com/nonebot/nonebot2/pull/2748))
- Plugin: QQShell [@noneflow](https://github.com/noneflow) ([#2745](https://github.com/nonebot/nonebot2/pull/2745))
- Plugin: ai唱歌 [@noneflow](https://github.com/noneflow) ([#2743](https://github.com/nonebot/nonebot2/pull/2743))
- Plugin: 复读姬+1 PlusOne [@noneflow](https://github.com/noneflow) ([#2732](https://github.com/nonebot/nonebot2/pull/2732))
- Plugin: 高优先级关闭信号钩子插件 [@noneflow](https://github.com/noneflow) ([#2737](https://github.com/nonebot/nonebot2/pull/2737))
- Plugin: 插件响应鉴权 [@noneflow](https://github.com/noneflow) ([#2727](https://github.com/nonebot/nonebot2/pull/2727))
- Plugin: DG-Lab-Play [@noneflow](https://github.com/noneflow) ([#2729](https://github.com/nonebot/nonebot2/pull/2729))
## v2.3.1
### 🐛 Bug 修复
- Fix: State ForwardRef 检测错误 [@yanyongyu](https://github.com/yanyongyu) ([#2698](https://github.com/nonebot/nonebot2/pull/2698))
### 📝 文档
- Docs: 修正 匹配扩展 中的示例 [@KomoriDev](https://github.com/KomoriDev) ([#2722](https://github.com/nonebot/nonebot2/pull/2722))
- Docs: 更新 Mirai 适配器说明 [@RF-Tar-Railt](https://github.com/RF-Tar-Railt) ([#2715](https://github.com/nonebot/nonebot2/pull/2715))
- Docs: 添加 Tailchat 适配器说明 [@eya46](https://github.com/eya46) ([#2694](https://github.com/nonebot/nonebot2/pull/2694))
- Docs: 添加 uwu logo [@StarHeartHunt](https://github.com/StarHeartHunt) ([#2689](https://github.com/nonebot/nonebot2/pull/2689))
### 💫 杂项
- Plugin: 移除已在 PyPI 上删除的 `covid` 插件和 `molar-mass` 插件 [@NCBM](https://github.com/NCBM) ([#2712](https://github.com/nonebot/nonebot2/pull/2712))
### 🍻 插件发布
- Plugin: 自定义人格和AI绘图的混合聊天BOT [@noneflow](https://github.com/noneflow) ([#2724](https://github.com/nonebot/nonebot2/pull/2724))
- Plugin: nonebot-plugin-calc24 [@noneflow](https://github.com/noneflow) ([#2721](https://github.com/nonebot/nonebot2/pull/2721))
- Plugin: nonebot-plugin-tsugu-bangdream-bot [@noneflow](https://github.com/noneflow) ([#2719](https://github.com/nonebot/nonebot2/pull/2719))
- Plugin: 科大讯飞星火大语言模型官方API聊天机器人插件 [@noneflow](https://github.com/noneflow) ([#2717](https://github.com/nonebot/nonebot2/pull/2717))
- Plugin: nonebot_plugin_valve_server_query [@noneflow](https://github.com/noneflow) ([#2711](https://github.com/nonebot/nonebot2/pull/2711))
- Plugin: 库洛游戏信息 [@noneflow](https://github.com/noneflow) ([#2706](https://github.com/nonebot/nonebot2/pull/2706))
- Plugin: BanG Dream! Tsugu Frontend [@noneflow](https://github.com/noneflow) ([#2708](https://github.com/nonebot/nonebot2/pull/2708))
- Plugin: 神秘学助手 [@noneflow](https://github.com/noneflow) ([#2700](https://github.com/nonebot/nonebot2/pull/2700))
- Plugin: nonebot-plugin-furryfusion [@noneflow](https://github.com/noneflow) ([#2705](https://github.com/nonebot/nonebot2/pull/2705))
- Plugin: nonebot-plugin-RanFurryPic [@noneflow](https://github.com/noneflow) ([#2703](https://github.com/nonebot/nonebot2/pull/2703))
- Plugin: with_ai_agents [@noneflow](https://github.com/noneflow) ([#2697](https://github.com/nonebot/nonebot2/pull/2697))
- Plugin: 番剧下载 [@noneflow](https://github.com/noneflow) ([#2691](https://github.com/nonebot/nonebot2/pull/2691))
### 🍻 适配器发布
- Adapter: Mirai [@noneflow](https://github.com/noneflow) ([#2714](https://github.com/nonebot/nonebot2/pull/2714))
- Adapter: Tailchat [@noneflow](https://github.com/noneflow) ([#2693](https://github.com/nonebot/nonebot2/pull/2693))
## v2.3.0 ## v2.3.0
### 💥 破坏性变更 ### 💥 破坏性变更

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 50 KiB

2
website/static/uwu.js Normal file
View File

@@ -0,0 +1,2 @@
if (location.search.includes("?uwu"))
document.documentElement.setAttribute("data-uwu", "true");

View File

@@ -1,44 +0,0 @@
---
sidebar_position: 3
description: nonebot.drivers.httpx 模块
---
# nonebot.drivers.httpx
[HTTPX](https://www.python-httpx.org/) 驱动适配
```bash
nb driver install httpx
# 或者
pip install nonebot2[httpx]
```
:::tip 提示
本驱动仅支持客户端 HTTP 连接
:::
## _class_ `Mixin(<auto>)` {#Mixin}
- **说明:** HTTPX Mixin
- **参数**
auto
### _async method_ `request(setup)` {#Mixin-request}
- **参数**
- `setup` ([Request](index.md#Request))
- **返回**
- [Response](index.md#Response)
## _class_ `Driver(env, config)` {#Driver}
- **参数**
- `env` ([Env](../config.md#Env))
- `config` ([Config](../config.md#Config))

View File

@@ -1,44 +0,0 @@
---
sidebar_position: 3
description: nonebot.drivers.httpx 模块
---
# nonebot.drivers.httpx
[HTTPX](https://www.python-httpx.org/) 驱动适配
```bash
nb driver install httpx
# 或者
pip install nonebot2[httpx]
```
:::tip 提示
本驱动仅支持客户端 HTTP 连接
:::
## _class_ `Mixin(<auto>)` {#Mixin}
- **说明:** HTTPX Mixin
- **参数**
auto
### _async method_ `request(setup)` {#Mixin-request}
- **参数**
- `setup` ([Request](index.md#Request))
- **返回**
- [Response](index.md#Response)
## _class_ `Driver(env, config)` {#Driver}
- **参数**
- `env` ([Env](../config.md#Env))
- `config` ([Config](../config.md#Config))

View File

@@ -34,7 +34,7 @@ NoneBot 采用了一套自行定义的依赖注入系统,可以让事件的处
#### 什么是依赖注入 #### 什么是依赖注入
[**『依赖注入』**](https://zh.m.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**『依赖』**。 [**『依赖注入』**](https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**『依赖』**。
系统(在这里是指 NoneBot将负责做任何需要的事情为你的代码提供这些必要依赖即**『注入』**依赖性) 系统(在这里是指 NoneBot将负责做任何需要的事情为你的代码提供这些必要依赖即**『注入』**依赖性)

View File

@@ -154,7 +154,7 @@ rule = keyword("hello", "hi")
```python ```python
from nonebot import on_keyword from nonebot import on_keyword
matcher = on_keyword("hello", "hi") matcher = on_keyword({"hello", "hi"})
``` ```
### `command` ### `command`

View File

@@ -73,10 +73,12 @@ CUSTOM_CONFIG=config in dotenv
同时,设置环境变量: 同时,设置环境变量:
```bash ```bash
# windows # windows cmd
set CUSTOM_CONFIG "config in environment variables" set CUSTOM_CONFIG 'config in environment variables'
# windows powershell
$Env:CUSTOM_CONFIG='config in environment variables'
# linux/macOS # linux/macOS
export CUSTOM_CONFIG="config in environment variables" export CUSTOM_CONFIG='config in environment variables'
``` ```
那最终 NoneBot 所读取的内容为环境变量中的内容,即 `config in environment variables`。 那最终 NoneBot 所读取的内容为环境变量中的内容,即 `config in environment variables`。
@@ -295,8 +297,10 @@ DRIVER=~fastapi+~httpx+~websockets
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set DRIVER '~fastapi+~httpx+~websockets' set DRIVER '~fastapi+~httpx+~websockets'
# windows powershell
$Env:DRIVER='~fastapi+~httpx+~websockets'
# linux/macOS # linux/macOS
export DRIVER='~fastapi+~httpx+~websockets' export DRIVER='~fastapi+~httpx+~websockets'
``` ```
@@ -331,8 +335,10 @@ HOST=127.0.0.1
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set HOST '127.0.0.1' set HOST '127.0.0.1'
# windows powershell
$Env:HOST='127.0.0.1'
# linux/macOS # linux/macOS
export HOST='127.0.0.1' export HOST='127.0.0.1'
``` ```
@@ -367,8 +373,10 @@ PORT=8080
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set PORT '8080' set PORT '8080'
# windows powershell
$Env:PORT='8080'
# linux/macOS # linux/macOS
export PORT='8080' export PORT='8080'
``` ```
@@ -407,8 +415,10 @@ LOG_LEVEL=DEBUG
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set LOG_LEVEL 'DEBUG' set LOG_LEVEL 'DEBUG'
# windows powershell
$Env:LOG_LEVEL='DEBUG'
# linux/macOS # linux/macOS
export LOG_LEVEL='DEBUG' export LOG_LEVEL='DEBUG'
``` ```
@@ -443,8 +453,10 @@ API_TIMEOUT=10.0
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set API_TIMEOUT '10.0' set API_TIMEOUT '10.0'
# windows powershell
$Env:API_TIMEOUT='10.0'
# linux/macOS # linux/macOS
export API_TIMEOUT='10.0' export API_TIMEOUT='10.0'
``` ```
@@ -479,8 +491,10 @@ SUPERUSERS=["123123123"]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set SUPERUSERS '["123123123"]' set SUPERUSERS '["123123123"]'
# windows powershell
$Env:SUPERUSERS='["123123123"]'
# linux/macOS # linux/macOS
export SUPERUSERS='["123123123"]' export SUPERUSERS='["123123123"]'
``` ```
@@ -515,8 +529,10 @@ NICKNAME=["bot"]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set NICKNAME '["bot"]' set NICKNAME '["bot"]'
# windows powershell
$Env:NICKNAME='["bot"]'
# linux/macOS # linux/macOS
export NICKNAME='["bot"]' export NICKNAME='["bot"]'
``` ```
@@ -554,9 +570,12 @@ COMMAND_SEP=[".", " "]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set COMMAND_START '["/", ""]' set COMMAND_START '["/", ""]'
set COMMAND_SEP '[".", " "]' set COMMAND_SEP '[".", " "]'
# windows powershell
$Env:COMMAND_START='["/", ""]'
$Env:COMMAND_SEP='[".", " "]'
# linux/macOS # linux/macOS
export COMMAND_START='["/", ""]' export COMMAND_START='["/", ""]'
export COMMAND_SEP='[".", " "]' export COMMAND_SEP='[".", " "]'
@@ -592,8 +611,10 @@ SESSION_EXPIRE_TIMEOUT=00:02:00
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set SESSION_EXPIRE_TIMEOUT '00:02:00' set SESSION_EXPIRE_TIMEOUT '00:02:00'
# windows powershell
$Env:SESSION_EXPIRE_TIMEOUT='00:02:00'
# linux/macOS # linux/macOS
export SESSION_EXPIRE_TIMEOUT='00:02:00' export SESSION_EXPIRE_TIMEOUT='00:02:00'
``` ```

View File

@@ -150,7 +150,7 @@ async def test_weather(app: App):
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message("/天气 北京"), message=Message("/天气 北京"),
user=User(user_id=123456789), user=User(id="user"),
) )
``` ```
@@ -165,7 +165,7 @@ async def test_weather(app: App):
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message("/天气 北京"), message=Message("/天气 北京"),
user=User(user_id=123456789), user=User(id="user"),
) )
async with app.test_matcher(weather) as ctx: async with app.test_matcher(weather) as ctx:
bot = ctx.create_bot() bot = ctx.create_bot()
@@ -184,7 +184,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio

View File

@@ -56,7 +56,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -95,7 +95,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -131,7 +131,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -202,7 +202,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -264,7 +264,7 @@ def make_event(message: str = "") -> MessageEvent:
time=datetime.now(), time=datetime.now(),
self_id="test", self_id="test",
message=Message(message), message=Message(message),
user=User(user_id=123456789), user=User(id="user"),
) )
@pytest.mark.asyncio @pytest.mark.asyncio

View File

@@ -8,7 +8,7 @@ slug: /
NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架(下称 NoneBot它基于 Python 的类型注解和异步优先特性兼容同步能够为你的需求实现提供便捷灵活的支持。同时NoneBot 拥有大量的开发者为其开发插件,用户无需编写任何代码,仅需完成环境配置及插件安装,就可以正常使用 NoneBot。 NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架(下称 NoneBot它基于 Python 的类型注解和异步优先特性兼容同步能够为你的需求实现提供便捷灵活的支持。同时NoneBot 拥有大量的开发者为其开发插件,用户无需编写任何代码,仅需完成环境配置及插件安装,就可以正常使用 NoneBot。
需要注意的是NoneBot 仅支持 **Python 3.8 以上版本** 需要注意的是NoneBot 仅支持 **Python 3.9 以上版本**
## 特色 ## 特色
@@ -34,7 +34,7 @@ NoneBot 采用了一套自行定义的依赖注入系统,可以让事件的处
#### 什么是依赖注入 #### 什么是依赖注入
[**『依赖注入』**](https://zh.m.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**『依赖』**。 [**『依赖注入』**](https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**『依赖』**。
系统(在这里是指 NoneBot将负责做任何需要的事情为你的代码提供这些必要依赖即**『注入』**依赖性) 系统(在这里是指 NoneBot将负责做任何需要的事情为你的代码提供这些必要依赖即**『注入』**依赖性)

View File

@@ -89,7 +89,7 @@ async def _(bot): ... # 兼容性处理
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="3.9" label="Python 3.9">
```python ```python
from typing import Union from typing import Union
@@ -127,7 +127,7 @@ async def _(event): ... # 兼容性处理
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="3.9" label="Python 3.9">
```python ```python
from typing import Union from typing import Union
@@ -191,7 +191,7 @@ async def _(e: ActionFailed | NetworkError): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="3.9" label="Python 3.9">
```python {6,9} ```python {6,9}
from typing import Union from typing import Union
@@ -216,8 +216,8 @@ async def _(e: Union[ActionFailed, NetworkError]): ...
子依赖使用 `Depends` 标记进行定义,其参数即依赖的函数或可调用对象,同样会被解析为 `Dependent` 对象,将会在依赖注入期间执行。我们来看一个例子: 子依赖使用 `Depends` 标记进行定义,其参数即依赖的函数或可调用对象,同样会被解析为 `Dependent` 对象,将会在依赖注入期间执行。我们来看一个例子:
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {5,15} ```python {5,15}
from typing import Annotated from typing import Annotated
@@ -239,7 +239,7 @@ async def _(event: Annotated[Event, Depends(check)]):
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3,13} ```python {3,13}
from nonebot import on_command from nonebot import on_command
@@ -287,8 +287,8 @@ async def _():
NoneBot 在执行子依赖时,会将其返回值缓存起来。当我们在使用子依赖时,`Depends` 具有一个参数 `use_cache`,默认为 `True`。此时在事件处理流程中,多次使用同一个子依赖时,将会使用缓存中的结果而不会重复执行。这在很多情景中非常有用,例如: NoneBot 在执行子依赖时,会将其返回值缓存起来。当我们在使用子依赖时,`Depends` 具有一个参数 `use_cache`,默认为 `True`。此时在事件处理流程中,多次使用同一个子依赖时,将会使用缓存中的结果而不会重复执行。这在很多情景中非常有用,例如:
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {7} ```python {7}
import random import random
@@ -302,7 +302,7 @@ async def _(x: Annotated[int, Depends(random_result)]):
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {6} ```python {6}
import random import random
@@ -319,8 +319,8 @@ async def _(x: int = Depends(random_result)):
此时,在同一事件处理流程中,这个随机函数的返回值将会保持一致。如果我们希望每次都重新执行子依赖,可以将 `use_cache` 设置为 `False`。 此时,在同一事件处理流程中,这个随机函数的返回值将会保持一致。如果我们希望每次都重新执行子依赖,可以将 `use_cache` 设置为 `False`。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {7} ```python {7}
import random import random
@@ -334,7 +334,7 @@ async def _(x: Annotated[int, Depends(random_result, use_cache=False)]):
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {6} ```python {6}
import random import random
@@ -357,8 +357,8 @@ async def _(x: int = Depends(random_result, use_cache=False)):
在依赖注入系统中,我们可以对子依赖的返回值进行自动类型转换与校验。这个功能由 Pydantic 支持,因此我们通过参数类型注解自动使用 Pydantic 支持的类型转换。例如: 在依赖注入系统中,我们可以对子依赖的返回值进行自动类型转换与校验。这个功能由 Pydantic 支持,因此我们通过参数类型注解自动使用 Pydantic 支持的类型转换。例如:
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {6,9} ```python {6,9}
from typing import Annotated from typing import Annotated
@@ -374,7 +374,7 @@ async def _(user_id: Annotated[int, Depends(get_user_id, validate=True)]):
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4,7} ```python {4,7}
from nonebot.params import Depends from nonebot.params import Depends
@@ -392,8 +392,8 @@ async def _(user_id: int = Depends(get_user_id, validate=True)):
在进行类型自动转换的同时Pydantic 还支持对数据进行更多的限制,如:大于、小于、长度等。使用方法如下: 在进行类型自动转换的同时Pydantic 还支持对数据进行更多的限制,如:大于、小于、长度等。使用方法如下:
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {7,10} ```python {7,10}
from typing import Annotated from typing import Annotated
@@ -410,7 +410,7 @@ async def _(user_id: Annotated[int, Depends(get_user_id, validate=Field(gt=100))
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {5,8} ```python {5,8}
from pydantic import Field from pydantic import Field
@@ -431,8 +431,8 @@ async def _(user_id: int = Depends(get_user_id, validate=Field(gt=100))):
在前面的事例中,我们使用了函数作为子依赖。实际上,我们还可以使用类作为依赖。当我们在实例化一个类的时候,其实我们就在调用它,类本身也是一个可调用对象。例如: 在前面的事例中,我们使用了函数作为子依赖。实际上,我们还可以使用类作为依赖。当我们在实例化一个类的时候,其实我们就在调用它,类本身也是一个可调用对象。例如:
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {16} ```python {16}
from typing import Annotated from typing import Annotated
@@ -455,7 +455,7 @@ async def _(data: Annotated[ClassDependency, Depends(ClassDependency)]):
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {15} ```python {15}
from dataclasses import dataclass from dataclasses import dataclass
@@ -481,8 +481,8 @@ async def _(data: ClassDependency = Depends(ClassDependency)):
可以看到,我们使用 `dataclass` 定义了一个类。由于这个类的 `__init__` 方法可以被依赖注入系统解析,因此,我们可以将其作为子依赖进行声明。特别地,对于类依赖,`Depends` 的参数可以为空NoneBot 将会使用参数的类型注解进行解析与推断: 可以看到,我们使用 `dataclass` 定义了一个类。由于这个类的 `__init__` 方法可以被依赖注入系统解析,因此,我们可以将其作为子依赖进行声明。特别地,对于类依赖,`Depends` 的参数可以为空NoneBot 将会使用参数的类型注解进行解析与推断:
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python ```python
from typing import Annotated from typing import Annotated
@@ -492,7 +492,7 @@ async def _(data: Annotated[ClassDependency, Depends()]):
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python ```python
async def _(data: ClassDependency = Depends()): async def _(data: ClassDependency = Depends()):
@@ -510,11 +510,12 @@ NoneBot 的依赖注入支持依赖项在事件处理流程结束后进行一些
我们可以看下述代码段, 使用 `httpx.AsyncClient` 异步网络 IO并在事件处理流程中共用一个 client 我们可以看下述代码段, 使用 `httpx.AsyncClient` 异步网络 IO并在事件处理流程中共用一个 client
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {15} ```python {15}
from typing import Annotated, AsyncGenerator from typing import Annotated
from collections.abc import AsyncGenerator
import httpx import httpx
from nonebot.params import Depends from nonebot.params import Depends
@@ -533,10 +534,10 @@ async def _(x: Annotated[httpx.AsyncClient, Depends(get_client)]):
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {15} ```python {15}
from typing import AsyncGenerator from collections.abc import AsyncGenerator
import httpx import httpx
from nonebot.params import Depends from nonebot.params import Depends
@@ -566,11 +567,10 @@ async def _(x: httpx.AsyncClient = Depends(get_client)):
在 Python 里,为类定义 `__call__` 方法就可以使得这个类的实例成为一个可调用对象。因此,我们也可以将定义了 `__call__` 方法的类的实例作为依赖。事实上NoneBot 的[内置响应规则](./matcher.md#内置响应规则)就广泛使用了这种方式,以 `is_type` 规则为例: 在 Python 里,为类定义 `__call__` 方法就可以使得这个类的实例成为一个可调用对象。因此,我们也可以将定义了 `__call__` 方法的类的实例作为依赖。事实上NoneBot 的[内置响应规则](./matcher.md#内置响应规则)就广泛使用了这种方式,以 `is_type` 规则为例:
```python ```python
from typing import Type
from nonebot.adapters import Event from nonebot.adapters import Event
class IsTypeRule: class IsTypeRule:
def __init__(self, *types: Type[Event]): def __init__(self, *types: type[Event]):
self.types = types self.types = types
async def __call__(self, event: Event) -> bool: async def __call__(self, event: Event) -> bool:
@@ -587,8 +587,8 @@ class IsTypeRule:
获取当前事件的类型。 获取当前事件的类型。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -598,7 +598,7 @@ async def _(foo: Annotated[str, EventType()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import EventType from nonebot.params import EventType
@@ -613,8 +613,8 @@ async def _(foo: str = EventType()): ...
获取当前事件的消息。 获取当前事件的消息。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {5} ```python {5}
from typing import Annotated from typing import Annotated
@@ -625,7 +625,7 @@ async def _(foo: Annotated[Message, EventMessage()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4} ```python {4}
from nonebot.adapters import Message from nonebot.adapters import Message
@@ -641,8 +641,8 @@ async def _(foo: Message = EventMessage()): ...
获取当前事件的消息纯文本部分。 获取当前事件的消息纯文本部分。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -652,7 +652,7 @@ async def _(foo: Annotated[str, EventPlainText()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import EventPlainText from nonebot.params import EventPlainText
@@ -667,8 +667,8 @@ async def _(foo: str = EventPlainText()): ...
获取当前事件是否与机器人相关。 获取当前事件是否与机器人相关。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -678,7 +678,7 @@ async def _(foo: Annotated[bool, EventToMe()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import EventToMe from nonebot.params import EventToMe
@@ -693,8 +693,8 @@ async def _(foo: bool = EventToMe()): ...
获取当前命令型消息的元组形式命令名。 获取当前命令型消息的元组形式命令名。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -704,13 +704,12 @@ async def _(foo: Annotated[tuple[str, ...], Command()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4} ```python {4}
from typing import Tuple
from nonebot.params import Command from nonebot.params import Command
async def _(foo: Tuple[str, ...] = Command()): ... async def _(foo: tuple[str, ...] = Command()): ...
``` ```
</TabItem> </TabItem>
@@ -724,8 +723,8 @@ async def _(foo: Tuple[str, ...] = Command()): ...
获取当前命令型消息的文本形式命令名。 获取当前命令型消息的文本形式命令名。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -735,7 +734,7 @@ async def _(foo: Annotated[str, RawCommand()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import RawCommand from nonebot.params import RawCommand
@@ -754,8 +753,8 @@ async def _(foo: str = RawCommand()): ...
获取命令型消息命令后跟随的参数。 获取命令型消息命令后跟随的参数。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {5} ```python {5}
from typing import Annotated from typing import Annotated
@@ -766,7 +765,7 @@ async def _(foo: Annotated[Message, CommandArg()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4} ```python {4}
from nonebot.adapters import Message from nonebot.adapters import Message
@@ -786,8 +785,8 @@ async def _(foo: Message = CommandArg()): ...
获取命令型消息命令前缀。 获取命令型消息命令前缀。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -797,7 +796,7 @@ async def _(foo: Annotated[str, CommandStart()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import CommandStart from nonebot.params import CommandStart
@@ -816,8 +815,8 @@ async def _(foo: str = CommandStart()): ...
获取命令型消息命令与参数间空白符。 获取命令型消息命令与参数间空白符。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -827,7 +826,7 @@ async def _(foo: Annotated[str, CommandWhitespace()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import CommandWhitespace from nonebot.params import CommandWhitespace
@@ -854,10 +853,16 @@ from typing import Annotated
from nonebot.params import ShellCommandArgs from nonebot.params import ShellCommandArgs
async def _(foo: Annotated[list[str | MessageSegment], ShellCommandArgv()]): ... async def _(foo: Annotated[list[str | MessageSegment], ShellCommandArgv()]): ...
```
```python {4}
from nonebot.params import ShellCommandArgs
async def _(foo: list[str | MessageSegment] = ShellCommandArgv()): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.9" label="Python 3.9+"> <TabItem value="3.9" label="Python 3.9">
```python {4} ```python {4}
from typing import Union, Annotated from typing import Union, Annotated
@@ -866,14 +871,11 @@ from nonebot.params import ShellCommandArgs
async def _(foo: Annotated[list[Union[str, MessageSegment]], ShellCommandArgv()]): ... async def _(foo: Annotated[list[Union[str, MessageSegment]], ShellCommandArgv()]): ...
``` ```
</TabItem>
<TabItem value="3.8" label="Python 3.8+">
```python {4} ```python {4}
from typing import List, Union from typing import Union
from nonebot.params import ShellCommandArgs from nonebot.params import ShellCommandArgs
async def _(foo: List[Union[str, MessageSegment]] = ShellCommandArgv()): ... async def _(foo: list[Union[str, MessageSegment]] = ShellCommandArgv()): ...
``` ```
</TabItem> </TabItem>
@@ -889,8 +891,8 @@ async def _(foo: List[Union[str, MessageSegment]] = ShellCommandArgv()): ...
由于 `ArgumentParser` 在解析到 `--help` 参数时也会抛出异常,这种情况下错误码为 `0` 且错误信息即为帮助信息。 由于 `ArgumentParser` 在解析到 `--help` 参数时也会抛出异常,这种情况下错误码为 `0` 且错误信息即为帮助信息。
::: :::
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {14,22} ```python {14,22}
from typing import Annotated from typing import Annotated
@@ -919,7 +921,7 @@ async def _(foo: Annotated[Namespace, ShellCommandArgs()]):
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {12,20} ```python {12,20}
from nonebot import on_shell_command from nonebot import on_shell_command
@@ -952,8 +954,8 @@ async def _(foo: Namespace = ShellCommandArgs()):
获取正则匹配结果的对象。 获取正则匹配结果的对象。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {5} ```python {5}
from re import Match from re import Match
@@ -964,10 +966,10 @@ async def _(foo: Annotated[Match[str], RegexMatched()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4} ```python {4}
from typing import Match from re import Match
from nonebot.params import RegexMatched from nonebot.params import RegexMatched
async def _(foo: Match[str] = RegexMatched()): ... async def _(foo: Match[str] = RegexMatched()): ...
@@ -980,8 +982,8 @@ async def _(foo: Match[str] = RegexMatched()): ...
获取正则匹配结果的文本。 获取正则匹配结果的文本。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -991,7 +993,7 @@ async def _(foo: Annotated[str, RegexStr()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import RegexStr from nonebot.params import RegexStr
@@ -1006,8 +1008,8 @@ async def _(foo: str = RegexStr()): ...
获取正则匹配结果的 group 元组。 获取正则匹配结果的 group 元组。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Any, Annotated from typing import Any, Annotated
@@ -1017,13 +1019,13 @@ async def _(foo: Annotated[tuple[Any, ...], RegexGroup()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4} ```python {4}
from typing import Tuple, Any from typing import Any
from nonebot.params import RegexGroup from nonebot.params import RegexGroup
async def _(foo: Tuple[Any, ...] = RegexGroup()): ... async def _(foo: tuple[Any, ...] = RegexGroup()): ...
``` ```
</TabItem> </TabItem>
@@ -1033,8 +1035,8 @@ async def _(foo: Tuple[Any, ...] = RegexGroup()): ...
获取正则匹配结果的 group 字典。 获取正则匹配结果的 group 字典。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Any, Annotated from typing import Any, Annotated
@@ -1044,13 +1046,13 @@ async def _(foo: Annotated[dict[str, Any], RegexDict()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4} ```python {4}
from typing import Any, Dict from typing import Any
from nonebot.params import RegexDict from nonebot.params import RegexDict
async def _(foo: Dict[str, Any] = RegexDict()): ... async def _(foo: dict[str, Any] = RegexDict()): ...
``` ```
</TabItem> </TabItem>
@@ -1060,8 +1062,8 @@ async def _(foo: Dict[str, Any] = RegexDict()): ...
获取触发响应器的消息前缀字符串。 获取触发响应器的消息前缀字符串。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -1071,7 +1073,7 @@ async def _(foo: Annotated[str, Startswith()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import Startswith from nonebot.params import Startswith
@@ -1086,8 +1088,8 @@ async def _(foo: str = Startswith()): ...
获取触发响应器的消息后缀字符串。 获取触发响应器的消息后缀字符串。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -1097,7 +1099,7 @@ async def _(foo: Annotated[str, Endswith()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import Endswith from nonebot.params import Endswith
@@ -1112,8 +1114,8 @@ async def _(foo: str = Endswith()): ...
获取触发响应器的消息字符串。 获取触发响应器的消息字符串。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -1123,7 +1125,7 @@ async def _(foo: Annotated[str, Fullmatch()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import Fullmatch from nonebot.params import Fullmatch
@@ -1138,8 +1140,8 @@ async def _(foo: str = Fullmatch()): ...
获取触发响应器的关键字字符串。 获取触发响应器的关键字字符串。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {4} ```python {4}
from typing import Annotated from typing import Annotated
@@ -1149,7 +1151,7 @@ async def _(foo: Annotated[str, Keyword()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {3} ```python {3}
from nonebot.params import Keyword from nonebot.params import Keyword
@@ -1164,8 +1166,8 @@ async def _(foo: str = Keyword()): ...
获取某次 `receive` 接收的事件。 获取某次 `receive` 接收的事件。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {7} ```python {7}
from typing import Annotated from typing import Annotated
@@ -1178,7 +1180,7 @@ async def _(foo: Annotated[Event, Received("id")]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {5} ```python {5}
from nonebot.adapters import Event from nonebot.adapters import Event
@@ -1195,8 +1197,8 @@ async def _(foo: Event = Received("id")): ...
获取最近一次 `receive` 接收的事件。 获取最近一次 `receive` 接收的事件。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {7} ```python {7}
from typing import Annotated from typing import Annotated
@@ -1209,7 +1211,7 @@ async def _(foo: Annotated[Event, LastReceived()]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {5} ```python {5}
from nonebot.adapters import Event from nonebot.adapters import Event
@@ -1226,8 +1228,8 @@ async def _(foo: Event = LastReceived()): ...
获取某次 `got` 接收的参数。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。 获取某次 `got` 接收的参数。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {7,8} ```python {7,8}
from typing import Annotated from typing import Annotated
@@ -1241,7 +1243,7 @@ async def _(foo: Annotated[Message, Arg("key")]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {5,6} ```python {5,6}
from nonebot.params import Arg from nonebot.params import Arg
@@ -1259,8 +1261,8 @@ async def _(foo: Message = Arg("key")): ...
获取某次 `got` 接收的参数,并转换为字符串。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。 获取某次 `got` 接收的参数,并转换为字符串。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {6,7} ```python {6,7}
from typing import Annotated from typing import Annotated
@@ -1273,7 +1275,7 @@ async def _(foo: Annotated[str, ArgStr("key")]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4,5} ```python {4,5}
from nonebot.params import ArgStr from nonebot.params import ArgStr
@@ -1290,8 +1292,8 @@ async def _(foo: str = ArgStr("key")): ...
获取某次 `got` 接收的参数的纯文本部分。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。 获取某次 `got` 接收的参数的纯文本部分。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。
<Tabs groupId="python"> <Tabs groupId="annotated">
<TabItem value="3.9" label="Python 3.9+" default> <TabItem value="annotated" label="Use Annotated" default>
```python {6,7} ```python {6,7}
from typing import Annotated from typing import Annotated
@@ -1304,7 +1306,7 @@ async def _(foo: Annotated[str, ArgPlainText("key")]): ...
``` ```
</TabItem> </TabItem>
<TabItem value="3.8" label="Python 3.8+"> <TabItem value="no-annotated" label="Without Annotated">
```python {4,5} ```python {4,5}
from nonebot.params import ArgPlainText from nonebot.params import ArgPlainText

View File

@@ -154,7 +154,7 @@ rule = keyword("hello", "hi")
```python ```python
from nonebot import on_keyword from nonebot import on_keyword
matcher = on_keyword("hello", "hi") matcher = on_keyword({"hello", "hi"})
``` ```
### `command` ### `command`

View File

@@ -823,7 +823,7 @@ description: nonebot.adapters 模块
- **返回** - **返回**
- untyped - TF
### _method_ `format_map(mapping)` {#MessageTemplate-format-map} ### _method_ `format_map(mapping)` {#MessageTemplate-format-map}

View File

@@ -17,6 +17,52 @@ pip install nonebot2[aiohttp]
本驱动仅支持客户端连接 本驱动仅支持客户端连接
::: :::
## _class_ `Session(params=None, headers=None, cookies=None, version=HTTPVersion.H11, timeout=None, proxy=None)` {#Session}
- **参数**
- `params` (QueryTypes)
- `headers` (HeaderTypes)
- `cookies` (CookieTypes)
- `version` (str | [HTTPVersion](index.md#HTTPVersion))
- `timeout` (float | None)
- `proxy` (str | None)
### _async method_ `request(setup)` {#Session-request}
- **参数**
- `setup` ([Request](index.md#Request))
- **返回**
- [Response](index.md#Response)
### _async method_ `setup()` {#Session-setup}
- **参数**
empty
- **返回**
- None
### _async method_ `close()` {#Session-close}
- **参数**
empty
- **返回**
- None
## _class_ `Mixin(<auto>)` {#Mixin} ## _class_ `Mixin(<auto>)` {#Mixin}
- **说明:** AIOHTTP Mixin - **说明:** AIOHTTP Mixin
@@ -45,6 +91,26 @@ pip install nonebot2[aiohttp]
- AsyncGenerator[[WebSocket](index.md#WebSocket), None] - AsyncGenerator[[WebSocket](index.md#WebSocket), None]
### _method_ `get_session(params=None, headers=None, cookies=None, version=HTTPVersion.H11, timeout=None, proxy=None)` {#Mixin-get-session}
- **参数**
- `params` (QueryTypes)
- `headers` (HeaderTypes)
- `cookies` (CookieTypes)
- `version` (str | [HTTPVersion](index.md#HTTPVersion))
- `timeout` (float | None)
- `proxy` (str | None)
- **返回**
- Session
## _class_ `WebSocket(*, request, session, websocket)` {#WebSocket} ## _class_ `WebSocket(*, request, session, websocket)` {#WebSocket}
- **说明:** AIOHTTP Websocket Wrapper - **说明:** AIOHTTP Websocket Wrapper
@@ -67,12 +133,14 @@ pip install nonebot2[aiohttp]
- untyped - untyped
### _async method_ `close(code=1000)` {#WebSocket-close} ### _async method_ `close(code=1000, reason="")` {#WebSocket-close}
- **参数** - **参数**
- `code` (int) - `code` (int)
- `reason` (str)
- **返回** - **返回**
- untyped - untyped

View File

@@ -139,7 +139,7 @@ pip install nonebot2[fastapi]
- None - None
### _method_ `run(host=None, port=None, *, app=None, **kwargs)` {#Driver-run} ### _method_ `run(host=None, port=None, *args, app=None, **kwargs)` {#Driver-run}
- **说明:** 使用 `uvicorn` 启动 FastAPI - **说明:** 使用 `uvicorn` 启动 FastAPI
@@ -149,6 +149,8 @@ pip install nonebot2[fastapi]
- `port` (int | None) - `port` (int | None)
- `*args`
- `app` (str | None) - `app` (str | None)
- `**kwargs` - `**kwargs`

View File

@@ -0,0 +1,110 @@
---
sidebar_position: 3
description: nonebot.drivers.httpx 模块
---
# nonebot.drivers.httpx
[HTTPX](https://www.python-httpx.org/) 驱动适配
```bash
nb driver install httpx
# 或者
pip install nonebot2[httpx]
```
:::tip 提示
本驱动仅支持客户端 HTTP 连接
:::
## _class_ `Session(params=None, headers=None, cookies=None, version=HTTPVersion.H11, timeout=None, proxy=None)` {#Session}
- **参数**
- `params` (QueryTypes)
- `headers` (HeaderTypes)
- `cookies` (CookieTypes)
- `version` (str | [HTTPVersion](index.md#HTTPVersion))
- `timeout` (float | None)
- `proxy` (str | None)
### _async method_ `request(setup)` {#Session-request}
- **参数**
- `setup` ([Request](index.md#Request))
- **返回**
- [Response](index.md#Response)
### _async method_ `setup()` {#Session-setup}
- **参数**
empty
- **返回**
- None
### _async method_ `close()` {#Session-close}
- **参数**
empty
- **返回**
- None
## _class_ `Mixin(<auto>)` {#Mixin}
- **说明:** HTTPX Mixin
- **参数**
auto
### _async method_ `request(setup)` {#Mixin-request}
- **参数**
- `setup` ([Request](index.md#Request))
- **返回**
- [Response](index.md#Response)
### _method_ `get_session(params=None, headers=None, cookies=None, version=HTTPVersion.H11, timeout=None, proxy=None)` {#Mixin-get-session}
- **参数**
- `params` (QueryTypes)
- `headers` (HeaderTypes)
- `cookies` (CookieTypes)
- `version` (str | [HTTPVersion](index.md#HTTPVersion))
- `timeout` (float | None)
- `proxy` (str | None)
- **返回**
- Session
## _class_ `Driver(env, config)` {#Driver}
- **参数**
- `env` ([Env](../config.md#Env))
- `config` ([Config](../config.md#Config))

View File

@@ -503,12 +503,14 @@ description: nonebot.drivers 模块
- type[D] - type[D]
**2.** `(driver, *mixins) -> type[CombinedDriver]` **2.** `(driver, _m, *mixins) -> type[CombinedDriver]`
- **参数** - **参数**
- `driver` (type[D]) - `driver` (type[D])
- `_m` (type[[Mixin](#Mixin)])
- `*mixins` (type[[Mixin](#Mixin)]) - `*mixins` (type[[Mixin](#Mixin)])
- **返回** - **返回**
@@ -535,6 +537,28 @@ description: nonebot.drivers 模块
- [Response](#Response) - [Response](#Response)
### _abstract method_ `get_session(params=None, headers=None, cookies=None, version=HTTPVersion.H11, timeout=None, proxy=None)` {#HTTPClientMixin-get-session}
- **说明:** 获取一个 HTTP 会话
- **参数**
- `params` (QueryTypes)
- `headers` (HeaderTypes)
- `cookies` (CookieTypes)
- `version` (str | [HTTPVersion](#HTTPVersion))
- `timeout` (float | None)
- `proxy` (str | None)
- **返回**
- HTTPClientSession
## _class_ `HTTPServerSetup(<auto>)` {#HTTPServerSetup} ## _class_ `HTTPServerSetup(<auto>)` {#HTTPServerSetup}
- **说明:** HTTP 服务器路由配置。 - **说明:** HTTP 服务器路由配置。

View File

@@ -115,7 +115,7 @@ pip install nonebot2[quart]
- None - None
### _method_ `run(host=None, port=None, *, app=None, **kwargs)` {#Driver-run} ### _method_ `run(host=None, port=None, *args, app=None, **kwargs)` {#Driver-run}
- **说明:** 使用 `uvicorn` 启动 Quart - **说明:** 使用 `uvicorn` 启动 Quart
@@ -125,6 +125,8 @@ pip install nonebot2[quart]
- `port` (int | None) - `port` (int | None)
- `*args`
- `app` (str | None) - `app` (str | None)
- `**kwargs` - `**kwargs`

View File

@@ -21,11 +21,11 @@ pip install nonebot2[websockets]
- **参数** - **参数**
- `func` ((P) -> Awaitable[T]) - `func` ((P) -> Coroutine[Any, Any, T])
- **返回** - **返回**
- (P) -> Awaitable[T] - (P) -> Coroutine[Any, Any, T]
## _class_ `Mixin(<auto>)` {#Mixin} ## _class_ `Mixin(<auto>)` {#Mixin}

View File

@@ -15,12 +15,6 @@ description: nonebot.matcher 模块
empty empty
### _instance-var_ `handlers` {#Matcher-handlers}
- **类型:** list[[Dependent](dependencies/index.md#Dependent)[Any]]
- **说明:** 事件响应器拥有的事件处理函数列表
### _class-var_ `type` {#Matcher-type} ### _class-var_ `type` {#Matcher-type}
- **类型:** ClassVar[str] - **类型:** ClassVar[str]
@@ -39,6 +33,12 @@ description: nonebot.matcher 模块
- **说明:** 事件响应器触发权限 - **说明:** 事件响应器触发权限
### _class-var_ `handlers` {#Matcher-handlers}
- **类型:** ClassVar[list[[Dependent](dependencies/index.md#Dependent)[Any]]]
- **说明:** 事件响应器拥有的事件处理函数列表
### _class-var_ `priority` {#Matcher-priority} ### _class-var_ `priority` {#Matcher-priority}
- **类型:** ClassVar[int] - **类型:** ClassVar[int]

View File

@@ -38,7 +38,7 @@ description: nonebot.plugin 模块
- `require` => [`require`](load.md#require) - `require` => [`require`](load.md#require)
- `PluginMetadata` => [`PluginMetadata`](model.md#PluginMetadata) - `PluginMetadata` => [`PluginMetadata`](model.md#PluginMetadata)
## _def_ `get_plugin(name)` {#get-plugin} ## _def_ `get_plugin(plugin_id)` {#get-plugin}
- **说明** - **说明**
@@ -46,9 +46,11 @@ description: nonebot.plugin 模块
如果为 `load_plugins` 文件夹导入的插件,则为文件(夹)名。 如果为 `load_plugins` 文件夹导入的插件,则为文件(夹)名。
如果为嵌套的子插件,标识符为 `父插件标识符:子插件文件(夹)名`
- **参数** - **参数**
- `name` (str): 插件,即 [Plugin.name](model.md#Plugin-name)。 - `plugin_id` (str): 插件标识符,即 [Plugin.id\_](model.md#Plugin-id-)。
- **返回** - **返回**
@@ -84,7 +86,7 @@ description: nonebot.plugin 模块
## _def_ `get_available_plugin_names()` {#get-available-plugin-names} ## _def_ `get_available_plugin_names()` {#get-available-plugin-names}
- **说明:** 获取当前所有可用的插件(包含尚未加载的插件)。 - **说明:** 获取当前所有可用的插件标识符(包含尚未加载的插件)。
- **参数** - **参数**

View File

@@ -124,15 +124,11 @@ description: nonebot.plugin.load 模块
## _def_ `require(name)` {#require} ## _def_ `require(name)` {#require}
- **说明** - **说明:** 声明依赖插件。
获取一个插件的导出内容。
如果为 `load_plugins` 文件夹导入的插件,则为文件(夹)名。
- **参数** - **参数**
- `name` (str): 插件名,即 [Plugin.name](model.md#Plugin-name) - `name` (str): 插件模块名或插件标识符,仅在已声明插件的情况下可使用标识符
- **返回** - **返回**

View File

@@ -17,37 +17,31 @@ description: nonebot.plugin.manager 模块
- `plugins` (Iterable[str] | None): 独立插件模块名集合。 - `plugins` (Iterable[str] | None): 独立插件模块名集合。
- `search_path` (Iterable[str] | None): 插件搜索路径(文件夹)。 - `search_path` (Iterable[str] | None): 插件搜索路径(文件夹),相对于当前工作目录
### _property_ `third_party_plugins` {#PluginManager-third-party-plugins} ### _property_ `third_party_plugins` {#PluginManager-third-party-plugins}
- **类型:** set[str] - **类型:** set[str]
- **说明:** 返回所有独立插件名称 - **说明:** 返回所有独立插件标识符
### _property_ `searched_plugins` {#PluginManager-searched-plugins} ### _property_ `searched_plugins` {#PluginManager-searched-plugins}
- **类型:** set[str] - **类型:** set[str]
- **说明:** 返回已搜索到的插件名称 - **说明:** 返回已搜索到的插件标识符
### _property_ `available_plugins` {#PluginManager-available-plugins} ### _property_ `available_plugins` {#PluginManager-available-plugins}
- **类型:** set[str] - **类型:** set[str]
- **说明:** 返回当前插件管理器中可用的插件名称 - **说明:** 返回当前插件管理器中可用的插件标识符
### _method_ `prepare_plugins()` {#PluginManager-prepare-plugins} ### _property_ `controlled_modules` {#PluginManager-controlled-modules}
- **说明:** 搜索插件并缓存插件名称。 - **类型:** dict[str, str]
- **参数** - **说明:** 返回当前插件管理器中控制的插件标识符与模块路径映射字典。
empty
- **返回**
- set[str]
### _method_ `load_plugin(name)` {#PluginManager-load-plugin} ### _method_ `load_plugin(name)` {#PluginManager-load-plugin}
@@ -55,11 +49,11 @@ description: nonebot.plugin.manager 模块
加载指定插件。 加载指定插件。
对于独立插件,可以使用完整插件模块名或者插件名称 可以使用完整插件模块名或者插件标识符加载
- **参数** - **参数**
- `name` (str): 插件名称。 - `name` (str): 插件名称或插件标识符
- **返回** - **返回**
@@ -105,7 +99,7 @@ description: nonebot.plugin.manager 模块
- `fullname` (str) - `fullname` (str)
- `path` - `path` (str)
### _method_ `create_module(spec)` {#PluginLoader-create-module} ### _method_ `create_module(spec)` {#PluginLoader-create-module}

View File

@@ -93,7 +93,7 @@ description: nonebot.plugin.model 模块
- **类型:** str - **类型:** str
- **说明:** 插件索引标识NoneBot 使用 文件/文件夹 名称作为标识符 - **说明:** 插件名称NoneBot 使用 文件/文件夹 名称作为插件名称
### _instance-var_ `module` {#Plugin-module} ### _instance-var_ `module` {#Plugin-module}
@@ -130,3 +130,9 @@ description: nonebot.plugin.model 模块
- **类型:** set[Plugin] - **类型:** set[Plugin]
- **说明:** 子插件集合 - **说明:** 子插件集合
### _property_ `id_` {#Plugin-id-}
- **类型:** str
- **说明:** 插件索引标识

View File

@@ -24,6 +24,16 @@ description: nonebot.typing 模块
- untyped - untyped
## _def_ `type_has_args(type_)` {#type-has-args}
- **参数**
- `type_` (type[Any])
- **返回**
- bool
## _def_ `origin_is_union(origin)` {#origin-is-union} ## _def_ `origin_is_union(origin)` {#origin-is-union}
- **参数** - **参数**
@@ -96,6 +106,12 @@ description: nonebot.typing 模块
- Any - Any
## _class_ `StateFlag(<auto>)` {#StateFlag}
- **参数**
auto
## _var_ `T_State` {#T-State} ## _var_ `T_State` {#T-State}
- **类型:** dict[Any, Any] - **类型:** dict[Any, Any]

View File

@@ -143,7 +143,7 @@ description: nonebot.utils 模块
- **参数** - **参数**
- `cm` (ContextManager[T]) - `cm` (AbstractContextManager[T])
- **返回** - **返回**

View File

@@ -73,10 +73,12 @@ CUSTOM_CONFIG=config in dotenv
同时,设置环境变量: 同时,设置环境变量:
```bash ```bash
# windows # windows cmd
set CUSTOM_CONFIG "config in environment variables" set CUSTOM_CONFIG 'config in environment variables'
# windows powershell
$Env:CUSTOM_CONFIG='config in environment variables'
# linux/macOS # linux/macOS
export CUSTOM_CONFIG="config in environment variables" export CUSTOM_CONFIG='config in environment variables'
``` ```
那最终 NoneBot 所读取的内容为环境变量中的内容,即 `config in environment variables`。 那最终 NoneBot 所读取的内容为环境变量中的内容,即 `config in environment variables`。
@@ -295,8 +297,10 @@ DRIVER=~fastapi+~httpx+~websockets
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set DRIVER '~fastapi+~httpx+~websockets' set DRIVER '~fastapi+~httpx+~websockets'
# windows powershell
$Env:DRIVER='~fastapi+~httpx+~websockets'
# linux/macOS # linux/macOS
export DRIVER='~fastapi+~httpx+~websockets' export DRIVER='~fastapi+~httpx+~websockets'
``` ```
@@ -331,8 +335,10 @@ HOST=127.0.0.1
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set HOST '127.0.0.1' set HOST '127.0.0.1'
# windows powershell
$Env:HOST='127.0.0.1'
# linux/macOS # linux/macOS
export HOST='127.0.0.1' export HOST='127.0.0.1'
``` ```
@@ -367,8 +373,10 @@ PORT=8080
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set PORT '8080' set PORT '8080'
# windows powershell
$Env:PORT='8080'
# linux/macOS # linux/macOS
export PORT='8080' export PORT='8080'
``` ```
@@ -407,8 +415,10 @@ LOG_LEVEL=DEBUG
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set LOG_LEVEL 'DEBUG' set LOG_LEVEL 'DEBUG'
# windows powershell
$Env:LOG_LEVEL='DEBUG'
# linux/macOS # linux/macOS
export LOG_LEVEL='DEBUG' export LOG_LEVEL='DEBUG'
``` ```
@@ -443,8 +453,10 @@ API_TIMEOUT=10.0
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set API_TIMEOUT '10.0' set API_TIMEOUT '10.0'
# windows powershell
$Env:API_TIMEOUT='10.0'
# linux/macOS # linux/macOS
export API_TIMEOUT='10.0' export API_TIMEOUT='10.0'
``` ```
@@ -479,8 +491,10 @@ SUPERUSERS=["123123123"]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set SUPERUSERS '["123123123"]' set SUPERUSERS '["123123123"]'
# windows powershell
$Env:SUPERUSERS='["123123123"]'
# linux/macOS # linux/macOS
export SUPERUSERS='["123123123"]' export SUPERUSERS='["123123123"]'
``` ```
@@ -515,8 +529,10 @@ NICKNAME=["bot"]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set NICKNAME '["bot"]' set NICKNAME '["bot"]'
# windows powershell
$Env:NICKNAME='["bot"]'
# linux/macOS # linux/macOS
export NICKNAME='["bot"]' export NICKNAME='["bot"]'
``` ```
@@ -554,9 +570,12 @@ COMMAND_SEP=[".", " "]
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set COMMAND_START '["/", ""]' set COMMAND_START '["/", ""]'
set COMMAND_SEP '[".", " "]' set COMMAND_SEP '[".", " "]'
# windows powershell
$Env:COMMAND_START='["/", ""]'
$Env:COMMAND_SEP='[".", " "]'
# linux/macOS # linux/macOS
export COMMAND_START='["/", ""]' export COMMAND_START='["/", ""]'
export COMMAND_SEP='[".", " "]' export COMMAND_SEP='[".", " "]'
@@ -592,8 +611,10 @@ SESSION_EXPIRE_TIMEOUT=00:02:00
<TabItem value="env" label="系统环境变量"> <TabItem value="env" label="系统环境变量">
```bash ```bash
# windows # windows cmd
set SESSION_EXPIRE_TIMEOUT '00:02:00' set SESSION_EXPIRE_TIMEOUT '00:02:00'
# windows powershell
$Env:SESSION_EXPIRE_TIMEOUT='00:02:00'
# linux/macOS # linux/macOS
export SESSION_EXPIRE_TIMEOUT='00:02:00' export SESSION_EXPIRE_TIMEOUT='00:02:00'
``` ```

Some files were not shown because too many files have changed in this diff Show More