nonebot-plugin-maimaidx 3.0.5__tar.gz → 3.0.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/PKG-INFO +1 -1
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/commands/depend.py +43 -31
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/commands/mai_alias.py +17 -11
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/commands/mai_base.py +13 -5
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/commands/mai_guess.py +5 -5
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/commands/mai_score.py +7 -4
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/commands/mai_search.py +2 -2
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/commands/mai_table.py +15 -9
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/handler.py +22 -15
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/song.py +4 -8
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/service/__init__.py +34 -17
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx.egg-info/PKG-INFO +1 -1
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/pyproject.toml +1 -1
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/LICENSE +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/README.md +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/__init__.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/commands/__init__.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/config.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/constants.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/alias_ws_push.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/divingfish/client.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/divingfish/exceptions.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/divingfish/models/__init__.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/divingfish/models/music.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/divingfish/models/score.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/exceptions.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/http.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/client.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/exceptions.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/models/__init__.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/models/base.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/models/collection.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/models/enum.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/models/music.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/models/oauth.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/models/player.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/lxns/models/score.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/yuzuchan/client.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/yuzuchan/exceptions.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/yuzuchan/models/__init__.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/yuzuchan/models/alias.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/yuzuchan/models/enum.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/yuzuchan/models/message.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/clients/yuzuchan/models/status.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/database/qq.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/handler_error.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/__init__.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/assets.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/base.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/best50.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/chart.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/info.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/plate_table.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/rating_table.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/score.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/tools.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/image/update_table.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/__init__.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/alias.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/alias_list.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/models/__init__.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/models/alias.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/models/best50.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/models/enum.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/models/guess.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/models/player.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/models/score.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/models/song.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/music_list.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/play_result.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/merge/player.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/service/diving_fish.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/service/lxns.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/service/yuzuchan.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/tool.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/utils/calc.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/maimaidxhelp.png +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/resources.py +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx.egg-info/SOURCES.txt +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx.egg-info/dependency_links.txt +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx.egg-info/requires.txt +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx.egg-info/top_level.txt +0 -0
- {nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/setup.cfg +0 -0
|
@@ -75,6 +75,14 @@ GetUserAndAuthOrNone = GetUserModel(auto_create=True, check_auth=True, check_ski
|
|
|
75
75
|
"""获取用户数据,若不存在则创建,并检查是否授权,未授权则返回`None`"""
|
|
76
76
|
|
|
77
77
|
|
|
78
|
+
def is_float(value: str) -> bool:
|
|
79
|
+
try:
|
|
80
|
+
float(value)
|
|
81
|
+
return True
|
|
82
|
+
except ValueError:
|
|
83
|
+
return False
|
|
84
|
+
|
|
85
|
+
|
|
78
86
|
async def process_regex(
|
|
79
87
|
matcher: Matcher, match: Match[str] = RegexMatched()
|
|
80
88
|
) -> tuple[list[Song], int]:
|
|
@@ -91,24 +99,26 @@ async def process_regex(
|
|
|
91
99
|
page = 1
|
|
92
100
|
match cmd:
|
|
93
101
|
case None:
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
if not a_list:
|
|
103
|
+
await matcher.finish(
|
|
104
|
+
"没有找到这样的乐曲。\n※ 如果是别名请使用「XXX是什么歌」指令进行查询哦。",
|
|
105
|
+
reply_message=True,
|
|
106
|
+
)
|
|
107
|
+
# 末尾为纯数字时视为页数,其余整体作为标题(支持含空格的标题)
|
|
108
|
+
if len(a_list) >= 2 and a_list[-1].isdigit():
|
|
109
|
+
title, page = " ".join(a_list[:-1]), int(a_list[-1])
|
|
110
|
+
else:
|
|
111
|
+
title = " ".join(a_list)
|
|
104
112
|
result = mai.total_list.filter(title=title)
|
|
105
113
|
case "定数":
|
|
106
114
|
match a_list:
|
|
107
|
-
case [ds]:
|
|
115
|
+
case [ds] if is_float(ds):
|
|
108
116
|
ds1 = ds2 = float(ds)
|
|
109
|
-
case [ds1_raw, ds2_raw]:
|
|
117
|
+
case [ds1_raw, ds2_raw] if is_float(ds1_raw) and is_float(ds2_raw):
|
|
110
118
|
ds1, ds2 = float(ds1_raw), float(ds2_raw)
|
|
111
|
-
case [ds1_raw, ds2_raw, p_raw]
|
|
119
|
+
case [ds1_raw, ds2_raw, p_raw] if (
|
|
120
|
+
is_float(ds1_raw) and is_float(ds2_raw) and p_raw.isdigit()
|
|
121
|
+
):
|
|
112
122
|
ds1, ds2, page = float(ds1_raw), float(ds2_raw), int(p_raw)
|
|
113
123
|
case _:
|
|
114
124
|
await matcher.finish(
|
|
@@ -122,15 +132,17 @@ async def process_regex(
|
|
|
122
132
|
result = mai.total_list.filter(level_value=(ds1, ds2))
|
|
123
133
|
case "bpm":
|
|
124
134
|
match a_list:
|
|
125
|
-
case [bpm_raw]:
|
|
135
|
+
case [bpm_raw] if is_float(bpm_raw):
|
|
126
136
|
result = mai.total_list.filter(bpm=float(bpm_raw))
|
|
127
|
-
case [b1, b2]:
|
|
137
|
+
case [b1, b2] if is_float(b1) and is_float(b2):
|
|
128
138
|
if float(b1) > float(b2):
|
|
129
|
-
page = int(b2)
|
|
139
|
+
page = int(float(b2))
|
|
130
140
|
result = mai.total_list.filter(bpm=float(b1))
|
|
131
141
|
else:
|
|
132
142
|
result = mai.total_list.filter(bpm=(float(b1), float(b2)))
|
|
133
|
-
case [b1, b2, p_raw]
|
|
143
|
+
case [b1, b2, p_raw] if (
|
|
144
|
+
is_float(b1) and is_float(b2) and p_raw.isdigit()
|
|
145
|
+
):
|
|
134
146
|
result = mai.total_list.filter(bpm=(float(b1), float(b2)))
|
|
135
147
|
page = int(p_raw)
|
|
136
148
|
case _:
|
|
@@ -143,23 +155,23 @@ async def process_regex(
|
|
|
143
155
|
reply_message=True,
|
|
144
156
|
)
|
|
145
157
|
case "曲师" | "谱师":
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
158
|
+
if not a_list:
|
|
159
|
+
await matcher.finish(
|
|
160
|
+
(
|
|
161
|
+
f"{cmd}查歌参数错误,请输入正确格式,页数为可选:\n"
|
|
162
|
+
f"{cmd}查歌「{cmd}」「页数」"
|
|
163
|
+
),
|
|
164
|
+
reply_message=True,
|
|
165
|
+
)
|
|
166
|
+
# 末尾为纯数字时视为页数,其余整体作为曲师/谱师名(支持含空格的名字)
|
|
167
|
+
if len(a_list) >= 2 and a_list[-1].isdigit():
|
|
168
|
+
name, page = " ".join(a_list[:-1]), int(a_list[-1])
|
|
169
|
+
else:
|
|
170
|
+
name = " ".join(a_list)
|
|
159
171
|
if cmd == "曲师":
|
|
160
172
|
result = mai.total_list.filter(artist=name)
|
|
161
173
|
else:
|
|
162
|
-
result = mai.total_list.filter(charter=name)
|
|
174
|
+
result = mai.total_list.filter(charter=name, all_diff=False)
|
|
163
175
|
case _:
|
|
164
176
|
await matcher.finish("指令错误", reply_message=True)
|
|
165
177
|
|
|
@@ -31,10 +31,10 @@ alias_apply = on_command(
|
|
|
31
31
|
alias_agree = on_command("同意别名", aliases={"同意别称"})
|
|
32
32
|
alias_status = on_command("当前投票", aliases={"当前别名投票", "当前别称投票"})
|
|
33
33
|
alias_switch = on_regex(
|
|
34
|
-
r"^(
|
|
34
|
+
r"^(开启|关闭)别名推送$", permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN
|
|
35
35
|
)
|
|
36
|
-
alias_global_switch = on_regex(r"^全局(
|
|
37
|
-
alias_song = on_regex(r"^(id)?\s?(.+)\s?有什么别[名称]$", re.IGNORECASE)
|
|
36
|
+
alias_global_switch = on_regex(r"^全局(开启|关闭)别名推送$", permission=SUPERUSER)
|
|
37
|
+
alias_song = on_regex(r"^(id(?=[\s0-9]))?\s?(.+)\s?有什么别[名称]$", re.IGNORECASE)
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
@update_alias.handle()
|
|
@@ -117,9 +117,11 @@ async def _(event: GroupMessageEvent, message: Message = CommandArg()):
|
|
|
117
117
|
tag = message.extract_plain_text().strip().upper()
|
|
118
118
|
api = YuzuChaNAPI()
|
|
119
119
|
status = await api.post_agree_user(tag, event.user_id)
|
|
120
|
-
|
|
121
|
-
except
|
|
122
|
-
|
|
120
|
+
msg = status.message
|
|
121
|
+
except Exception as e:
|
|
122
|
+
log.error(traceback.format_exc())
|
|
123
|
+
msg = str(e)
|
|
124
|
+
await alias_agree.finish(msg, reply_message=True)
|
|
123
125
|
|
|
124
126
|
|
|
125
127
|
@alias_status.handle()
|
|
@@ -131,7 +133,8 @@ async def _(message: Message = CommandArg()):
|
|
|
131
133
|
if not status:
|
|
132
134
|
await alias_status.finish("未查询到正在进行的别名投票", reply_message=True)
|
|
133
135
|
|
|
134
|
-
|
|
136
|
+
total_pages = (len(status) + SONGS_PER_PAGE - 1) // SONGS_PER_PAGE
|
|
137
|
+
page = max(min(int(args), total_pages), 1) if args.isdigit() else 1
|
|
135
138
|
result = []
|
|
136
139
|
for num, _s in enumerate(status):
|
|
137
140
|
if (page - 1) * SONGS_PER_PAGE <= num < page * SONGS_PER_PAGE:
|
|
@@ -146,7 +149,7 @@ async def _(message: Message = CommandArg()):
|
|
|
146
149
|
- 票数:{_s.agree_votes}/{_s.votes}
|
|
147
150
|
""")
|
|
148
151
|
)
|
|
149
|
-
result.append(f"第「{page}」页,共「{
|
|
152
|
+
result.append(f"第「{page}」页,共「{total_pages}」页")
|
|
150
153
|
msg = MessageSegment.image(text_to_bytes_io("\n".join(result)))
|
|
151
154
|
except Exception as e:
|
|
152
155
|
log.error(traceback.format_exc())
|
|
@@ -195,11 +198,14 @@ async def _(match: Match[str] = RegexMatched()):
|
|
|
195
198
|
reply_message=True,
|
|
196
199
|
)
|
|
197
200
|
|
|
198
|
-
|
|
201
|
+
real_aliases = [
|
|
202
|
+
a for a in aliases[0].alias if a.lower() != aliases[0].song_name.lower()
|
|
203
|
+
]
|
|
204
|
+
if not real_aliases:
|
|
199
205
|
await alias_song.finish("该曲目没有别名", reply_message=True)
|
|
200
206
|
|
|
201
207
|
msg = f"该曲目有以下别名:\nID:{aliases[0].song_id}\n"
|
|
202
|
-
msg += "\n".join(
|
|
208
|
+
msg += "\n".join(real_aliases)
|
|
203
209
|
await alias_song.send(msg, reply_message=True)
|
|
204
210
|
|
|
205
211
|
|
|
@@ -226,4 +232,4 @@ async def _(bot: Bot, match: Match[str] = RegexMatched()):
|
|
|
226
232
|
await alias.alias_global_change(False, group_id)
|
|
227
233
|
await alias_global_switch.finish("已全局关闭maimai别名推送")
|
|
228
234
|
else:
|
|
229
|
-
|
|
235
|
+
return
|
|
@@ -206,7 +206,7 @@ async def _(
|
|
|
206
206
|
):
|
|
207
207
|
if not match:
|
|
208
208
|
await random_song.finish("参数错误,请重新发送随机谱面", reply_message=True)
|
|
209
|
-
diff = match.group(1)
|
|
209
|
+
diff = (match.group(1) or "").lower()
|
|
210
210
|
if diff == "dx":
|
|
211
211
|
type_ = ["DX"]
|
|
212
212
|
elif diff == "sd" or diff == "标准":
|
|
@@ -214,10 +214,15 @@ async def _(
|
|
|
214
214
|
else:
|
|
215
215
|
type_ = ["SD", "DX"]
|
|
216
216
|
level = match.group(3)
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
217
|
+
color = match.group(2)
|
|
218
|
+
songs = mai.total_list.filter(level=level, type=type_)
|
|
219
|
+
if color:
|
|
220
|
+
ci = "绿黄红紫白".index(color)
|
|
221
|
+
songs = [
|
|
222
|
+
s
|
|
223
|
+
for s in songs
|
|
224
|
+
if len(s.difficulties) > ci and s.difficulties[ci].level == level
|
|
225
|
+
]
|
|
221
226
|
if len(songs) == 0:
|
|
222
227
|
result = "没有这样的乐曲哦。"
|
|
223
228
|
else:
|
|
@@ -265,3 +270,6 @@ async def _(user: User = Depends(GetOrCreateUser)):
|
|
|
265
270
|
if rank.username == info.username:
|
|
266
271
|
result = f"您的Rating为「{rank.ra}」,排名第「{num + 1}」名"
|
|
267
272
|
await my_rating_ranking.finish(result, reply_message=True)
|
|
273
|
+
await my_rating_ranking.finish(
|
|
274
|
+
"未在查分器排行榜中找到您的记录。", reply_message=True
|
|
275
|
+
)
|
|
@@ -71,9 +71,9 @@ async def _(event: GroupMessageEvent):
|
|
|
71
71
|
event.group_id not in guess.switch.enable
|
|
72
72
|
or guess._group[gid].end
|
|
73
73
|
):
|
|
74
|
-
|
|
74
|
+
return
|
|
75
75
|
else:
|
|
76
|
-
|
|
76
|
+
return
|
|
77
77
|
guess._group[gid].end = True
|
|
78
78
|
answer = MessageSegment.text("答案是:\n") + await draw_chart_info(
|
|
79
79
|
guess._group[gid].song
|
|
@@ -103,9 +103,9 @@ async def _(event: GroupMessageEvent):
|
|
|
103
103
|
await asyncio.sleep(1)
|
|
104
104
|
if gid in guess._group:
|
|
105
105
|
if gid not in guess.switch.enable or guess._group[gid].end:
|
|
106
|
-
|
|
106
|
+
return
|
|
107
107
|
else:
|
|
108
|
-
|
|
108
|
+
return
|
|
109
109
|
guess._group[gid].end = True
|
|
110
110
|
answer = MessageSegment.text("答案是:\n") + await draw_chart_info(
|
|
111
111
|
guess._group[gid].song
|
|
@@ -118,7 +118,7 @@ async def _(event: GroupMessageEvent):
|
|
|
118
118
|
async def _(event: GroupMessageEvent):
|
|
119
119
|
gid = event.group_id
|
|
120
120
|
if gid not in guess._group:
|
|
121
|
-
|
|
121
|
+
return
|
|
122
122
|
ans = event.get_plaintext().strip()
|
|
123
123
|
if ans.lower() in guess._group[gid].answer:
|
|
124
124
|
guess._group[gid].end = True
|
|
@@ -60,6 +60,8 @@ async def _(
|
|
|
60
60
|
else:
|
|
61
61
|
song_id = aliases[0].song_id
|
|
62
62
|
song = mai.total_list.by_id(song_id)
|
|
63
|
+
if song is None:
|
|
64
|
+
await info.finish("未找到曲目", reply_message=True)
|
|
63
65
|
|
|
64
66
|
result = await draw_play_data(user, song)
|
|
65
67
|
await info.send(result, reply_message=True)
|
|
@@ -93,11 +95,10 @@ async def _(message: Message = CommandArg()):
|
|
|
93
95
|
await ginfo.finish(msg.strip(), reply_message=True)
|
|
94
96
|
else:
|
|
95
97
|
song = mai.total_list.by_id(alias[0].song_id)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if len(song.difficulties) == 4 and level_index == 4:
|
|
98
|
+
if level_index >= len(song.difficulties):
|
|
99
99
|
await ginfo.finish("该乐曲没有这个等级", reply_message=True)
|
|
100
|
-
|
|
100
|
+
stats = song.difficulties[level_index].stats
|
|
101
|
+
if stats is None:
|
|
101
102
|
await ginfo.finish("该等级没有统计信息", reply_message=True)
|
|
102
103
|
|
|
103
104
|
data = await draw_song_galobal_data(song, level_index) + dedent(f"""\
|
|
@@ -140,6 +141,8 @@ async def _(message: Message = CommandArg()):
|
|
|
140
141
|
chart_id = int(result.group(2))
|
|
141
142
|
line = float(args[-1])
|
|
142
143
|
song = mai.total_list.by_id(chart_id)
|
|
144
|
+
if song is None or level_index >= len(song.difficulties):
|
|
145
|
+
raise ValueError
|
|
143
146
|
chart = song.difficulties[level_index]
|
|
144
147
|
tap = int(chart.notes.tap)
|
|
145
148
|
slide = int(chart.notes.slide)
|
|
@@ -95,7 +95,7 @@ async def _(
|
|
|
95
95
|
await search_alias_song.finish(
|
|
96
96
|
"您要找的是不是:" + await draw_chart_info(song, user), reply_message=True
|
|
97
97
|
)
|
|
98
|
-
if search_id := re.search(r"^id([0-9]
|
|
98
|
+
if search_id := re.search(r"^id([0-9]+)$", name, re.IGNORECASE):
|
|
99
99
|
song = mai.total_list.by_id(int(search_id.group(1)))
|
|
100
100
|
if not song:
|
|
101
101
|
await search_alias_song.finish(
|
|
@@ -123,7 +123,7 @@ async def _(
|
|
|
123
123
|
msg = (
|
|
124
124
|
f"未找到别名为「{name}」的歌曲,但找到「{len(result)}」个相似标题的曲目:\n"
|
|
125
125
|
)
|
|
126
|
-
msg +=
|
|
126
|
+
msg += draw_song_list(result, int(page))
|
|
127
127
|
await search_alias_song.finish(msg, reply_message=True)
|
|
128
128
|
|
|
129
129
|
|
|
@@ -30,7 +30,7 @@ TABLE_PATTERN = (
|
|
|
30
30
|
r"([極极将舞神者]舞?){}表?\s?([0-9]+)?$"
|
|
31
31
|
)
|
|
32
32
|
LEVEL_PATTERN = r"^([0-9]+\+?)\s?((?:a+|b+|c|d|s+|ap|fc|fs|fdx)\+?)\s?([\u4e00-\u9fa5]+)?\s?进度\s?([0-9]+)?$"
|
|
33
|
-
LEVEL_LIST_PATTERN = r"([0-9]
|
|
33
|
+
LEVEL_LIST_PATTERN = r"^([0-9]+(?:\.[0-9]+)?\+?)\s?分数列表\s?([0-9]+)?$"
|
|
34
34
|
CATEGORY_ALIAS = {
|
|
35
35
|
"已完成": Category.COMPLETED,
|
|
36
36
|
"未完成": Category.UNFINISHED,
|
|
@@ -87,6 +87,11 @@ async def _(match: Match[str] = RegexMatched(), user: User = Depends(GetUserAndA
|
|
|
87
87
|
if ra in LEVEL_LIST[:6]:
|
|
88
88
|
await rating_table_pfm.finish("只支持查询lv7-15的完成表。", reply_message=True)
|
|
89
89
|
elif ra in LEVEL_LIST[6:]:
|
|
90
|
+
if plan and plan.lower() not in COMBO_PLUS:
|
|
91
|
+
await rating_table_pfm.finish(
|
|
92
|
+
"完成表目前仅支持「fc」「ap」计划,例如「13fc完成表」「13ap完成表」。",
|
|
93
|
+
reply_message=True,
|
|
94
|
+
)
|
|
90
95
|
pic = await draw_rating_table(
|
|
91
96
|
user, ra, True if plan and plan.lower() in COMBO_PLUS else False
|
|
92
97
|
)
|
|
@@ -167,14 +172,15 @@ async def _(match: Match[str] = RegexMatched(), user: User = Depends(GetUserAndA
|
|
|
167
172
|
)
|
|
168
173
|
rating = match.group(1)
|
|
169
174
|
page = match.group(2) or 1
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
175
|
+
if "." in rating:
|
|
176
|
+
# 定数仅有一位小数,多位小数视为输入有误
|
|
177
|
+
if not re.fullmatch(r"[0-9]+\.[0-9]", rating):
|
|
178
|
+
await level_score_list.finish(
|
|
179
|
+
"输入有误,定数仅有一位小数。", reply_message=True
|
|
180
|
+
)
|
|
181
|
+
rating = round(float(rating), 1)
|
|
182
|
+
elif rating not in LEVEL_LIST:
|
|
183
|
+
await level_score_list.finish("无此等级。", reply_message=True)
|
|
178
184
|
|
|
179
185
|
result = await draw_level_score_list(user, rating, int(page))
|
|
180
186
|
await level_score_list.send(result, reply_message=True)
|
|
@@ -281,7 +281,7 @@ def get_rise_score_list(
|
|
|
281
281
|
level_value=diff.level_value,
|
|
282
282
|
old_rating=old_result.rating,
|
|
283
283
|
old_achievements=old_result.achievements,
|
|
284
|
-
old_rate=old_result.rate.value,
|
|
284
|
+
old_rate=old_result.rate.value if old_result.rate else "D",
|
|
285
285
|
)
|
|
286
286
|
rise_result.append(rise)
|
|
287
287
|
break
|
|
@@ -320,7 +320,7 @@ def draw_rating_table_text(rating: str) -> MessageSegment:
|
|
|
320
320
|
return MessageSegment.image(image)
|
|
321
321
|
|
|
322
322
|
|
|
323
|
-
|
|
323
|
+
def draw_song_list(songs: list[Song], page: int) -> MessageSegment:
|
|
324
324
|
"""
|
|
325
325
|
绘制曲目列表
|
|
326
326
|
|
|
@@ -417,9 +417,9 @@ async def get_mai_what(user: User) -> Song | None:
|
|
|
417
417
|
if _ra != 0:
|
|
418
418
|
ds = round(_ra / 22.4, 1)
|
|
419
419
|
music_list = mai.total_list.filter(level_value=(ds, ds + 1))
|
|
420
|
-
for
|
|
421
|
-
|
|
422
|
-
|
|
420
|
+
music_list = [m for m in music_list if int(m.song_id) not in ignore]
|
|
421
|
+
if not music_list:
|
|
422
|
+
return None
|
|
423
423
|
return random.choice(music_list)
|
|
424
424
|
return None
|
|
425
425
|
|
|
@@ -629,8 +629,11 @@ async def draw_level_progress(
|
|
|
629
629
|
if plan_type == 2: # Sync
|
|
630
630
|
if not res.fs:
|
|
631
631
|
return False
|
|
632
|
-
|
|
633
|
-
|
|
632
|
+
if res.fs in SYNC_D_SP:
|
|
633
|
+
return SYNC_D_SP.index(res.fs) >= plan_value
|
|
634
|
+
if res.fs in SYNC_SP:
|
|
635
|
+
return SYNC_SP.index(res.fs) >= plan_value
|
|
636
|
+
return False
|
|
634
637
|
return False
|
|
635
638
|
|
|
636
639
|
completed: list[PlayedResult] = []
|
|
@@ -656,8 +659,14 @@ async def draw_level_progress(
|
|
|
656
659
|
)
|
|
657
660
|
|
|
658
661
|
sort_key = {0: "achievements", 1: "fc", 2: "fs"}.get(plan_type, "achievements")
|
|
659
|
-
|
|
660
|
-
|
|
662
|
+
sort_default = 0 if plan_type == 0 else ""
|
|
663
|
+
|
|
664
|
+
def _sort_value(res: PlayedResult):
|
|
665
|
+
value = getattr(res, sort_key)
|
|
666
|
+
return value if value is not None else sort_default
|
|
667
|
+
|
|
668
|
+
completed.sort(key=_sort_value, reverse=True)
|
|
669
|
+
unfinished.sort(key=_sort_value, reverse=True)
|
|
661
670
|
notplayed.sort(key=lambda x: x.level_value, reverse=True)
|
|
662
671
|
|
|
663
672
|
if category == Category.DEFAULT:
|
|
@@ -677,9 +686,8 @@ async def draw_level_progress(
|
|
|
677
686
|
elif category in [Category.COMPLETED, Category.UNFINISHED]:
|
|
678
687
|
data = completed if category == Category.COMPLETED else unfinished
|
|
679
688
|
per_page = 80
|
|
680
|
-
total_page = (len(data) - 1) // per_page + 1
|
|
681
|
-
|
|
682
|
-
page = total_page
|
|
689
|
+
total_page = max(1, (len(data) - 1) // per_page + 1)
|
|
690
|
+
page = max(1, min(page, total_page))
|
|
683
691
|
|
|
684
692
|
display_data = data[(page - 1) * per_page : page * per_page]
|
|
685
693
|
y_size = get_rows(len(display_data), 5) * 109
|
|
@@ -728,9 +736,8 @@ async def draw_level_score_list(
|
|
|
728
736
|
)
|
|
729
737
|
|
|
730
738
|
result_sum = len(new_play_result)
|
|
731
|
-
end_page = (result_sum + 79) // 80
|
|
732
|
-
|
|
733
|
-
page = end_page
|
|
739
|
+
end_page = max(1, (result_sum + 79) // 80)
|
|
740
|
+
page = max(1, min(page, end_page))
|
|
734
741
|
|
|
735
742
|
to_page = 80 if page < end_page else (result_sum % 80 or 80)
|
|
736
743
|
line = (to_page + 4) // 5
|
|
@@ -43,9 +43,7 @@ def song_list(songs: list[Song], page: int) -> str:
|
|
|
43
43
|
pattern = assets._pattern_bg.resize((1000, 256))
|
|
44
44
|
for h in range((height // 256) + 1):
|
|
45
45
|
_im.alpha_composite(pattern, (0, (256 + 6) * h))
|
|
46
|
-
_im.alpha_composite(
|
|
47
|
-
assets._rainbow_bg.resize((550, 288)), (225, height - 435)
|
|
48
|
-
)
|
|
46
|
+
_im.alpha_composite(assets._rainbow_bg.resize((550, 288)), (225, height - 435))
|
|
49
47
|
_im.alpha_composite(
|
|
50
48
|
assets._rainbow_bottom_bg.resize((786, 164)),
|
|
51
49
|
(107, height - 260),
|
|
@@ -86,9 +84,7 @@ def song_list(songs: list[Song], page: int) -> str:
|
|
|
86
84
|
im.alpha_composite(cover, (x + 10, y + 10))
|
|
87
85
|
im.alpha_composite(version, (x + 315, y - 30))
|
|
88
86
|
im.alpha_composite(
|
|
89
|
-
assets._sl_diff_utg
|
|
90
|
-
if song.song_id > 100000
|
|
91
|
-
else assets._sl_diff_bg,
|
|
87
|
+
assets._sl_diff_utg if song.song_id > 100000 else assets._sl_diff_bg,
|
|
92
88
|
(x + 100, y + 95),
|
|
93
89
|
)
|
|
94
90
|
im.alpha_composite(type_, (x + 50, y + 75))
|
|
@@ -151,8 +147,8 @@ def song_list(songs: list[Song], page: int) -> str:
|
|
|
151
147
|
)
|
|
152
148
|
fot.draw(
|
|
153
149
|
500,
|
|
154
|
-
height -
|
|
155
|
-
|
|
150
|
+
height - 30,
|
|
151
|
+
18,
|
|
156
152
|
f"Designed by Yuri-YuzuChaN & BlueDeer233. Generated by {maiconfig.bot_name} BOT",
|
|
157
153
|
AssetsImage._default_text_color,
|
|
158
154
|
"mm",
|
|
@@ -10,6 +10,7 @@ from ..image.tools import image_to_base64, song_chart
|
|
|
10
10
|
from ..merge import merge_alias_data, merge_music_data
|
|
11
11
|
from ..merge.alias_list import AliasList
|
|
12
12
|
from ..merge.models import (
|
|
13
|
+
Alias,
|
|
13
14
|
AliasesPush,
|
|
14
15
|
GuessDefaultData,
|
|
15
16
|
GuessPicData,
|
|
@@ -151,6 +152,7 @@ class Guess:
|
|
|
151
152
|
_group: dict[int, GuessDefaultData | GuessPicData] = {}
|
|
152
153
|
switch: GuessSwitch
|
|
153
154
|
hot_music_ids: list[int] = []
|
|
155
|
+
_guess_data: list[Song] = []
|
|
154
156
|
|
|
155
157
|
def __init__(self) -> None:
|
|
156
158
|
"""猜歌类"""
|
|
@@ -170,17 +172,17 @@ class Guess:
|
|
|
170
172
|
count += diff.stats.cnt if diff.stats.cnt else 0
|
|
171
173
|
if count > 10000:
|
|
172
174
|
self.hot_music_ids.append(song.song_id)
|
|
173
|
-
self.
|
|
175
|
+
self._guess_data = list(
|
|
174
176
|
filter(lambda x: x.song_id in self.hot_music_ids, mai.total_list.root)
|
|
175
177
|
)
|
|
176
178
|
|
|
177
179
|
def start(self, gid: int):
|
|
178
180
|
"""开始猜歌"""
|
|
179
|
-
self._group[gid] = self.
|
|
181
|
+
self._group[gid] = self.guess_data()
|
|
180
182
|
|
|
181
183
|
def startpic(self, gid: int):
|
|
182
184
|
"""开始猜曲绘"""
|
|
183
|
-
self._group[gid] = self.
|
|
185
|
+
self._group[gid] = self.guess_pic_data()
|
|
184
186
|
|
|
185
187
|
def calculate_frequency_weights(self, image: Image.Image) -> np.ndarray:
|
|
186
188
|
"""
|
|
@@ -214,7 +216,7 @@ class Guess:
|
|
|
214
216
|
top_left_x = chosen_index % valid_regions.shape[1]
|
|
215
217
|
return top_left_x, top_left_y
|
|
216
218
|
|
|
217
|
-
def
|
|
219
|
+
def _pic(self, song: Song) -> Image.Image:
|
|
218
220
|
"""裁切曲绘"""
|
|
219
221
|
im = Image.open(song_chart(song.song_id))
|
|
220
222
|
w, h = im.size
|
|
@@ -226,19 +228,20 @@ class Guess:
|
|
|
226
228
|
im = im.crop((x, y, x + w2, y + h2))
|
|
227
229
|
return im
|
|
228
230
|
|
|
229
|
-
def
|
|
231
|
+
def guess_pic_data(self) -> GuessPicData:
|
|
230
232
|
"""猜曲绘数据"""
|
|
231
|
-
song = random.choice(self.
|
|
232
|
-
pic = self.
|
|
233
|
-
|
|
234
|
-
answer
|
|
233
|
+
song = random.choice(self._guess_data)
|
|
234
|
+
pic = self._pic(song)
|
|
235
|
+
_alias = mai.total_alias_list.by_id(song.song_id)
|
|
236
|
+
answer = list(_alias[0].alias) if _alias else []
|
|
237
|
+
answer.append(str(song.song_id))
|
|
235
238
|
return GuessPicData(
|
|
236
239
|
song=song, img=image_to_base64(pic), answer=answer, end=False
|
|
237
240
|
)
|
|
238
241
|
|
|
239
|
-
def
|
|
242
|
+
def guess_data(self) -> GuessDefaultData:
|
|
240
243
|
"""猜歌数据"""
|
|
241
|
-
song = random.choice(self.
|
|
244
|
+
song = random.choice(self._guess_data)
|
|
242
245
|
guess_options = random.sample(
|
|
243
246
|
[
|
|
244
247
|
f"的 Expert 难度是 {song.difficulties[2].level}",
|
|
@@ -252,9 +255,10 @@ class Guess:
|
|
|
252
255
|
],
|
|
253
256
|
6,
|
|
254
257
|
)
|
|
255
|
-
|
|
256
|
-
answer
|
|
257
|
-
|
|
258
|
+
_alias = mai.total_alias_list.by_id(song.song_id)
|
|
259
|
+
answer = list(_alias[0].alias) if _alias else []
|
|
260
|
+
answer.append(str(song.song_id))
|
|
261
|
+
pic = self._pic(song)
|
|
258
262
|
return GuessDefaultData(
|
|
259
263
|
song=song,
|
|
260
264
|
img=image_to_base64(pic),
|
|
@@ -300,11 +304,24 @@ async def update_local_alias(song_id: int, alias_name: str) -> bool:
|
|
|
300
304
|
if local_alias_file.exists():
|
|
301
305
|
local_alias_data = await openfile(local_alias_file)
|
|
302
306
|
|
|
303
|
-
if
|
|
307
|
+
if song_id_key not in local_alias_data:
|
|
304
308
|
local_alias_data[song_id_key] = []
|
|
309
|
+
if alias not in local_alias_data[song_id_key]:
|
|
310
|
+
local_alias_data[song_id_key].append(alias)
|
|
305
311
|
|
|
306
|
-
|
|
307
|
-
|
|
312
|
+
entries = mai.total_alias_list.by_id(song_id)
|
|
313
|
+
if entries:
|
|
314
|
+
if alias not in entries[0].alias:
|
|
315
|
+
entries[0].alias.append(alias)
|
|
316
|
+
else:
|
|
317
|
+
_song = mai.total_list.by_id(song_id)
|
|
318
|
+
mai.total_alias_list.root.append(
|
|
319
|
+
Alias(
|
|
320
|
+
song_id=song_id,
|
|
321
|
+
song_name=_song.song_name if _song else "",
|
|
322
|
+
alias=[alias],
|
|
323
|
+
)
|
|
324
|
+
)
|
|
308
325
|
|
|
309
326
|
await writefile(local_alias_file, local_alias_data)
|
|
310
327
|
return True
|
|
File without changes
|
|
File without changes
|
{nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/config.py
RENAMED
|
File without changes
|
{nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/constants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/core/tool.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nonebot_plugin_maimaidx-3.0.5 → nonebot_plugin_maimaidx-3.0.7}/nonebot_plugin_maimaidx/resources.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|