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_o/nintendo_err/wiiu_support.py

526 lines
23 KiB
Python
Raw Normal View History

2021-04-04 10:08:26 +00:00
import re
from .types import Module, ResultInfo, ConsoleErrorInfo, ConsoleErrorField, \
BANNED_FIELD, WARNING_COLOR, UNKNOWN_CATEGORY_DESCRIPTION
"""
This file contains all currently known Wii U result and error codes.
There may be inaccuracies here; we'll do our best to correct them
when we find out more about them.
A "support" code, in contrast to a result code, is a human-readable string like
102-2811. They're meant to be more user-friendly than result codes, which are
typically integer values.
Note: the "modules" presented here are more like "categories". However, this difference
isn't enough to justify creating a different class with the same logic, so we'll just
refer to them as "modules" from now on.
To add a module so the code understands it, simply add a new module number
to the 'modules' dictionary, with a Module variable as the value. If the module
has no known error codes, simply add a dummy Module instead (see the dict for
more info). See the various module variables for a more in-depth example
on how to make one.
Once you've added a module, or you want to add a new result code to an existing
module, add a new description value (for Switch it's the final set of 4 digits after any dashes)
as the key, and a ResultInfo variable with a text description of the error or result.
You can also add a second string to the ResultInfo to designate a support URL if
one exists. Not all results or errors have support webpages.
Simple example of adding a module with a sample result code:
test = Module('test', {
5: ResultInfo('test', 'https://example.com')
})
modules = {
9999: test
}
Sources used to compile this list of results:
https://github.com/Kinnay/NintendoClients/wiki/Wii-U-Error-Codes
"""
fp = Module('fp (friends)', {
0: ResultInfo('Success.'),
1: ResultInfo('Session closed.'),
10: ResultInfo('Programming error.'),
11: ResultInfo('Not initialized.'),
12: ResultInfo('Already initialized.'),
13: ResultInfo('Invalid argument.'),
14: ResultInfo('Busy.'),
15: ResultInfo('Network clock is invalid.'),
16: ResultInfo('Not permitted.'),
100: ResultInfo('Undefined error.'),
101: ResultInfo('Reserved error 01.'),
102: ResultInfo('Unknown error.'),
103: ResultInfo('Not implemented.'),
104: ResultInfo('Invalid pointer.'),
105: ResultInfo('Operation aborted.'),
106: ResultInfo('Exception occurred.'),
107: ResultInfo('Access denied.'),
108: ResultInfo('Invalid handle.'),
109: ResultInfo('Invalid index.'),
110: ResultInfo('Out of memory.'),
111: ResultInfo('Invalid argument.'),
112: ResultInfo('Timeout.'),
113: ResultInfo('Initialization failure.'),
114: ResultInfo('Call initiation failure.'),
115: ResultInfo('Registration error.'),
116: ResultInfo('Buffer overflow.'),
117: ResultInfo('Invalid lock state.'),
200: ResultInfo('Undefined.'),
201: ResultInfo('Invalid signature.'),
202: ResultInfo('Incorrect version.'),
300: ResultInfo('Undefined.'),
301: ResultInfo('Connection failure.'),
302: ResultInfo('Not authenticated.'),
303: ResultInfo('Invalid username.'),
304: ResultInfo('Invalid password.'),
305: ResultInfo('Username already exists.'),
306: ResultInfo('Account is disabled.'),
307: ResultInfo('Account is expired.'),
308: ResultInfo('Concurrent login denied.'),
309: ResultInfo('Encryption failure.'),
310: ResultInfo('Invalid PID.'),
311: ResultInfo('Max connections reached.'),
312: ResultInfo('Invalid GID.'),
313: ResultInfo('Invalid thread ID.'),
314: ResultInfo('Invalid operation in live environment.'),
315: ResultInfo('Duplicate entry.'),
316: ResultInfo('Control script failure.'),
317: ResultInfo('Class not found.'),
318: ResultInfo('Reserved 18.'),
319: ResultInfo('Reserved 19.'),
320: ResultInfo('DDL mismatch.'),
321: ResultInfo('Reserved 21.'),
322: ResultInfo('Reserved 22.'),
400: ResultInfo('Undefined error.'),
401: ResultInfo('Exception occurred.'),
402: ResultInfo('Type error.'),
403: ResultInfo('Index error.'),
404: ResultInfo('Invalid reference.'),
405: ResultInfo('Call failure.'),
406: ResultInfo('Memory error.'),
407: ResultInfo('Operation error.'),
408: ResultInfo('Conversion error.'),
409: ResultInfo('Validation error.'),
500: ResultInfo('Undefined error.'),
501: ResultInfo('Unknown error.'),
502: ResultInfo('Connection failure.'),
503: ResultInfo('Invalid URL.'),
504: ResultInfo('Invalid key.'),
505: ResultInfo('Invalid URL type.'),
506: ResultInfo('Duplicate endpoint.'),
507: ResultInfo('I/O error.'),
508: ResultInfo('Timeout.'),
509: ResultInfo('Connection reset.'),
510: ResultInfo('Incorrect remote authentication.'),
511: ResultInfo('Server request error.'),
512: ResultInfo('Decompression failure.'),
513: ResultInfo('Congested end-point.'),
514: ResultInfo('Reserved 14.'),
515: ResultInfo('Reserved 15.'),
516: ResultInfo('Reserved 16.'),
517: ResultInfo('Reserved 17.'),
518: ResultInfo('Socket send warning.'),
519: ResultInfo('Unsupported NAT.'),
520: ResultInfo('DNS error.'),
521: ResultInfo('Proxy error.'),
522: ResultInfo('Data remaining.'),
523: ResultInfo('No buffer.'),
524: ResultInfo('Not found.'),
600: ResultInfo('Undefined error.'),
700: ResultInfo('Undefined error.'),
701: ResultInfo('Reserved 1.'),
702: ResultInfo('Not initialized.'),
703: ResultInfo('Already initialized.'),
704: ResultInfo('Not connected.'),
705: ResultInfo('Connected.'),
706: ResultInfo('Initialization failure.'),
707: ResultInfo('Out of memory.'),
708: ResultInfo('RMC failed.'),
709: ResultInfo('Invalid argument.'),
710: ResultInfo('Reserved 10.'),
711: ResultInfo('Invalid principal ID.'),
712: ResultInfo('Reserved 12.'),
713: ResultInfo('Reserved 13.'),
714: ResultInfo('Reserved 14.'),
715: ResultInfo('Reserved 15.'),
716: ResultInfo('Reserved 16.'),
717: ResultInfo('Reserved 17.'),
718: ResultInfo('Reserved 18.'),
719: ResultInfo('Reserved 19.'),
720: ResultInfo('File I/O error.'),
721: ResultInfo('P2P internet prohibited.'),
722: ResultInfo('Unknown error.'),
723: ResultInfo('Invalid state.'),
724: ResultInfo('Reservd 24.'),
725: ResultInfo('Adding a friend is prohibited.'),
726: ResultInfo('Reserved 26.'),
727: ResultInfo('Invalid account.'),
728: ResultInfo('Blacklisted by me.'),
729: ResultInfo('Reserved 29.'),
730: ResultInfo('Friend already added.'),
731: ResultInfo('Friend list limit exceeded.'),
732: ResultInfo('Requests limit exceeded.'),
733: ResultInfo('Invalid message ID.'),
734: ResultInfo('Message is not mine.'),
735: ResultInfo('Message is not for me.'),
736: ResultInfo('Friend request blocked.'),
737: ResultInfo('Not in my friend list.'),
738: ResultInfo('Friend listed by me.'),
739: ResultInfo('Not in my blackist.'),
740: ResultInfo('Incompatible account.'),
741: ResultInfo('Block setting change not allowed.'),
742: ResultInfo('Size limit exceeded.'),
743: ResultInfo('Operation not allowed.'),
744: ResultInfo('Not a network account.'),
745: ResultInfo('Notification not found.'),
746: ResultInfo('Preference not initialized.'),
747: ResultInfo('Friend request not allowed.'),
800: ResultInfo('Undefined error.'),
801: ResultInfo('Account library error.'),
802: ResultInfo('Token parse error.'),
803: ResultInfo('Reserved 3.'),
804: ResultInfo('Reserved 4.'),
805: ResultInfo('Reserved 5.'),
806: ResultInfo('Token expired.'),
807: ResultInfo('Validation failed.'),
808: ResultInfo('Invalid parameters.'),
809: ResultInfo('Principal ID unmatched.'),
810: ResultInfo('Reserved 10.'),
811: ResultInfo('Under maintenance.'),
812: ResultInfo('Unsupported version.'),
813: ResultInfo('Unknown error.')
}, {
(100, 199): 'Core',
(200, 299): 'DDL',
(300, 399): 'Rendezvous',
(400, 499): 'Python Core',
(500, 599): 'Transport',
(600, 699): 'DO Core',
(700, 799): 'FPD',
(800, 899): 'Authentication',
(1100, 1199): 'Ranking',
(1200, 1299): 'Data Store',
(1500, 1599): 'Service Item',
(1800, 1899): 'Matchmaking Referee',
(1900, 1999): 'Subscriber',
(2000, 2099): 'Ranking2',
})
2021-04-04 10:08:26 +00:00
act = Module('act (accounts)', {
0: ResultInfo('Success.'),
1: ResultInfo('Mail address not confirmed.'),
500: ResultInfo('Library error.'),
501: ResultInfo('Not initialized.'),
502: ResultInfo('Already initialized.'),
511: ResultInfo('Busy.'),
591: ResultInfo('Not implemented.'),
592: ResultInfo('Deprecated.'),
593: ResultInfo('Development only.'),
600: ResultInfo('Invalid argument.'),
601: ResultInfo('Invalid pointer.'),
602: ResultInfo('Out of range.'),
603: ResultInfo('Invalid size.'),
604: ResultInfo('Invalid format.'),
605: ResultInfo('Invalid handle.'),
606: ResultInfo('Invalid value.'),
700: ResultInfo('Internal error.'),
701: ResultInfo('End of stream.'),
710: ResultInfo('File error.'),
711: ResultInfo('File not found.'),
712: ResultInfo('File version mismatch.'),
713: ResultInfo('File I/O error.'),
714: ResultInfo('File type mismatch.'),
730: ResultInfo('Out of resources.'),
731: ResultInfo('Buffer is insufficient.'),
740: ResultInfo('Out of memory.'),
741: ResultInfo('Out of global heap.'),
742: ResultInfo('Out of cross-process heap.'),
744: ResultInfo('Out of MXML heap.'),
800: ResultInfo('Generic error.'),
801: ResultInfo('Open error.'),
802: ResultInfo('Read sys-config error.'),
810: ResultInfo('Generic error.'),
811: ResultInfo('Open error.'),
812: ResultInfo('Get info error.'),
820: ResultInfo('Generic error.'),
821: ResultInfo('Initialization failure.'),
822: ResultInfo('Get country code failure.'),
823: ResultInfo('Get language code failure.'),
850: ResultInfo('Generic error.'),
900: ResultInfo('Generic error.'),
901: ResultInfo('Open error.'),
1000: ResultInfo('Management error.'),
1001: ResultInfo('Not found.'),
1002: ResultInfo('Slots full.'),
1011: ResultInfo('Not loaded.'),
1012: ResultInfo('Already loaded.'),
1013: ResultInfo('Locked.'),
1021: ResultInfo('Not a network account.'),
1022: ResultInfo('Not a local account.'),
1023: ResultInfo('Not committed.'),
1101: ResultInfo('Network clock is invalid.'),
2000: ResultInfo('Authentication error.'),
# TODO: 2001-2644 (there aren't really that many errors)
2643: ResultInfo('Authentication is required.'),
2651: ResultInfo('Confirmation code is expired.'),
2661: ResultInfo('Mail address is not validated.'),
2662: ResultInfo('Excessive mail send requests.'),
2670: ResultInfo('Generic error.'),
2671: ResultInfo('General failure.'),
2672: ResultInfo('Declined.'),
2673: ResultInfo('Blacklisted.'),
2674: ResultInfo('Invalid credit card number.'),
2675: ResultInfo('Invalid credit card date.'),
2676: ResultInfo('Invalid credit card PIN.'),
2677: ResultInfo('Invalid postal code.'),
2678: ResultInfo('Invalid location.'),
2679: ResultInfo('Card is expired.'),
2680: ResultInfo('Credit card number is wrong.'),
2681: ResultInfo('PIN is wrong.'),
2800: ResultInfo('Banned.', is_ban=True),
2801: ResultInfo('Account is banned.', is_ban=True),
2802: ResultInfo('Account is banned from all services.', is_ban=True),
2803: ResultInfo('Account is banned from a particular game.', is_ban=True),
2804: ResultInfo('Account is banned from Nintendo\'s online service.', is_ban=True),
2805: ResultInfo('Account is banned from independent services.', is_ban=True),
2811: ResultInfo('Console is banned.', is_ban=True),
2812: ResultInfo('Console is banned from all services.', is_ban=True),
2813: ResultInfo('Console is banned from a particular game.', is_ban=True),
2814: ResultInfo('Console is banned from Nintendo\'s online service.', is_ban=True),
2815: ResultInfo('Console is banned from independent services.', is_ban=True),
2816: ResultInfo(
'Console is banned for an unknown duration, due to using modified/hacked files in online games like Splatoon.',
is_ban=True),
2021-04-04 10:08:26 +00:00
2821: ResultInfo('Account is temporarily banned.', is_ban=True),
2822: ResultInfo('Account is temporarily banned from all services.', is_ban=True),
2823: ResultInfo('Account is temporarily banned from a particular game.', is_ban=True),
2824: ResultInfo('Account is temporarily banned from Nintendo\'s online service.', is_ban=True),
2825: ResultInfo('Acccount is temporarily banned from independent services.', is_ban=True),
2831: ResultInfo('Console is temporarily banned.', is_ban=True),
2832: ResultInfo('Console is temporarily banned from all services.', is_ban=True),
2833: ResultInfo('Console is temporarily banned from a particular game.', is_ban=True),
2834: ResultInfo('Console is temporarily banned from Nintendo\'s online service.', is_ban=True),
2835: ResultInfo('Console is temporarily banned from independent services.', is_ban=True),
2880: ResultInfo('Service is not provided.'),
2881: ResultInfo('Service is currently under maintenance.'),
2882: ResultInfo('Service is closed.'),
2883: ResultInfo('Nintendo Network is closed.'),
2884: ResultInfo('Service is not provided in this country.'),
2900: ResultInfo('Restriction error.'),
2901: ResultInfo('Restricted by age.'),
2910: ResultInfo('Restricted by parental controls.'),
2911: ResultInfo('In-game internet communication/chat is restricted.'),
2931: ResultInfo('Internal server error.'),
2932: ResultInfo('Unknown server error.'),
2998: ResultInfo('Unauthenticated after salvage.'),
2999: ResultInfo('Unknown authentication failure.'),
}, {
(0, 499): 'Internal',
(500, 599): 'Status changed',
(600, 699): 'Invalid argument',
(700, 709): 'Internal error',
(710, 729): 'File error',
(730, 799): 'Out of resources',
(800, 809): 'UC',
(810, 819): 'MCP',
(820, 849): 'ISO',
(850, 899): 'MXML',
(900, 999): 'IOS',
(1000, 1099): 'Account',
(2100, 2199): 'HTTP',
(2500, 2599): 'Account',
(2670, 2699): 'Credit Card',
(2800, 2835): 'Banned',
(2880, 2899): 'Not available', # not provided/under maintenance/no longer in service
})
2021-04-04 10:08:26 +00:00
nex = Module('nex (game servers)', {
102: ResultInfo('The reason for the error is unknown.'),
103: ResultInfo('The operation is currently not implemented.'),
104: ResultInfo('The operation specifies or accesses an invalid pointer.'),
105: ResultInfo('The operation was aborted.'),
106: ResultInfo('The operation raised an exception.'),
107: ResultInfo(
'An attempt was made to access data in an incorrect manner. This may be due to inadequate permission or the data, file, etc. not existing.'),
2021-04-04 10:08:26 +00:00
108: ResultInfo('The operation specifies or accesses an invalid DOHandle.'),
109: ResultInfo('The operation specifies or accesses an invalid index.'),
110: ResultInfo(
'The system could not allocate or access enough memory or disk space to perform the specified operation.'),
2021-04-04 10:08:26 +00:00
111: ResultInfo('Invalid argument were passed with the operation. The argument(s) may be out of range or invalid.'),
112: ResultInfo('The operation did not complete within the specified timeout for that operation.'),
113: ResultInfo('Initialization of the component failed.'),
114: ResultInfo('The call failed to initialize.'),
115: ResultInfo('An error occurred during registration.'),
116: ResultInfo('The buffer is too large to be sent.'),
117: ResultInfo('Invalid lock state.'),
118: ResultInfo('Invalid sequence.'),
301: ResultInfo('Connection was unable to be established, either with the Rendez-Vous back end or a Peer.'),
302: ResultInfo('The Principal could not be authenticated by the Authentication Service.'),
303: ResultInfo(
'The Principal tried to log in with an invalid user name, i.e. the user name does not exist in the database.'),
304: ResultInfo(
'The Principal either tried to log in with an invalid password for the provided user name or tried to join a Gathering with an invalid password.'),
2021-04-04 10:08:26 +00:00
305: ResultInfo('The provided user name already exists in the database. All usernames must be unique.'),
306: ResultInfo('The Principal\'s account still exists in the database but the account has been disabled.',
is_ban=True),
2021-04-04 10:08:26 +00:00
307: ResultInfo('The Principal\'s account still exists in the database but the account has expired.'),
308: ResultInfo(
'The Principal does not have the Capabilities to perform concurrent log ins, i.e. at any given time only one log-in may be maintained.'),
2021-04-04 10:08:26 +00:00
309: ResultInfo('Data encryption failed.'),
310: ResultInfo('The operation specifies or accesses an invalid PrincipalID.'),
311: ResultInfo('Maximum connnection number is reached.'),
312: ResultInfo('Invalid GID.'),
313: ResultInfo('Invalid Control script ID.'),
314: ResultInfo('Invalid operation in live/production environment.'),
315: ResultInfo('Duplicate entry.'),
346: ResultInfo('NNID is permanently banned.', is_ban=True),
501: ResultInfo('The reason for the error is unknown.'),
502: ResultInfo('Network connection was unable to be established.'),
503: ResultInfo('The URL contained in the StationURL is invalid. The syntax may be incorrect.'),
504: ResultInfo(
'The key used to authenticate a given station is invalid. The secure transport layer uses secret-key based cryptography to ensure the integrity and confidentiality of data sent across the network.'),
2021-04-04 10:08:26 +00:00
505: ResultInfo('The specified transport type is invalid.'),
506: ResultInfo('The Station is already connected via another EndPoint.'),
507: ResultInfo(
'The data could not be sent across the network. This could be due to an invalid message, packet, or buffer.'),
2021-04-04 10:08:26 +00:00
508: ResultInfo('The operation did not complete within the specified timeout for that operation.'),
509: ResultInfo('The network connection was reset.'),
510: ResultInfo('The destination Station did not authenticate itself properly.'),
511: ResultInfo(
'3rd-party server or device answered with an error code according to protocol used e.g. HTTP error code.'),
2021-04-04 10:08:26 +00:00
}, {
(100, 199): 'Core',
(200, 299): 'DDL',
(300, 399): 'Rendezvous',
(400, 499): 'Python Core',
(500, 599): 'Transport',
(600, 699): 'DO Core',
(700, 799): 'FPD',
(800, 899): 'Authentication',
(1100, 1199): 'Ranking',
(1200, 1299): 'Data Store',
(1500, 1599): 'Service Item',
(1800, 1899): 'Matchmaking Referee',
(1900, 1999): 'Subscriber',
(2000, 2099): 'Ranking2',
})
2021-04-04 10:08:26 +00:00
eshop_api = Module('eshop(api)', {
3190: ResultInfo('Wishlist is full.')
})
eshop_web = Module('eshop (web)', {
9000: ResultInfo('Close application (Connection timeout issue?).'),
9001: ResultInfo('Retriable.'),
9002: ResultInfo('Online services are undergoing maintenance.'),
9003: ResultInfo('The online services are discontinued and thus are no longer available.'),
9100: ResultInfo('Invalid template.')
})
unknown2 = Module('unknown (browser?)', {
1037: ResultInfo(
'Incorrect permissions for the default index.html file which prevents the Internet Browser from reading it.',
'[To fix it, follow these steps.](https://wiiu.hacks.guide/#/fix-errcode-112-1037)'),
2021-04-04 10:08:26 +00:00
})
olv = Module('olv (miiverse)', {
1009: ResultInfo('Console is permanently banned from Miiverse.', is_ban=True),
5004: ResultInfo('The Miiverse service has been discontinued.')
})
eshop_unk = Module('eShop (unknown)', {
9622: ResultInfo('Error when attempting to add funds. Check that the payment method is correct or try again later.')
})
fs = Module('fs', {
1031: ResultInfo(
'The disc could not be read or is unsupported (i.e. not a Wii or Wii U game). Try cleaning the disc or lens if it is a supported title.'),
2031: ResultInfo(
'The disc could not be read or is unsupported (i.e. not a Wii or Wii U game). Try cleaning the disc or lens if it is a supported title.'),
2021-04-04 10:08:26 +00:00
3032: ResultInfo('Error when attempting to read caused by a permission error.')
})
syserr = Module('system error', {
101: ResultInfo('Generic error. Can happen when formatting a console that has CBHC installed.'),
102: ResultInfo('Error in SLC/MLC or USB.'),
103: ResultInfo('The MLC system memory is corrupted.'),
104: ResultInfo('The SLC system memory is corrupted.'),
105: ResultInfo('The USB storage is corrupted.'),
})
unknown = Module('unknown/misc.', {
9999: ResultInfo(
'Usually indicates an invalid signature, ticket, or corrupted data. Typically happens when running an unsigned program without CFW/signature patches.')
2021-04-04 10:08:26 +00:00
})
# We have some modules partially documented, those that aren't have dummy Modules.
modules = {
101: fp,
102: act,
103: Module('ac (internet connection)'),
104: Module('boss(spotpass)'),
105: Module('nim (title installation'),
106: nex,
107: eshop_api,
111: eshop_web,
112: unknown2,
115: olv,
118: Module('pia (peer-to-peer)'),
124: Module('ec (e-commerce)'),
126: eshop_unk,
150: fs,
151: Module('kpad (wiimote)'),
155: Module('save'),
160: syserr,
165: Module('vpad (gamepad)'),
166: Module('aoc (dlc)'),
187: Module('nfp (amiibo)'),
199: unknown
}
# regex for Wii U result code format "1XX-YYYY"
RE = re.compile(r'1\d{2}-\d{4}')
CONSOLE_NAME = 'Nintendo Wii U'
# Suggested color to use if displaying information through a Discord bot's embed
COLOR = 0x009AC7
def is_valid(error):
return RE.match(error)
def construct_support(ret, mod, desc):
category = modules.get(mod, Module(''))
if category.name:
ret.add_field(ConsoleErrorField('Category', message_str=category.name))
else:
ret.add_field(ConsoleErrorField('Category', supplementary_value=mod))
summary = category.get_summary(desc)
if summary:
ret.add_field(ConsoleErrorField('Summary', message_str=summary))
description = category.get_error(desc)
if description is not None and description.description:
ret.add_field(ConsoleErrorField('Description', message_str=description.description))
if description.support_url:
ret.add_field(ConsoleErrorField('Further information', message_str=description.support_url))
if description.is_ban:
ret.add_field(BANNED_FIELD)
ret.color = WARNING_COLOR
else:
ret.add_field(UNKNOWN_CATEGORY_DESCRIPTION)
return ret
def get(error):
mod = int(error[:3])
desc = int(error[4:])
ret = ConsoleErrorInfo(error, CONSOLE_NAME, COLOR)
return construct_support(ret, mod, desc)