Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/modules/arcaea/__init__.py

261 lines
11 KiB
Python
Raw Normal View History

2021-12-06 15:32:27 +00:00
import os
2023-05-15 10:36:23 +00:00
import traceback
2021-12-06 15:32:27 +00:00
2023-04-28 11:58:41 +00:00
from config import Config
2023-05-15 10:36:23 +00:00
from core.builtins import Bot, ExecutionLockList
from core.builtins import Plain, Image
2023-03-04 08:51:56 +00:00
from core.component import module
2023-05-15 10:36:23 +00:00
from core.logger import Logger
from core.utils.http import get_url
from .dbutils import ArcBindInfoManager
from .getb30 import make_b30_img
from .info import get_info
from .initialize import arcb30init
from .song import get_song_info
from .utils import get_userinfo
2021-12-06 15:32:27 +00:00
2023-04-05 02:22:37 +00:00
arc = module('arcaea', developers=['OasisAkari'], desc='{arcaea.help.desc}',
2023-04-28 13:31:37 +00:00
alias={'b30': 'arcaea b30', 'a': 'arcaea', 'arc': 'arcaea'})
2023-05-15 10:36:23 +00:00
webrender = Config('web_render')
assets_path = os.path.abspath('./assets/arcaea')
api = Config("botarcapi_url")
headers = {"Authorization": f'Bearer {Config("botarcapi_token")}'}
query_tasks = set()
class WithErrCode(Exception):
pass
async def get_friendcode(msg: Bot.MessageSession):
get_friendcode_from_db = ArcBindInfoManager(msg).get_bind_friendcode()
if get_friendcode_from_db is not None:
return get_friendcode_from_db
2023-05-28 09:21:33 +00:00
@arc.command('b30 [<friend_code>] {{arcaea.help.b30}}')
async def _(msg: Bot.MessageSession, friend_code: int = None):
2023-05-15 10:36:23 +00:00
if not os.path.exists(assets_path):
await msg.finish(msg.locale.t("arcaea.message.assets.not_found", prefix=msg.prefixes[0]))
2023-05-28 09:21:33 +00:00
if friend_code is not None:
if len(str(friend_code)) != 9:
await msg.finish(msg.locale.t("arcaea.message.invalid.friendcode.non_digital"))
query_code = friend_code
2023-05-15 10:36:23 +00:00
else:
query_code = await get_friendcode(msg)
if query_code is not None:
try:
2023-05-15 12:40:36 +00:00
if msg.target.senderId in query_tasks:
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.b30.wait.already"))
2023-05-15 10:36:23 +00:00
query_tasks.add(msg.target.senderId)
get_ = await get_url(api + f'user/bests/session?user_name={query_code}', headers=headers,
fmt='json')
if get_['status'] == 0:
2023-06-01 17:08:10 +00:00
await msg.sendMessage(msg.locale.t("arcaea.message.b30.wait")),
if msg.target.targetFrom not in ['Discord|Channel', 'Telegram|group', 'Telegram|supergroup']:
await msg.sendMessage([Plain(msg.locale.t("arcaea.message.sb616")),
Image(os.path.abspath('./assets/noc.jpg')),
Image(os.path.abspath('./assets/aof.jpg'))])
2023-05-15 10:36:23 +00:00
elif get_['status'] == -33:
2023-05-19 04:46:29 +00:00
await msg.sendMessage(msg.locale.t("arcaea.message.b30.wait.cached"))
2023-05-17 09:55:02 +00:00
elif get_['status'] == -23:
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.b30.low_potential"))
2023-05-17 09:51:06 +00:00
else:
2023-05-23 01:47:02 +00:00
await msg.finish(msg.locale.t("arcaea.message.get_failed") + get_['message'])
2023-05-15 10:36:23 +00:00
ExecutionLockList.remove(msg)
async def _get_result(session):
try:
get_ = await get_url(api + f'user/bests/result?session_info={session}&with_song_info=true',
headers=headers,
fmt='json')
if get_['status'] in [-31, -32]:
Logger.warn(get_['message'])
return False
return get_
except Exception as e:
Logger.error(e)
return False
async def _check(msg: Bot.MessageSession, session, tried):
if tried == 0: # too lazy to make it short :rina:
await msg.sleep(15)
if _result := await _get_result(session):
return _result
await msg.sleep(15)
if _result := await _get_result(session):
return _result
await msg.sleep(15)
if _result := await _get_result(session):
return _result
await msg.sleep(15)
if _result := await _get_result(session):
return _result
elif tried == 1:
2023-05-19 04:46:29 +00:00
await msg.sendMessage(msg.locale.t("arcaea.message.b30.wait.check"))
2023-05-15 10:36:23 +00:00
await msg.sleep(60)
if _result := await _get_result(session):
return _result
elif tried <= 30:
await msg.sleep(60)
if _result := await _get_result(session):
return _result
else:
2023-05-19 04:46:29 +00:00
await msg.sendMessage(msg.locale.t("arcaea.message.b30.wait.timeout"))
2023-05-15 10:36:23 +00:00
return False
tried += 1
return await _check(msg, session, tried)
resp = await _check(msg, get_['content']['session_info'], 0)
if resp:
resp = await make_b30_img(resp)
if resp['status']:
2023-05-19 04:46:29 +00:00
msgchain = [Plain(msg.locale.t("arcaea.message.b30.success", b30=resp["b30"], r10=resp["r10"],
2023-05-15 10:36:23 +00:00
last5list=resp["last5list"]))]
if 'file' in resp and msg.Feature.image:
msgchain.append(Image(path=resp['file']))
await msg.finish(msgchain)
else:
if 'errcode' in resp:
raise WithErrCode(resp['errcode'])
else:
raise
except WithErrCode as e:
err_key = "arcaea.errcode." + str(e.args[0])
err_msg = msg.locale.t(err_key)
if err_key != err_msg:
2023-05-23 01:47:02 +00:00
await msg.finish(msg.locale.t("arcaea.message.get_failed") + err_msg)
2023-05-15 10:36:23 +00:00
else:
2023-05-23 01:47:02 +00:00
await msg.finish(msg.locale.t("arcaea.message.get_failed"))
2023-05-15 10:36:23 +00:00
except Exception:
traceback.print_exc()
2023-05-23 01:47:02 +00:00
await msg.finish(msg.locale.t("arcaea.message.get_failed"))
2023-05-15 10:36:23 +00:00
finally:
query_tasks.remove(msg.target.senderId)
else:
2023-05-18 04:29:55 +00:00
await msg.finish(msg.locale.t("arcaea.message.user_unbound", prefix=msg.prefixes[0]))
2021-12-06 15:32:27 +00:00
2023-05-28 09:21:33 +00:00
@arc.command('info [<friend_code>] {{arcaea.help.info}}')
async def _(msg: Bot.MessageSession, friend_code: int = None):
2023-05-15 10:36:23 +00:00
if not os.path.exists(assets_path):
await msg.sendMessage(msg.locale.t("arcaea.message.assets.not_found", prefix=msg.prefixes[0]))
return
2023-05-28 09:21:33 +00:00
if friend_code is not None:
if len(str(friend_code)) != 9:
await msg.finish(msg.locale.t("arcaea.message.invalid.friendcode.non_digital"))
query_code = friend_code
2023-05-15 10:36:23 +00:00
else:
query_code = await get_friendcode(msg)
if query_code is not None:
try:
resp = await get_info(msg, query_code)
await msg.finish(resp)
except Exception:
traceback.print_exc()
2023-05-23 01:47:02 +00:00
await msg.finish(msg.locale.t("arcaea.message.get_failed"))
2023-05-15 10:36:23 +00:00
else:
2023-05-18 04:29:55 +00:00
await msg.finish(msg.locale.t("arcaea.message.user_unbound", prefix=msg.prefixes[0]))
2023-05-15 10:36:23 +00:00
2023-05-19 04:46:29 +00:00
@arc.command('song <songname> <prs|pst|ftr|byd> {{arcaea.help.song}}')
2023-05-15 10:36:23 +00:00
async def _(msg: Bot.MessageSession):
songname_ = msg.parsed_msg.get('<songname+prs/pst/byd>', False)
songname_split = songname_.split(' ')
diff = -1
for s in songname_split:
s_ = s.lower()
if s_ == 'pst':
diff = 0
elif s_ == 'prs':
diff = 1
elif s_ == 'ftr':
diff = 2
elif s_ == 'byd':
diff = 3
if diff != -1:
songname_split.remove(s)
break
if diff == -1:
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.song.invalid.difficulty"))
2023-05-15 10:36:23 +00:00
songname = ' '.join(songname_split)
usercode = await get_friendcode(msg)
await msg.finish(Plain(await get_song_info(msg, songname, diff, usercode)))
2023-05-19 04:46:29 +00:00
@arc.command('bind <friendcode|username> {{arcaea.help.bind}}')
2023-05-15 10:36:23 +00:00
async def _(msg: Bot.MessageSession):
2023-05-15 11:50:04 +00:00
code: str = msg.parsed_msg['<friendcode|username>']
2023-05-15 10:36:23 +00:00
getcode = await get_userinfo(code)
if getcode:
bind = ArcBindInfoManager(msg).set_bind_info(username=getcode[0], friendcode=getcode[1])
if bind:
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.bind.success", username=getcode[0], friendcode=getcode[1]))
2023-05-15 10:36:23 +00:00
else:
if code.isdigit():
bind = ArcBindInfoManager(msg).set_bind_info(username='', friendcode=code)
if bind:
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.bind.success.but_failed_fetch_username"))
2023-05-15 10:36:23 +00:00
else:
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.bind.failed"))
2023-05-15 10:36:23 +00:00
2023-05-19 04:46:29 +00:00
@arc.command('unbind {{arcaea.help.unbind}}')
2023-05-15 10:36:23 +00:00
async def _(msg: Bot.MessageSession):
unbind = ArcBindInfoManager(msg).remove_bind_info()
if unbind:
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.unbind.success"))
2023-05-15 10:36:23 +00:00
@arc.command('initialize', required_superuser=True)
async def _(msg: Bot.MessageSession):
assets_apk = os.path.abspath('./assets/arc.apk')
if not os.path.exists(assets_apk):
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.initialize.not_found"))
2023-05-15 10:36:23 +00:00
return
result = await arcb30init()
if result:
2023-05-19 04:46:29 +00:00
await msg.finish(msg.locale.t("arcaea.message.initialize.success"))
2023-05-15 10:36:23 +00:00
2023-04-28 11:47:14 +00:00
2023-05-19 04:46:29 +00:00
@arc.command('download {{arcaea.help.download}}')
2023-05-11 11:15:30 +00:00
async def _(msg: Bot.MessageSession):
if not webrender:
await msg.finish([msg.locale.t("arcaea.message.no_webrender")])
resp = await get_url(webrender + 'source?url=https://webapi.lowiro.com/webapi/serve/static/bin/arcaea/apk/', 200,
fmt='json')
if resp:
2023-05-19 04:46:29 +00:00
await msg.finish([Plain(msg.locale.t("arcaea.message.download.success", version=resp["value"]["version"],
2023-05-11 11:15:30 +00:00
url=resp['value']['url']))])
2023-05-15 10:36:23 +00:00
2023-05-19 04:46:29 +00:00
@arc.command('random {{arcaea.help.random}}')
2023-04-28 11:47:14 +00:00
async def _(msg: Bot.MessageSession):
if not webrender:
await msg.finish([msg.locale.t("arcaea.message.no_webrender")])
resp = await get_url(webrender + 'source?url=https://webapi.lowiro.com/webapi/song/showcase/', 200, fmt='json')
if resp:
value = resp["value"][0]
image = f'{assets_path}/jacket/{value["song_id"]}.jpg'
result = [Plain(value["title"]["en"])]
if os.path.exists(image):
result.append(Image(path=image))
await msg.finish(result)
2023-05-19 04:46:29 +00:00
@arc.command('rank free {{arcaea.help.rank.free}}', 'rank paid {{arcaea.help.rank.paid}}')
2023-04-28 11:47:14 +00:00
async def _(msg: Bot.MessageSession):
if not webrender:
2023-04-28 11:50:47 +00:00
await msg.finish([msg.locale.t("arcaea.message.no_webrender")])
2023-04-28 11:47:14 +00:00
if msg.parsed_msg.get('free', False):
resp = await get_url(webrender + 'source?url=https://webapi.lowiro.com/webapi/song/rank/free/', 200, fmt='json')
else:
resp = await get_url(webrender + 'source?url=https://webapi.lowiro.com/webapi/song/rank/paid/', 200, fmt='json')
if resp:
r = []
rank = 0
for x in resp['value']:
rank += 1
r.append(f'{rank}. {x["title"]["en"]} ({x["status"]})')
await msg.finish('\n'.join(r))