79 lines
4.8 KiB
Python
79 lines
4.8 KiB
Python
import os
|
|
import traceback
|
|
from datetime import datetime
|
|
|
|
from config import Config
|
|
from core.builtins import Plain
|
|
from core.logger import Logger
|
|
from core.utils.http import get_url
|
|
|
|
assets_path = os.path.abspath('./assets/arcaea')
|
|
api_url = Config("botarcapi_url")
|
|
|
|
|
|
async def get_song_info(msgsession, sid, diff: int, usercode=None):
|
|
headers = {"User-Agent": Config('botarcapi_agent')}
|
|
try:
|
|
song_info = await get_url(f'{api_url}/song/info?songname={sid}', headers=headers, status_code=200,
|
|
fmt='json')
|
|
except ValueError as e:
|
|
Logger.info(f'[{sid}] {e}')
|
|
return {'success': False, 'msg': msgsession.locale.t('arcaea.message.failed')}
|
|
except Exception:
|
|
traceback.print_exc()
|
|
return {'success': False, 'msg': msgsession.locale.t('arcaea.message.failed')}
|
|
if song_info["status"] == 0:
|
|
msg = []
|
|
difficulties = song_info["content"]["difficulties"]
|
|
if len(difficulties) < diff:
|
|
return [Plain(msgsession.locale.t('arcaea.message.song.invalid.difficulty'))]
|
|
song_name = difficulties[diff]['name_en']
|
|
diff_display_name = 'PST' if diff == 0 else 'PRS' if diff == 1 else 'FTR' if diff == 2 else 'BYD' \
|
|
if diff == 3 else '???'
|
|
side_display_name = msgsession.locale.t('arcaea.message.song.side.light') if difficulties[diff]['side'] == 0 else msgsession.locale.t(
|
|
'arcaea.message.song.side.conflict') if difficulties[diff]['side'] == 1 else msgsession.locale.t('arcaea.message.song.side.colorless') if difficulties[diff]['side'] == 2 else '???'
|
|
msg.append(f'{song_name} ({diff_display_name}/{side_display_name})')
|
|
display_rating_1 = difficulties[diff]['difficulty'] / 2
|
|
display_rating_2 = difficulties[diff]['difficulty'] // 2
|
|
display_rating = str(display_rating_2) + ("+" if display_rating_1 > display_rating_2 else "")
|
|
rating = difficulties[diff]['rating'] / 10
|
|
msg.append(msgsession.locale.t('arcaea.message.song.difficulty_rating') + display_rating + f' ({rating})')
|
|
msg.append(msgsession.locale.t('arcaea.message.song.artist') + difficulties[diff]['artist'])
|
|
msg.append(msgsession.locale.t('arcaea.message.song.jacket_designer') + difficulties[diff]['jacket_designer'])
|
|
msg.append(msgsession.locale.t('arcaea.message.song.chart_designer') + difficulties[diff]['chart_designer'])
|
|
msg.append(msgsession.locale.t('arcaea.message.song.note') + str(difficulties[diff]['note']))
|
|
msg.append(msgsession.locale.t('arcaea.message.song.bpm') + str(difficulties[diff]['bpm']))
|
|
msg.append(msgsession.locale.t('arcaea.message.song.set_friendly') + difficulties[diff]['set_friendly'])
|
|
msg.append(msgsession.locale.t('arcaea.message.song.time') +
|
|
str(difficulties[diff]['time']) +
|
|
msgsession.locale.t('arcaea.message.song.time.second'))
|
|
msg.append(msgsession.locale.t('arcaea.message.song.date') +
|
|
datetime.fromtimestamp(difficulties[diff]["date"]).strftime("%Y-%m-%d"))
|
|
msg.append(msgsession.locale.t('arcaea.message.song.world_unlock') +
|
|
(msgsession.locale.t('yes') if difficulties[diff]['world_unlock'] else msgsession.locale.t('no')))
|
|
msg.append(msgsession.locale.t('arcaea.message.song.remote_download') +
|
|
(msgsession.locale.t('yes') if difficulties[diff]['remote_download'] else msgsession.locale.t('no')))
|
|
if usercode:
|
|
try:
|
|
play_info = await get_url(
|
|
f'{api_url}user/best?usercode={usercode}&songid={song_info["content"]["song_id"]}&'
|
|
f'difficulty={diff}',
|
|
headers=headers, status_code=200,
|
|
fmt='json')
|
|
if play_info["status"] == 0:
|
|
msg.append(msgsession.locale.t('arcaea.message.song.best') +
|
|
str(play_info["content"]["record"]["score"]) +
|
|
f'\n({str(play_info["content"]["record"]["rating"])}, '
|
|
f'P: {str(play_info["content"]["record"]["perfect_count"])}'
|
|
f'({str(play_info["content"]["record"]["shiny_perfect_count"])}), '
|
|
f'F: {str(play_info["content"]["record"]["near_count"])}, '
|
|
f'L: {str(play_info["content"]["record"]["miss_count"])})')
|
|
except Exception:
|
|
traceback.print_exc()
|
|
|
|
return '\n'.join(msg)
|
|
else:
|
|
errcode_string = f"arcaea.errcode.{song_info['status']}"
|
|
if locale := msgsession.locale.t(errcode_string) != errcode_string:
|
|
return f'{msgsession.locale.t("arcaea.message.failed.errcode")}{locale}'
|
|
return msgsession.locale.t('arcaea.message.failed') + song_info
|