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/nintendo_err/__init__.py
2021-08-21 00:32:46 +08:00

332 lines
11 KiB
Python

# copied from kurisu(https://github.com/nh-server/Kurisu/tree/main/cogs/results)
import discord
from core.elements import MessageSession
from core.loader.decorator import command
from . import switch, wiiu_support, wiiu_results, ctr_support, ctr_results
class ctx:
@classmethod
async def send(cls, kwargs, msg=False, embed=False):
def convertdict(ele: dict):
emsglst = []
if 'title' in ele:
emsglst.append(ele['title'])
if 'url' in ele:
emsglst.append(ele['url'])
if 'fields' in ele:
for field_value in ele['fields']:
emsglst.append(field_value['name'] + ': ' + field_value['value'])
if 'description' in ele:
emsglst.append(ele['description'])
if 'footer' in ele:
emsglst.append(ele['footer']['text'])
return emsglst
msglst = []
if msg:
if isinstance(msg, dict):
msgs = convertdict(msg)
msglst.append('\n'.join(msgs))
elif isinstance(msg, str):
msglst.append(msg)
if embed:
msgs = convertdict(embed)
msglst.append('\n'.join(msgs))
await kwargs.sendMessage('\n'.join(msglst))
class Results:
"""
Parses game console result codes.
"""
def fetch(self, error):
if ctr_support.is_valid(error):
return ctr_support.get(error)
if ctr_results.is_valid(error):
return ctr_results.get(error)
if wiiu_support.is_valid(error):
return wiiu_support.get(error)
if wiiu_results.is_valid(error):
return wiiu_results.get(error)
if switch.is_valid(error):
return switch.get(error)
# Console name, module name, result, color
return None
def err2hex(self, error, suppress_error=False):
# If it's already hex, just return it.
if self.is_hex(error):
return error
# Only Switch is supported. The other two can only give nonsense results.
if switch.is_valid(error):
return switch.err2hex(error, suppress_error)
if not suppress_error:
return 'Invalid or unsupported error code format. \
Only Nintendo Switch XXXX-YYYY formatted error codes are supported.'
def hex2err(self, error, suppress_error=False):
# Don't bother processing anything if it's not hex.
if self.is_hex(error):
if switch.is_valid(error):
return switch.hex2err(error)
if not suppress_error:
return 'This isn\'t a hexadecimal value!'
def fixup_input(self, user_input):
# Truncate input to 16 chars so as not to create a huge embed or do
# eventual regex on a huge string. If we add support for consoles that
# that have longer error codes, adjust accordingly.
user_input = user_input[:16]
# Fix up hex input if 0x was omitted. It's fine if it doesn't convert.
try:
user_input = hex(int(user_input, 16))
except ValueError:
pass
return user_input
def is_hex(self, user_input):
try:
user_input = hex(int(user_input, 16))
except ValueError:
return False
return True
def check_meme(self, err: str) -> str:
memes = {
'0xdeadbeef': '都坏掉了,不能吃了。',
'0xdeadbabe': '我觉得你有问题。',
'0x8badf00d': '记得垃圾分类。'
}
return memes.get(err.casefold())
async def result(self, kwargs):
"""
Displays information on game console result codes, with a fancy embed.
0x prefix is not required for hex input.
Examples:
.err 0xD960D02B
.err D960D02B
.err 022-2634
.err 102-2804
.err 2168-0002
.err 2-ARVHA-0000
"""
err = ' '.join(kwargs['trigger_msg'].split(' ')[1:])
err = self.fixup_input(err)
if (meme := self.check_meme(err)) is not None:
return await ctx.send(kwargs, meme)
try:
ret = self.fetch(err)
except ValueError:
ret = None
if ret:
embed = discord.Embed(title=ret.get_title())
if ret.extra_description:
embed.description = ret.extra_description
for field in ret:
embed.add_field(name=field.field_name, value=field.message, inline=False)
embed.color = ret.color
embed = embed.to_dict()
await ctx.send(kwargs, embed=embed)
else:
await ctx.send(kwargs, f'你输入的代码是无效的,或者此功能不支持你使用的主机。')
async def nxerr(self, kwargs):
"""
Displays information on switch result codes, with a fancy embed.
0x prefix is not required for hex input.
Examples:
.nxerr 0x4A8
.nxerr 4A8
.nxerr 2168-0002
.nxerr 2-ARVHA-0000
"""
err = ' '.join(kwargs['trigger_msg'].split(' ')[1:])
err = self.fixup_input(err)
if (meme := self.check_meme(err)) is not None:
return await ctx.send(kwargs, meme)
ret = None
if switch.is_valid(err):
ret = switch.get(err)
if ret:
embed = discord.Embed(title=ret.get_title())
if ret.extra_description:
embed.description = ret.extra_description
for field in ret:
embed.add_field(name=field.field_name, value=field.message, inline=False)
embed.color = ret.color
embed = embed.to_dict()
await ctx.send(kwargs, embed=embed)
else:
await ctx.send(kwargs, f'The code you entered is \
invalid for the switch.')
async def ctrerr(self, kwargs):
"""
Displays information on 3DS result codes, with a fancy embed.
0x prefix is not required for hex input.
Examples:
.ctrerr 0xD960D02B
.ctrerr D960D02B
.ctrerr 022-2634
"""
err = ' '.join(kwargs['trigger_msg'].split(' ')[1:])
if (meme := self.check_meme(err)) is not None:
return await ctx.send(kwargs, meme)
ret = None
if ctr_support.is_valid(err):
ret = ctr_support.get(err)
elif ctr_results.is_valid(err):
ret = ctr_results.get(err)
if ret:
embed = discord.Embed(title=ret.get_title())
if ret.extra_description:
embed.description = ret.extra_description
for field in ret:
embed.add_field(name=field.field_name, value=field.message, inline=False)
embed.color = ret.color
embed = embed.to_dict()
await ctx.send(kwargs, embed=embed)
else:
await ctx.send(kwargs, f'The code you entered is \
invalid for the 3DS.')
async def cafeerr(self, kwargs):
"""
Displays information on Wii U result codes, with a fancy embed.
0x prefix is not required for hex input.
Examples:
.cafeerr 0xC070FA80
.cafeerr C070FA80
.cafeerr 0x18106FFF
.cafeerr 18106FFF
.cafeerr 102-2804
"""
err = ' '.join(kwargs['trigger_msg'].split(' ')[1:])
err = self.fixup_input(err)
if (meme := self.check_meme(err)) is not None:
return await ctx.send(kwargs, meme)
ret = None
if wiiu_support.is_valid(err):
ret = wiiu_support.get(err)
elif wiiu_results.is_valid(err):
ret = wiiu_results.get(err)
if ret:
embed = discord.Embed(title=ret.get_title())
if ret.extra_description:
embed.description = ret.extra_description
for field in ret:
embed.add_field(name=field.field_name, value=field.message, inline=False)
embed.color = ret.color
embed = embed.to_dict()
await ctx.send(kwargs, embed=embed)
else:
await ctx.send(kwargs, f'The code you entered is \
invalid for the Wii U.')
async def cmderr2hex(self, kwargs):
"""
Converts a support code of a console to a hex result code.
Switch only supported.
3DS and WiiU support and result codes are not directly interchangeable.
"""
err = ' '.join(kwargs['trigger_msg'].split(' ')[1:])
error = self.fixup_input(err)
await ctx.send(kwargs, self.err2hex(error))
async def cmdhex2err(self, kwargs):
"""
Converts a hex result code of a console to a support code.
Switch only supported.
3DS and WiiU support and result codes are not directly interchangeable.
"""
err = ' '.join(kwargs['trigger_msg'].split(' ')[1:])
error = self.fixup_input(err)
await ctx.send(kwargs, self.hex2err(error))
async def hexinfo(self, kwargs):
"""
Breaks down a 3DS result code into its components.
"""
err = ' '.join(kwargs['trigger_msg'].split(' ')[1:])
error = self.fixup_input(err)
if self.is_hex(error):
if ctr_results.is_valid(error):
mod, desc, summary, level = ctr_results.hexinfo(error)
embed = discord.Embed(title="3DS hex result info")
embed.add_field(name="Module", value=mod, inline=False)
embed.add_field(name="Summary", value=summary, inline=False)
embed.add_field(name="Level", value=level, inline=False)
embed.add_field(name="Description", value=desc, inline=False)
embed = embed.to_dict()
await ctx.send(kwargs, embed=embed)
else:
await ctx.send(kwargs, 'This isn\'t a 3DS result code.')
else:
await ctx.send(kwargs, 'This isn\'t a hexadecimal value!')
@command('err', help_doc='~err <errcode> {解析任天堂系列主机的报错码并给出原因。}')
async def result(msg: MessageSession):
"""
Displays information on game console result codes, with a fancy embed.
0x prefix is not required for hex input.
Examples:
.err 0xD960D02B
.err D960D02B
.err 022-2634
.err 102-2804
.err 2168-0002
.err 2-ARVHA-0000
"""
results = Results()
err = msg.parsed_msg['<errcode>']
err = results.fixup_input(err)
if (meme := results.check_meme(err)) is not None:
return await msg.sendMessage(meme)
try:
ret = results.fetch(err)
except ValueError:
ret = None
if ret:
embed = discord.Embed(title=ret.get_title())
if ret.extra_description:
embed.description = ret.extra_description
for field in ret:
embed.add_field(name=field.field_name, value=field.message, inline=False)
embed.color = ret.color
embed = embed.to_dict()
await ctx.send(msg, embed=embed)
else:
await ctx.send(msg, f'你输入的代码是无效的,或者此功能不支持你使用的主机。')