forked from Hay1tsme/artemis
add support for Maimai DX CN
This commit is contained in:
parent
31bb320ffd
commit
70e1de0c61
@ -1,6 +1,6 @@
|
||||
from core.config import CoreConfig
|
||||
from core.allnet import AllnetServlet, BillingServlet
|
||||
from core.aimedb import AimedbServlette
|
||||
from core.aimedb import AimedbServlet
|
||||
from core.title import TitleServlet
|
||||
from core.utils import Utils
|
||||
from core.mucha import MuchaServlet
|
||||
|
@ -29,6 +29,24 @@ class ADBStatus(Enum):
|
||||
LOCK_SYS = 9
|
||||
LOCK_USER = 10
|
||||
|
||||
class ChimeDBStatus(Enum):
|
||||
NONE = 0
|
||||
READER_SETUP_FAIL = 1
|
||||
READER_ACCESS_FAIL = 2
|
||||
READER_INCOMPATIBLE = 3
|
||||
DB_RESOLVE_FAIL = 4
|
||||
DB_ACCESS_TIMEOUT = 5
|
||||
DB_ACCESS_FAIL = 6
|
||||
AIME_ID_INVALID = 7
|
||||
NO_BOARD_INFO = 8
|
||||
LOCK_BAN_SYSTEM_USER = 9
|
||||
LOCK_BAN_SYSTEM = 10
|
||||
LOCK_BAN_USER = 11
|
||||
LOCK_BAN = 12
|
||||
LOCK_SYSTEM_USER = 13
|
||||
LOCK_SYSTEM = 14
|
||||
LOCK_USER = 15
|
||||
|
||||
class CompanyCodes(Enum):
|
||||
NONE = 0
|
||||
SEGA = 1
|
||||
|
@ -9,7 +9,7 @@ from core.utils import create_sega_auth_key
|
||||
from core.data import Data
|
||||
from .adb_handlers import *
|
||||
|
||||
class AimedbServlette():
|
||||
class AimedbServlet():
|
||||
request_list: Dict[int, Tuple[Callable[[bytes, int], Union[ADBBaseResponse, bytes]], int, str]] = {}
|
||||
def __init__(self, core_cfg: CoreConfig) -> None:
|
||||
self.config = core_cfg
|
||||
|
@ -136,9 +136,9 @@ class AllnetServlet:
|
||||
data = await request.body()
|
||||
|
||||
try:
|
||||
if is_dfi:
|
||||
try:
|
||||
req_urlencode = self.from_dfi(data)
|
||||
else:
|
||||
except:
|
||||
req_urlencode = data
|
||||
|
||||
req_dict = self.allnet_req_to_dict(req_urlencode)
|
||||
@ -179,6 +179,7 @@ class AllnetServlet:
|
||||
resp_dict = {k: v for k, v in vars(resp).items() if v is not None}
|
||||
return PlainTextResponse(urllib.parse.unquote(urllib.parse.urlencode(resp_dict)) + "\n")
|
||||
|
||||
|
||||
if machine is not None:
|
||||
arcade = await self.data.arcade.get_arcade(machine["arcade"])
|
||||
if self.config.server.check_arcade_ip:
|
||||
@ -260,6 +261,29 @@ class AllnetServlet:
|
||||
|
||||
self.logger.debug(f"Allnet response: {resp_str}")
|
||||
return PlainTextResponse(resp_str + "\n")
|
||||
elif self.config.allnet.enable_game_id_whitelist and req.game_id not in self.config.allnet.game_id_whitelist:
|
||||
if not self.config.server.is_develop:
|
||||
msg = f"disallowed game {req.game_id} attempted allnet auth from {request_ip}."
|
||||
await self.data.base.log_event(
|
||||
"allnet", "ALLNET_AUTH_DISALLOWED_GAME", logging.WARN, msg
|
||||
)
|
||||
self.logger.warning(msg)
|
||||
|
||||
resp.stat = ALLNET_STAT.bad_game.value
|
||||
resp_dict = {k: v for k, v in vars(resp).items() if v is not None}
|
||||
return PlainTextResponse(urllib.parse.unquote(urllib.parse.urlencode(resp_dict)) + "\n")
|
||||
else:
|
||||
self.logger.info(
|
||||
f"Allowed the disallowed game {req.game_id} v{req.ver} to authenticate from {request_ip} due to 'is_develop' being enabled. S/N: {req.serial}"
|
||||
)
|
||||
resp.uri = f"http://{self.config.server.hostname}:{self.config.server.port}/{req.game_id}/{req.ver.replace('.', '')}/"
|
||||
resp.host = f"{self.config.server.hostname}:{self.config.server.port}"
|
||||
|
||||
resp_dict = {k: v for k, v in vars(resp).items() if v is not None}
|
||||
resp_str = urllib.parse.unquote(urllib.parse.urlencode(resp_dict))
|
||||
|
||||
self.logger.debug(f"Allnet response: {resp_str}")
|
||||
return PlainTextResponse(resp_str + "\n")
|
||||
|
||||
|
||||
int_ver = req.ver.replace(".", "")
|
||||
@ -296,9 +320,9 @@ class AllnetServlet:
|
||||
data = await request.body()
|
||||
|
||||
try:
|
||||
if is_dfi:
|
||||
try:
|
||||
req_urlencode = self.from_dfi(data)
|
||||
else:
|
||||
except:
|
||||
req_urlencode = data.decode()
|
||||
|
||||
req_dict = self.allnet_req_to_dict(req_urlencode)
|
||||
|
@ -9,7 +9,7 @@ from starlette.responses import PlainTextResponse
|
||||
from os import environ, path, mkdir, W_OK, access
|
||||
from typing import List
|
||||
|
||||
from core import CoreConfig, TitleServlet, MuchaServlet, AllnetServlet, BillingServlet, AimedbServlette
|
||||
from core import CoreConfig, TitleServlet, MuchaServlet, AllnetServlet, BillingServlet, AimedbServlet
|
||||
from core.chimedb import ChimeServlet
|
||||
from core.frontend import FrontendServlet
|
||||
|
||||
|
@ -8,6 +8,7 @@ import coloredlogs
|
||||
from starlette.responses import PlainTextResponse
|
||||
from twisted.web.http import Request
|
||||
|
||||
from core.adb_handlers.base import ChimeDBStatus
|
||||
from core.config import CoreConfig
|
||||
from core.data import Data
|
||||
|
||||
@ -61,7 +62,7 @@ class ChimeServlet:
|
||||
userId = await self._lookup(access_code)
|
||||
data = json.dumps({
|
||||
"userID": userId,
|
||||
"errorID": 0,
|
||||
"errorID": await self._lookup_user_status(access_code),
|
||||
"timestamp": timestamp,
|
||||
"key": self._hash_key(userId, timestamp)
|
||||
})
|
||||
@ -71,7 +72,7 @@ class ChimeServlet:
|
||||
|
||||
data = json.dumps({
|
||||
"userID": -1,
|
||||
"errorID": 1,
|
||||
"errorID": ChimeDBStatus.DB_ACCESS_FAIL,
|
||||
"timestamp": timestamp,
|
||||
"key": self._hash_key(-1, timestamp)
|
||||
})
|
||||
@ -98,6 +99,17 @@ class ChimeServlet:
|
||||
|
||||
return user_id
|
||||
|
||||
async def _lookup_user_status(self, access_code):
|
||||
is_banned = await self.data.card.get_card_banned(access_code)
|
||||
is_locked = await self.data.card.get_card_locked(access_code)
|
||||
|
||||
if is_banned and is_locked:
|
||||
return ChimeDBStatus.LOCK_BAN_SYSTEM_USER
|
||||
elif is_banned:
|
||||
return ChimeDBStatus.LOCK_BAN_SYSTEM
|
||||
elif is_locked:
|
||||
return ChimeDBStatus.LOCK_USER
|
||||
|
||||
async def _register(self, access_code):
|
||||
user_id = -1
|
||||
|
||||
|
@ -262,6 +262,24 @@ class AllnetConfig:
|
||||
self.__config, "core", "allnet", "allow_online_updates", default=False
|
||||
)
|
||||
|
||||
@property
|
||||
def enable_game_id_whitelist(self) -> int:
|
||||
return CoreConfig.get_config_field(
|
||||
self.__config, "core", "allnet", "enable_game_id_whitelist", default=False
|
||||
)
|
||||
|
||||
@property
|
||||
def game_id_whitelist(self) -> list[str]:
|
||||
"""
|
||||
in the form of:
|
||||
internal_version: [key, iv, salt]
|
||||
key and iv are hex strings
|
||||
salt is a normal UTF-8 string
|
||||
"""
|
||||
return CoreConfig.get_config_field(
|
||||
self.__config, "core", "allnet", "game_id_whitelist", default=[]
|
||||
)
|
||||
|
||||
@property
|
||||
def update_cfg_folder(self) -> str:
|
||||
return CoreConfig.get_config_field(
|
||||
|
@ -22,7 +22,7 @@ title:
|
||||
|
||||
database:
|
||||
host: "localhost"
|
||||
username: "aime"
|
||||
username: "root"
|
||||
password: "aime"
|
||||
name: "aime"
|
||||
port: 3306
|
||||
@ -44,6 +44,9 @@ allnet:
|
||||
loglevel: "info"
|
||||
allow_online_updates: False
|
||||
update_cfg_folder: ""
|
||||
enable_game_id_whitelist: False
|
||||
game_id_whitelist:
|
||||
- ""
|
||||
|
||||
billing:
|
||||
standalone: True
|
||||
|
4
index.py
4
index.py
@ -6,7 +6,7 @@ import uvicorn
|
||||
import logging
|
||||
import asyncio
|
||||
|
||||
from core import CoreConfig, AimedbServlette
|
||||
from core import CoreConfig, AimedbServlet
|
||||
|
||||
async def launch_main(cfg: CoreConfig, ssl: bool) -> None:
|
||||
if ssl:
|
||||
@ -79,7 +79,7 @@ async def launcher(cfg: CoreConfig, ssl: bool) -> None:
|
||||
if cfg.allnet.standalone:
|
||||
task_list.append(asyncio.create_task(launch_allnet(cfg)))
|
||||
if cfg.aimedb.enable:
|
||||
AimedbServlette(cfg).start()
|
||||
AimedbServlet(cfg).start()
|
||||
|
||||
done, pending = await asyncio.wait(
|
||||
task_list,
|
||||
|
@ -17,7 +17,15 @@ class Mai2Buddies(Mai2FestivalPlus):
|
||||
# hardcode lastDataVersion for CardMaker
|
||||
user_data["lastDataVersion"] = "1.40.00"
|
||||
return user_data
|
||||
|
||||
|
||||
async def handle_get_game_ng_word_list_api_request(self, data: Dict) -> Dict:
|
||||
return {
|
||||
"ngWordExactMatchLength":0,
|
||||
"ngWordExactMatchList":[],
|
||||
"ngWordPartialMatchLength":0,
|
||||
"ngWordPartialMatchList":[]
|
||||
}
|
||||
|
||||
async def handle_get_user_new_item_api_request(self, data: Dict) -> Dict:
|
||||
# TODO: Added in 1.41, implement this?
|
||||
user_id = data["userId"]
|
||||
|
@ -56,14 +56,30 @@ class Mai2DX(Mai2Base):
|
||||
"requestInterval": 1800,
|
||||
"rebootStartTime": reboot_start,
|
||||
"rebootEndTime": reboot_end,
|
||||
"rebootInterval": 0,
|
||||
"movieUploadLimit": 100,
|
||||
"movieStatus": 1,
|
||||
"movieStatus": 1 if self.game_config.uploads.movies else 0,
|
||||
"movieServerUri": "",
|
||||
"deliverServerUri": "",
|
||||
"oldServerUri": self.old_server,
|
||||
"usbDlServerUri": "",
|
||||
"rebootInterval": 0,
|
||||
},
|
||||
"maxCountRivalMusic": 100,
|
||||
"replicationDelayLimit": 10,
|
||||
"exclusionStartTime": "00:00:00",
|
||||
"exclusionEndTime": "00:00:00",
|
||||
"pingDisable": True,
|
||||
"packetTimeout": 20000,
|
||||
"packetTimeoutLong": 60000,
|
||||
"packetRetryCount": 10,
|
||||
"userDataDlErrTimeout": 300000,
|
||||
"userDataDlErrRetryCount": 1000,
|
||||
"userDataDlErrSamePacketRetryCount": 1000,
|
||||
"userDataUpSkipTimeout": 0,
|
||||
"userDataUpSkipRetryCount": 0,
|
||||
"iconPhotoDisable": not self.game_config.uploads.photos,
|
||||
"uploadPhotoDisable": not self.game_config.uploads.photos,
|
||||
"maxCountMusic": 0,
|
||||
"maxCountItem": 0},
|
||||
"isAouAccession": False,
|
||||
}
|
||||
|
||||
|
@ -321,8 +321,12 @@ class Mai2Servlet(BaseServlet):
|
||||
elif version >= 135 and version < 140: # FESTiVAL PLUS
|
||||
internal_ver = Mai2Constants.VER_MAIMAI_DX_FESTIVAL_PLUS
|
||||
elif game_code == "SDGB": # CN
|
||||
if version < 130: # Maimai DX CN 2023 (FESTiVAL)
|
||||
internal_ver = Mai2Constants.VER_MAIMAI_DX
|
||||
if 130 <= version < 135: # Maimai DX CN 2023 (FESTiVAL)
|
||||
internal_ver = Mai2Constants.VER_MAIMAI_DX_FESTIVAL
|
||||
if 140 <= version < 145: # Maimai DX CN 2023 (FESTiVAL)
|
||||
internal_ver = Mai2Constants.VER_MAIMAI_DX_BUDDIES
|
||||
|
||||
try:
|
||||
unzip = zlib.decompress(req_raw)
|
||||
|
Loading…
Reference in New Issue
Block a user