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/song.py
2023-05-19 12:46:29 +08:00

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