2023-06-26 13:18:54 +00:00
|
|
|
|
from core.builtins import Bot, command_prefix, Plain, Image as BImage
|
2023-03-04 08:51:56 +00:00
|
|
|
|
from core.component import module
|
2022-08-04 07:52:42 +00:00
|
|
|
|
from core.logger import Logger
|
2023-06-05 04:10:27 +00:00
|
|
|
|
from core.utils.image import msgchain2image
|
2023-06-09 05:18:08 +00:00
|
|
|
|
from modules.maimai.libraries.maimai_best_50 import generate
|
2023-07-14 06:19:25 +00:00
|
|
|
|
from modules.maimai.libraries.maimaidx_api_data import update_alias, get_alias, get_cover
|
2023-06-22 07:13:56 +00:00
|
|
|
|
from modules.maimai.libraries.maimaidx_project import get_level_process, get_plate_process, get_player_score, get_rank, get_score_list
|
2023-06-26 10:24:19 +00:00
|
|
|
|
from modules.maimai.libraries.maimaidx_music import Music, TotalList
|
2023-06-19 16:37:14 +00:00
|
|
|
|
from .regex import *
|
2021-10-12 15:02:36 +00:00
|
|
|
|
|
2022-05-13 13:54:12 +00:00
|
|
|
|
total_list = TotalList()
|
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
level_list = ['1', '2', '3', '4', '5', '6', '7', '7+', '8', '8+', '9', '9+', '10', '10+', '11', '11+', '12', '12+', '13', '13+', '14', '14+', '15']
|
|
|
|
|
|
2023-06-02 01:48:55 +00:00
|
|
|
|
diff_label = ['Basic', 'Advanced', 'Expert', 'Master', 'Re:MASTER']
|
2023-06-01 17:08:10 +00:00
|
|
|
|
diff_label_abbr = ['bas', 'adv', 'exp', 'mas', 'rem']
|
2023-05-28 05:57:27 +00:00
|
|
|
|
diff_label_zhs = ['绿', '黄', '红', '紫', '白']
|
2023-05-28 06:20:26 +00:00
|
|
|
|
diff_label_zht = ['綠', '黃', '紅']
|
2023-05-28 05:57:27 +00:00
|
|
|
|
|
2022-05-13 13:54:12 +00:00
|
|
|
|
|
2021-10-12 15:02:36 +00:00
|
|
|
|
def song_txt(music: Music):
|
2023-06-22 07:12:09 +00:00
|
|
|
|
return [Plain(f"{music.id}\u200B. {music.title}{' (DX)' if music['type'] == 'DX' else ''}\n"),
|
2023-06-26 10:24:19 +00:00
|
|
|
|
BImage(get_cover(music.id), ),
|
2023-06-05 09:34:41 +00:00
|
|
|
|
Plain(f"\n{'/'.join(str(ds) for ds in music.ds)}")]
|
2021-10-12 15:02:36 +00:00
|
|
|
|
|
|
|
|
|
|
2023-06-12 05:51:36 +00:00
|
|
|
|
def get_diff(diff):
|
2023-06-01 17:08:10 +00:00
|
|
|
|
diff = diff.lower()
|
2023-06-02 01:48:55 +00:00
|
|
|
|
diff_label_lower = [label.lower() for label in diff_label]
|
2023-06-09 10:12:08 +00:00
|
|
|
|
|
2023-05-28 05:57:27 +00:00
|
|
|
|
if diff in diff_label_zhs:
|
|
|
|
|
level = diff_label_zhs.index(diff)
|
|
|
|
|
elif diff in diff_label_zht:
|
|
|
|
|
level = diff_label_zht.index(diff)
|
2023-06-01 17:08:10 +00:00
|
|
|
|
elif diff in diff_label_abbr:
|
|
|
|
|
level = diff_label_abbr.index(diff)
|
2023-06-02 01:48:55 +00:00
|
|
|
|
elif diff in diff_label_lower:
|
|
|
|
|
level = diff_label_lower.index(diff)
|
2023-05-28 05:57:27 +00:00
|
|
|
|
else:
|
2023-05-28 06:04:14 +00:00
|
|
|
|
level = None
|
2023-05-28 05:57:27 +00:00
|
|
|
|
return level
|
|
|
|
|
|
2021-10-12 15:02:36 +00:00
|
|
|
|
|
2023-06-01 17:08:10 +00:00
|
|
|
|
mai = module('maimai', developers=['mai-bot', 'OasisAkari', 'DoroWolf'], alias='mai',
|
|
|
|
|
desc='{maimai.help.desc}')
|
2021-10-24 10:55:45 +00:00
|
|
|
|
|
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
@mai.handle('base <rating> [<rating_max>] {{maimai.help.base}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, rating: float, rating_max: float = None):
|
|
|
|
|
if rating_max is not None:
|
|
|
|
|
if rating > rating_max:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t('error.range.invalid'))
|
2023-06-22 05:28:02 +00:00
|
|
|
|
result_set = await base_level_q(rating, rating_max)
|
|
|
|
|
s = msg.locale.t("maimai.message.base.range", rating=round(rating, 1), rating_max=round(rating_max, 1)) + "\n"
|
|
|
|
|
else:
|
|
|
|
|
result_set = await base_level_q(rating)
|
|
|
|
|
s = msg.locale.t("maimai.message.base", rating=round(rating, 1)) + "\n"
|
2023-05-27 12:44:55 +00:00
|
|
|
|
for elem in result_set:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
s += f"{elem[0]}\u200B. {elem[1]}{' (DX)' if elem[5] == 'DX' else ''} {elem[3]} {elem[4]} ({elem[2]})\n"
|
2023-05-27 13:15:53 +00:00
|
|
|
|
if len(result_set) == 0:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.music_not_found"))
|
2023-06-22 05:28:02 +00:00
|
|
|
|
if len(result_set) > 200:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.too_much", length=len(result_set)))
|
2023-05-28 02:20:17 +00:00
|
|
|
|
if len(result_set) <= 10:
|
|
|
|
|
await msg.finish(s.strip())
|
2023-05-28 02:15:08 +00:00
|
|
|
|
else:
|
2023-06-05 04:10:27 +00:00
|
|
|
|
img = await msgchain2image([Plain(s)])
|
2023-05-28 02:15:08 +00:00
|
|
|
|
await msg.finish([BImage(img)])
|
|
|
|
|
|
2023-06-09 10:12:08 +00:00
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
async def base_level_q(ds1, ds2=None):
|
2023-05-28 04:18:15 +00:00
|
|
|
|
result_set = []
|
2023-06-22 05:28:02 +00:00
|
|
|
|
if ds2 is not None:
|
|
|
|
|
music_data = (await total_list.get()).filter(ds=(ds1, ds2))
|
|
|
|
|
else:
|
|
|
|
|
music_data = (await total_list.get()).filter(ds=ds1)
|
2023-05-28 04:18:15 +00:00
|
|
|
|
for music in sorted(music_data, key=lambda i: int(i['id'])):
|
|
|
|
|
for i in music.diff:
|
2023-06-09 10:12:08 +00:00
|
|
|
|
result_set.append(
|
|
|
|
|
(music['id'],
|
|
|
|
|
music['title'],
|
2023-06-10 04:23:59 +00:00
|
|
|
|
music['ds'][i],
|
|
|
|
|
diff_label[i],
|
|
|
|
|
music['level'][i],
|
|
|
|
|
music['type']))
|
2023-05-28 04:18:15 +00:00
|
|
|
|
return result_set
|
2023-05-27 12:44:55 +00:00
|
|
|
|
|
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
@mai.handle('level <level> {{maimai.help.level}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, level: str):
|
|
|
|
|
result_set = await diff_level_q(level)
|
|
|
|
|
s = msg.locale.t("maimai.message.level", level=level) + "\n"
|
2021-10-12 15:02:36 +00:00
|
|
|
|
for elem in result_set:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
s += f"{elem[0]}\u200B. {elem[1]}{' (DX)' if elem[5] == 'DX' else ''} {elem[3]} {elem[4]} ({elem[2]})\n"
|
2023-05-27 13:23:52 +00:00
|
|
|
|
if len(result_set) == 0:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.music_not_found"))
|
2023-05-28 02:20:17 +00:00
|
|
|
|
if len(result_set) <= 10:
|
|
|
|
|
await msg.finish(s.strip())
|
2023-05-28 02:15:08 +00:00
|
|
|
|
else:
|
2023-06-05 04:10:27 +00:00
|
|
|
|
img = await msgchain2image([Plain(s)])
|
2023-05-28 02:15:08 +00:00
|
|
|
|
await msg.finish([BImage(img)])
|
2021-10-12 15:02:36 +00:00
|
|
|
|
|
2023-06-09 10:12:08 +00:00
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
async def diff_level_q(level):
|
2023-05-28 04:18:15 +00:00
|
|
|
|
result_set = []
|
2023-06-22 05:28:02 +00:00
|
|
|
|
music_data = (await total_list.get()).filter(level=level)
|
2023-05-28 04:18:15 +00:00
|
|
|
|
for music in sorted(music_data, key=lambda i: int(i['id'])):
|
|
|
|
|
for i in music.diff:
|
2023-06-09 10:12:08 +00:00
|
|
|
|
result_set.append(
|
|
|
|
|
(music['id'],
|
|
|
|
|
music['title'],
|
2023-06-10 04:23:59 +00:00
|
|
|
|
music['ds'][i],
|
|
|
|
|
diff_label[i],
|
|
|
|
|
music['level'][i],
|
|
|
|
|
music['type']))
|
2023-05-28 04:18:15 +00:00
|
|
|
|
return result_set
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mai.handle('search <keyword> {{maimai.help.search}}')
|
2023-06-09 10:12:08 +00:00
|
|
|
|
async def _(msg: Bot.MessageSession, keyword: str):
|
|
|
|
|
name = keyword.strip()
|
2023-05-28 04:51:41 +00:00
|
|
|
|
res = (await total_list.get()).filter(title_search=name)
|
|
|
|
|
if len(res) == 0:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.music_not_found"))
|
2023-05-28 04:51:41 +00:00
|
|
|
|
if len(res) > 200:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.too_much", length=len(res)))
|
2023-05-28 04:18:15 +00:00
|
|
|
|
else:
|
2023-05-31 14:45:50 +00:00
|
|
|
|
search_result = msg.locale.t("maimai.message.search", keyword=name) + "\n"
|
2023-05-28 04:51:41 +00:00
|
|
|
|
for music in sorted(res, key=lambda i: int(i['id'])):
|
2023-06-22 07:12:09 +00:00
|
|
|
|
search_result += f"{music['id']}\u200B. {music['title']}{' (DX)' if music['type'] == 'DX' else ''}\n"
|
2023-05-28 04:51:41 +00:00
|
|
|
|
if len(res) <= 10:
|
|
|
|
|
await msg.finish([Plain(search_result.strip())])
|
|
|
|
|
else:
|
2023-06-05 04:10:27 +00:00
|
|
|
|
img = await msgchain2image([Plain(search_result)])
|
2023-05-28 04:51:41 +00:00
|
|
|
|
await msg.finish([BImage(img)])
|
2023-05-28 04:18:15 +00:00
|
|
|
|
|
2021-10-12 15:02:36 +00:00
|
|
|
|
|
2023-06-19 16:37:14 +00:00
|
|
|
|
@mai.handle('alias <sid> {{maimai.help.alias}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, sid: str):
|
|
|
|
|
if not sid.isdigit():
|
2023-07-14 07:02:09 +00:00
|
|
|
|
if sid[:2].lower() == "id":
|
2023-07-14 11:58:58 +00:00
|
|
|
|
sid = sid[2:]
|
2023-07-14 07:02:09 +00:00
|
|
|
|
else:
|
|
|
|
|
await msg.finish(msg.locale.t('maimai.message.error.non_digital'))
|
2023-06-19 16:37:14 +00:00
|
|
|
|
music = (await total_list.get()).by_id(sid)
|
|
|
|
|
if not music:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.music_not_found"))
|
|
|
|
|
title = f"{music['id']}\u200B. {music['title']}{' (DX)' if music['type'] == 'DX' else ''}"
|
2023-07-14 06:15:46 +00:00
|
|
|
|
alias = await get_alias(msg, sid)
|
2023-06-19 16:37:14 +00:00
|
|
|
|
if len(alias) == 0:
|
2023-07-14 06:15:46 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.alias.alias_not_found"))
|
2023-06-19 16:37:14 +00:00
|
|
|
|
else:
|
|
|
|
|
result = msg.locale.t("maimai.message.alias", title=title) + "\n"
|
|
|
|
|
result += "\n".join(alias)
|
|
|
|
|
await msg.finish([Plain(result.strip())])
|
|
|
|
|
|
|
|
|
|
|
2023-06-20 11:20:34 +00:00
|
|
|
|
@mai.handle('b50 [<username>] {{maimai.help.b50}}')
|
2023-06-09 10:12:08 +00:00
|
|
|
|
async def _(msg: Bot.MessageSession, username: str = None):
|
2023-06-08 14:55:40 +00:00
|
|
|
|
if username is None and msg.target.senderFrom == "QQ":
|
2023-06-09 05:18:08 +00:00
|
|
|
|
payload = {'qq': msg.session.sender, 'b50': True}
|
2023-06-08 14:55:40 +00:00
|
|
|
|
else:
|
|
|
|
|
if username is None:
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.no_username"))
|
2023-06-09 05:18:08 +00:00
|
|
|
|
payload = {'username': username, 'b50': True}
|
2023-06-20 11:20:34 +00:00
|
|
|
|
img = await generate(msg, payload)
|
|
|
|
|
await msg.finish([BImage(img)])
|
|
|
|
|
|
|
|
|
|
|
2023-06-20 12:48:34 +00:00
|
|
|
|
@mai.handle('info <id_or_alias> [<username>] {{maimai.help.info}}')
|
2023-06-20 11:20:34 +00:00
|
|
|
|
async def _(msg: Bot.MessageSession, id_or_alias: str, username: str = None):
|
2023-07-06 03:28:14 +00:00
|
|
|
|
if id_or_alias[:2].lower() == "id":
|
|
|
|
|
sid = id_or_alias[2:]
|
2023-06-08 14:55:40 +00:00
|
|
|
|
else:
|
2023-07-14 06:15:46 +00:00
|
|
|
|
sid_list = await get_alias(msg, id_or_alias, get_music=True)
|
2023-06-20 11:20:34 +00:00
|
|
|
|
if len(sid_list) == 0:
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.music_not_found"))
|
|
|
|
|
elif len(sid_list) > 1:
|
|
|
|
|
res = msg.locale.t("maimai.message.song.prompt") + "\n"
|
|
|
|
|
for sid in sorted(sid_list, key=int):
|
|
|
|
|
s = (await total_list.get()).by_id(sid)
|
2023-06-22 07:12:09 +00:00
|
|
|
|
res += f"{s['id']}\u200B. {s['title']}{' (DX)' if s['type'] == 'DX' else ''}\n"
|
2023-06-20 11:20:34 +00:00
|
|
|
|
await msg.finish(res.strip())
|
|
|
|
|
else:
|
|
|
|
|
sid = str(sid_list[0])
|
2023-06-08 14:55:40 +00:00
|
|
|
|
|
2023-06-20 11:20:34 +00:00
|
|
|
|
music = (await total_list.get()).by_id(sid)
|
2023-07-07 16:11:19 +00:00
|
|
|
|
if not music:
|
2023-06-20 11:20:34 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.music_not_found"))
|
2023-06-08 14:55:40 +00:00
|
|
|
|
|
2023-05-19 15:00:36 +00:00
|
|
|
|
if username is None and msg.target.senderFrom == "QQ":
|
2023-06-20 11:20:34 +00:00
|
|
|
|
payload = {'qq': msg.session.sender}
|
2022-07-12 17:27:34 +00:00
|
|
|
|
else:
|
2023-05-19 15:00:36 +00:00
|
|
|
|
if username is None:
|
2023-05-21 06:41:50 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.no_username"))
|
2023-06-20 11:20:34 +00:00
|
|
|
|
payload = {'username': username}
|
|
|
|
|
|
2023-06-20 11:31:55 +00:00
|
|
|
|
output = await get_player_score(msg, payload, sid)
|
2023-06-20 11:20:34 +00:00
|
|
|
|
|
2023-06-26 10:24:19 +00:00
|
|
|
|
file = get_cover(music['id'])
|
2023-06-20 11:20:34 +00:00
|
|
|
|
await msg.finish(
|
2023-06-22 07:12:09 +00:00
|
|
|
|
[Plain(f"{music['id']}\u200B. {music['title']}{' (DX)' if music['type'] == 'DX' else ''}\n"),
|
2023-06-20 11:20:34 +00:00
|
|
|
|
BImage(f"{file}"), Plain(output)])
|
2023-06-21 13:40:37 +00:00
|
|
|
|
|
|
|
|
|
|
2023-06-22 07:12:09 +00:00
|
|
|
|
@mai.handle('plate <plate> [<username>] {{maimai.help.plate}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, plate: str, username: str = None):
|
|
|
|
|
if username is None and msg.target.senderFrom == "QQ":
|
|
|
|
|
payload = {'qq': msg.session.sender}
|
|
|
|
|
else:
|
|
|
|
|
if username is None:
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.no_username"))
|
|
|
|
|
payload = {'username': username}
|
|
|
|
|
|
2023-06-22 07:46:55 +00:00
|
|
|
|
if plate == '真将' or (plate[1] == '者' and plate[0] != '霸'):
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t('maimai.message.plate.plate_not_found'))
|
|
|
|
|
|
2023-06-22 07:46:55 +00:00
|
|
|
|
output, get_img = await get_plate_process(msg, payload, plate)
|
2023-06-22 07:12:09 +00:00
|
|
|
|
|
2023-06-22 07:46:55 +00:00
|
|
|
|
if get_img:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
img = await msgchain2image([Plain(output)])
|
|
|
|
|
await msg.finish([BImage(img)])
|
2023-06-22 07:46:55 +00:00
|
|
|
|
else:
|
|
|
|
|
await msg.finish(output.strip())
|
2023-06-22 07:12:09 +00:00
|
|
|
|
|
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
@mai.handle('process <level> <goal> [<username>] {{maimai.help.process}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, level: str, goal: str, username: str = None):
|
2023-06-21 15:44:36 +00:00
|
|
|
|
goal_list = ["A", "AA", "AAA", "S", "S+", "SS", "SS+", "SSS", "SSS+", "FC", "FC+", "AP", "AP+", "FS", "FS+", "FDX", "FDX+"]
|
|
|
|
|
|
2023-06-21 13:40:37 +00:00
|
|
|
|
if username is None and msg.target.senderFrom == "QQ":
|
2023-06-22 07:12:09 +00:00
|
|
|
|
payload = {'qq': msg.session.sender}
|
2023-06-21 13:40:37 +00:00
|
|
|
|
else:
|
|
|
|
|
if username is None:
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.no_username"))
|
2023-06-22 07:12:09 +00:00
|
|
|
|
payload = {'username': username}
|
2023-06-21 15:44:36 +00:00
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
if level in level_list:
|
|
|
|
|
level_num = int(level.split('+')[0])
|
|
|
|
|
if level_num < 8:
|
2023-06-22 07:12:09 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.process.less_than_8"))
|
2023-06-21 15:44:36 +00:00
|
|
|
|
else:
|
2023-06-21 15:50:52 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.process.error.goal_invalid"))
|
2023-06-21 15:44:36 +00:00
|
|
|
|
|
|
|
|
|
if goal.upper() not in goal_list:
|
2023-06-21 15:50:52 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.process.error.goal_invalid"))
|
2023-06-21 13:40:37 +00:00
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
output, songs = await get_level_process(msg, payload, level, goal)
|
2023-06-21 13:40:37 +00:00
|
|
|
|
|
2023-06-21 16:45:19 +00:00
|
|
|
|
if songs <= 10 or songs >= 50:
|
2023-06-21 16:13:09 +00:00
|
|
|
|
await msg.finish(output.strip())
|
|
|
|
|
else:
|
|
|
|
|
img = await msgchain2image([Plain(output)])
|
|
|
|
|
await msg.finish([BImage(img)])
|
|
|
|
|
|
2023-06-20 11:20:34 +00:00
|
|
|
|
|
2023-06-19 16:37:14 +00:00
|
|
|
|
|
|
|
|
|
@mai.handle('rank [<username>] {{maimai.help.rank}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, username: str = None):
|
|
|
|
|
if username is None and msg.target.senderFrom == "QQ":
|
|
|
|
|
payload = {'qq': msg.session.sender}
|
2022-07-12 17:27:34 +00:00
|
|
|
|
else:
|
2023-06-19 16:37:14 +00:00
|
|
|
|
if username is None:
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.no_username"))
|
|
|
|
|
payload = {'username': username}
|
|
|
|
|
|
2023-06-22 05:28:02 +00:00
|
|
|
|
await get_rank(msg, payload)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mai.handle('scorelist <level> [<username>] {{maimai.help.scorelist}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, level: str, username: str = None):
|
|
|
|
|
if username is None and msg.target.senderFrom == "QQ":
|
|
|
|
|
payload = {'qq': msg.session.sender}
|
|
|
|
|
else:
|
|
|
|
|
if username is None:
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.no_username"))
|
|
|
|
|
payload = {'username': username}
|
|
|
|
|
|
|
|
|
|
res, output = await get_score_list(msg, payload, level)
|
|
|
|
|
|
2023-06-22 07:12:09 +00:00
|
|
|
|
if output == 0:
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.chart_not_found"))
|
2023-06-22 05:28:02 +00:00
|
|
|
|
if output <= 10:
|
|
|
|
|
await msg.finish([Plain(res.strip())])
|
|
|
|
|
else:
|
|
|
|
|
img = await msgchain2image([Plain(res)])
|
|
|
|
|
await msg.finish([BImage(img)])
|
2023-06-19 16:37:14 +00:00
|
|
|
|
|
2023-05-21 06:41:50 +00:00
|
|
|
|
|
2023-05-27 03:20:04 +00:00
|
|
|
|
|
2023-06-12 05:11:36 +00:00
|
|
|
|
@mai.handle('random <diff+level> [<dx_type>] {{maimai.help.random.filter}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, dx_type: str = None):
|
|
|
|
|
filter = msg.parsed_msg['<diff+level>']
|
2023-06-12 04:35:02 +00:00
|
|
|
|
level = ''
|
|
|
|
|
diff = ''
|
2023-06-05 09:01:14 +00:00
|
|
|
|
try:
|
2023-06-12 05:11:36 +00:00
|
|
|
|
if dx_type in ["dx", "DX"]:
|
|
|
|
|
dx_type = ["DX"]
|
|
|
|
|
elif dx_type in ["sd", "SD", "标准", "標準"]:
|
|
|
|
|
dx_type = ["SD"]
|
2023-06-05 09:01:14 +00:00
|
|
|
|
else:
|
2023-06-12 05:11:36 +00:00
|
|
|
|
dx_type = ["SD", "DX"]
|
2023-06-05 09:01:14 +00:00
|
|
|
|
|
2023-06-12 04:35:02 +00:00
|
|
|
|
for char in filter:
|
|
|
|
|
if char.isdigit() or char == '+':
|
|
|
|
|
level += char
|
|
|
|
|
else:
|
|
|
|
|
diff += char
|
|
|
|
|
|
|
|
|
|
if level == "":
|
2023-06-05 10:47:13 +00:00
|
|
|
|
if diff == "#":
|
2023-06-12 05:11:36 +00:00
|
|
|
|
music_data = (await total_list.get()).filter(type=dx_type)
|
2023-06-05 09:01:14 +00:00
|
|
|
|
else:
|
2023-06-05 10:03:38 +00:00
|
|
|
|
raise ValueError
|
2023-06-05 10:47:13 +00:00
|
|
|
|
else:
|
2023-06-12 04:35:02 +00:00
|
|
|
|
if diff == "":
|
2023-06-12 05:11:36 +00:00
|
|
|
|
music_data = (await total_list.get()).filter(level=level, type=dx_type)
|
2023-06-05 10:03:38 +00:00
|
|
|
|
else:
|
2023-06-12 05:51:36 +00:00
|
|
|
|
music_data = (await total_list.get()).filter(level=level, diff=[get_diff(diff)], type=dx_type)
|
2023-06-05 09:01:14 +00:00
|
|
|
|
|
|
|
|
|
if len(music_data) == 0:
|
|
|
|
|
rand_result = msg.locale.t("maimai.message.music_not_found")
|
|
|
|
|
else:
|
|
|
|
|
rand_result = song_txt(music_data.random())
|
|
|
|
|
await msg.finish(rand_result)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
Logger.error(e)
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.random.error"))
|
|
|
|
|
|
|
|
|
|
|
2023-05-27 12:15:10 +00:00
|
|
|
|
@mai.handle('random {{maimai.help.random}}')
|
2023-05-27 03:20:04 +00:00
|
|
|
|
async def _(msg: Bot.MessageSession):
|
|
|
|
|
await msg.finish(song_txt((await total_list.get()).random()))
|
|
|
|
|
|
2023-05-28 05:23:05 +00:00
|
|
|
|
|
2023-06-19 16:37:14 +00:00
|
|
|
|
@mai.handle('song <id_or_alias> [<diff>] {{maimai.help.song}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, id_or_alias: str, diff: str = None):
|
2023-07-06 03:28:14 +00:00
|
|
|
|
if id_or_alias[:2].lower() == "id":
|
2023-07-29 06:25:41 +00:00
|
|
|
|
sid = id_or_alias[2:]
|
2023-06-19 16:37:14 +00:00
|
|
|
|
else:
|
2023-07-14 06:15:46 +00:00
|
|
|
|
sid_list = await get_alias(msg, id_or_alias, get_music=True)
|
2023-06-19 16:37:14 +00:00
|
|
|
|
if len(sid_list) == 0:
|
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.music_not_found"))
|
|
|
|
|
elif len(sid_list) > 1:
|
|
|
|
|
res = msg.locale.t("maimai.message.song.prompt") + "\n"
|
|
|
|
|
for sid in sorted(sid_list, key=int):
|
|
|
|
|
s = (await total_list.get()).by_id(sid)
|
2023-06-22 07:12:09 +00:00
|
|
|
|
res += f"{s['id']}\u200B. {s['title']}{' (DX)' if s['type'] == 'DX' else ''}\n"
|
2023-06-19 16:37:14 +00:00
|
|
|
|
await msg.finish(res.strip())
|
|
|
|
|
else:
|
|
|
|
|
sid = str(sid_list[0])
|
|
|
|
|
music = (await total_list.get()).by_id(sid)
|
2023-07-07 16:11:19 +00:00
|
|
|
|
if not music:
|
2023-06-19 16:37:14 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.music_not_found"))
|
|
|
|
|
|
2023-05-28 05:23:05 +00:00
|
|
|
|
if diff is not None:
|
2023-06-12 05:51:36 +00:00
|
|
|
|
diff_index = get_diff(diff)
|
2023-06-28 17:52:55 +00:00
|
|
|
|
if not diff_index or (len(music['ds']) == 4 and diff_index == 4):
|
2023-06-19 16:37:14 +00:00
|
|
|
|
await msg.finish(msg.locale.t("maimai.message.chart_not_found"))
|
2023-06-10 04:23:59 +00:00
|
|
|
|
chart = music['charts'][diff_index]
|
|
|
|
|
ds = music['ds'][diff_index]
|
|
|
|
|
level = music['level'][diff_index]
|
2023-06-26 10:24:19 +00:00
|
|
|
|
file = get_cover(music['id'])
|
2023-06-10 04:23:59 +00:00
|
|
|
|
if len(chart['notes']) == 4:
|
2023-06-19 16:37:14 +00:00
|
|
|
|
message = msg.locale.t(
|
2023-06-10 04:23:59 +00:00
|
|
|
|
"maimai.message.song.sd",
|
|
|
|
|
diff=diff_label[diff_index],
|
|
|
|
|
level=level,
|
|
|
|
|
ds=ds,
|
|
|
|
|
tap=chart['notes'][0],
|
|
|
|
|
hold=chart['notes'][1],
|
|
|
|
|
slide=chart['notes'][2],
|
2023-06-12 05:11:36 +00:00
|
|
|
|
brk=chart['notes'][3],
|
2023-06-10 04:23:59 +00:00
|
|
|
|
charter=chart['charter'])
|
|
|
|
|
else:
|
2023-06-19 16:37:14 +00:00
|
|
|
|
message = msg.locale.t(
|
2023-06-10 04:23:59 +00:00
|
|
|
|
"maimai.message.song.dx",
|
|
|
|
|
diff=diff_label[diff_index],
|
|
|
|
|
level=level,
|
|
|
|
|
ds=ds,
|
|
|
|
|
tap=chart['notes'][0],
|
|
|
|
|
hold=chart['notes'][1],
|
|
|
|
|
slide=chart['notes'][2],
|
|
|
|
|
touch=chart['notes'][3],
|
2023-06-12 05:11:36 +00:00
|
|
|
|
brk=chart['notes'][4],
|
2023-06-10 04:23:59 +00:00
|
|
|
|
charter=chart['charter'])
|
2023-06-19 16:37:14 +00:00
|
|
|
|
await msg.finish(
|
2023-06-22 07:12:09 +00:00
|
|
|
|
[Plain(f"{music['id']}\u200B. {music['title']}{' (DX)' if music['type'] == 'DX' else ''}\n"),
|
2023-06-19 16:37:14 +00:00
|
|
|
|
BImage(f"{file}"), Plain(message)])
|
2023-05-28 05:23:05 +00:00
|
|
|
|
else:
|
2023-06-26 10:24:19 +00:00
|
|
|
|
file = get_cover(music['id'])
|
2023-06-19 16:37:14 +00:00
|
|
|
|
await msg.finish(
|
2023-06-22 07:12:09 +00:00
|
|
|
|
[Plain(f"{music['id']}\u200B. {music['title']}{' (DX)' if music['type'] == 'DX' else ''}\n"),
|
2023-06-10 04:23:59 +00:00
|
|
|
|
BImage(f"{file}"),
|
2023-06-19 16:37:14 +00:00
|
|
|
|
Plain(msg.locale.t("maimai.message.song",
|
2023-06-10 04:23:59 +00:00
|
|
|
|
artist=music['basic_info']['artist'], genre=music['basic_info']['genre'],
|
|
|
|
|
bpm=music['basic_info']['bpm'], version=music['basic_info']['from'],
|
2023-06-19 16:37:14 +00:00
|
|
|
|
level='/'.join((str(ds) for ds in music['ds']))))])
|
2023-05-21 06:41:50 +00:00
|
|
|
|
|
2023-06-17 04:39:47 +00:00
|
|
|
|
|
2023-06-12 05:51:36 +00:00
|
|
|
|
@mai.handle('scoreline <sid> <diff> <scoreline> {{maimai.help.scoreline}}')
|
|
|
|
|
async def _(msg: Bot.MessageSession, diff: str, sid: str, scoreline: float):
|
2023-06-12 05:11:36 +00:00
|
|
|
|
try:
|
2023-07-14 07:02:09 +00:00
|
|
|
|
if not sid.isdigit():
|
|
|
|
|
if sid[:2].lower() == "id":
|
2023-07-14 11:58:58 +00:00
|
|
|
|
sid = sid[2:]
|
2023-07-14 07:02:09 +00:00
|
|
|
|
else:
|
|
|
|
|
await msg.finish(msg.locale.t('maimai.message.error.non_digital'))
|
2023-06-12 05:51:36 +00:00
|
|
|
|
diff_index = get_diff(diff)
|
|
|
|
|
music = (await total_list.get()).by_id(sid)
|
2023-06-22 05:28:02 +00:00
|
|
|
|
chart = music['charts'][diff_index]
|
2023-06-12 05:11:36 +00:00
|
|
|
|
tap = int(chart['notes'][0])
|
|
|
|
|
slide = int(chart['notes'][2])
|
|
|
|
|
hold = int(chart['notes'][1])
|
|
|
|
|
touch = int(chart['notes'][3]) if len(chart['notes']) == 5 else 0
|
|
|
|
|
brk = int(chart['notes'][-1])
|
|
|
|
|
total_score = 500 * tap + slide * 1500 + hold * 1000 + touch * 500 + brk * 2500
|
|
|
|
|
break_bonus = 0.01 / brk
|
|
|
|
|
break_50_reduce = total_score * break_bonus / 4
|
2023-06-12 05:51:36 +00:00
|
|
|
|
reduce = 101 - scoreline
|
2023-06-12 05:11:36 +00:00
|
|
|
|
if reduce <= 0 or reduce >= 101:
|
|
|
|
|
raise ValueError
|
2023-06-12 05:51:36 +00:00
|
|
|
|
tap_great = "{:.2f}".format(total_score * reduce / 10000)
|
|
|
|
|
tap_great_prop = "{:.4f}".format(10000 / total_score)
|
|
|
|
|
b2t_great = "{:.3f}".format(break_50_reduce / 100)
|
|
|
|
|
b2t_great_prop = "{:.4f}".format(break_50_reduce / total_score * 100)
|
2023-06-12 10:16:02 +00:00
|
|
|
|
await msg.finish(f'''{music['title']}{' (DX)' if music['type'] == 'DX' else ''} {diff_label[diff_index]}
|
2023-06-17 04:39:47 +00:00
|
|
|
|
{msg.locale.t('maimai.message.scoreline',
|
|
|
|
|
scoreline=scoreline,
|
|
|
|
|
tap_great=tap_great,
|
|
|
|
|
tap_great_prop=tap_great_prop,
|
|
|
|
|
brk=brk,
|
|
|
|
|
b2t_great=b2t_great,
|
2023-06-12 07:49:18 +00:00
|
|
|
|
b2t_great_prop=b2t_great_prop)}''')
|
2023-06-12 05:11:36 +00:00
|
|
|
|
except Exception:
|
2023-07-14 06:15:46 +00:00
|
|
|
|
await msg.finish(msg.locale.t('maimai.message.scoreline.error', prefix=command_prefix[0]))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mai.command('update', required_superuser=True)
|
|
|
|
|
async def _(msg: Bot.MessageSession):
|
|
|
|
|
if await update_alias():
|
|
|
|
|
await msg.finish(msg.locale.t("phigros.message.update.success"))
|
|
|
|
|
else:
|
2023-07-14 11:58:58 +00:00
|
|
|
|
await msg.finish(msg.locale.t("phigros.message.update.failed"))
|