mirror of
https://gitea.tendokyu.moe/Hay1tsme/artemis.git
synced 2026-02-15 04:07:29 +08:00
begin move
This commit is contained in:
@@ -20,21 +20,21 @@ class PokkenBase:
|
||||
self.data = PokkenData(core_cfg)
|
||||
self.SUPPORT_SET_NONE = 4294967295
|
||||
|
||||
def handle_noop(self, request: Any) -> bytes:
|
||||
async def handle_noop(self, request: Any) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = request.type
|
||||
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_ping(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_ping(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.PING
|
||||
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_register_pcb(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_register_pcb(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.REGISTER_PCB
|
||||
@@ -61,35 +61,35 @@ class PokkenBase:
|
||||
"logfilename": "JackalMatchingLibrary.log",
|
||||
"biwalogfilename": "./biwa.log",
|
||||
}
|
||||
regist_pcb.bnp_baseuri = f"{self.core_cfg.title.hostname}/bna"
|
||||
regist_pcb.bnp_baseuri = f"{self.core_cfg.server.hostname}/bna"
|
||||
regist_pcb.biwa_setting = json.dumps(biwa_setting)
|
||||
|
||||
res.register_pcb.CopyFrom(regist_pcb)
|
||||
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_save_ads(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_save_ads(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.SAVE_ADS
|
||||
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_save_client_log(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_save_client_log(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.SAVE_CLIENT_LOG
|
||||
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_check_diagnosis(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_check_diagnosis(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.CHECK_DIAGNOSIS
|
||||
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_load_client_settings(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_load_client_settings(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.LOAD_CLIENT_SETTINGS
|
||||
@@ -112,7 +112,7 @@ class PokkenBase:
|
||||
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_load_ranking(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_load_ranking(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.LOAD_RANKING
|
||||
@@ -126,7 +126,7 @@ class PokkenBase:
|
||||
res.load_ranking.CopyFrom(ranking)
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_load_user(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_load_user(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.LOAD_USER
|
||||
@@ -287,13 +287,13 @@ class PokkenBase:
|
||||
res.load_user.CopyFrom(load_usr)
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_set_bnpassid_lock(self, data: jackal_pb2.Request) -> bytes:
|
||||
async def handle_set_bnpassid_lock(self, data: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.SET_BNPASSID_LOCK
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_save_user(self, request: jackal_pb2.Request) -> bytes:
|
||||
async def handle_save_user(self, request: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.SAVE_USER
|
||||
@@ -394,38 +394,31 @@ class PokkenBase:
|
||||
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_save_ingame_log(self, data: jackal_pb2.Request) -> bytes:
|
||||
async def handle_save_ingame_log(self, data: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.SAVE_INGAME_LOG
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_save_charge(self, data: jackal_pb2.Request) -> bytes:
|
||||
async def handle_save_charge(self, data: jackal_pb2.Request) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.SAVE_CHARGE
|
||||
return res.SerializeToString()
|
||||
|
||||
def handle_matching_noop(
|
||||
async def handle_matching_noop(
|
||||
self, data: Dict = {}, client_ip: str = "127.0.0.1"
|
||||
) -> Dict:
|
||||
return {}
|
||||
|
||||
def handle_matching_start_matching(
|
||||
async def handle_matching_start_matching(
|
||||
self, data: Dict = {}, client_ip: str = "127.0.0.1"
|
||||
) -> Dict:
|
||||
return {}
|
||||
|
||||
def handle_matching_is_matching(
|
||||
async def handle_matching_is_matching(
|
||||
self, data: Dict = {}, client_ip: str = "127.0.0.1"
|
||||
) -> Dict:
|
||||
"""
|
||||
"sessionId":"12345678",
|
||||
"A":{
|
||||
"pcb_id": data["data"]["must"]["pcb_id"],
|
||||
"gip": client_ip
|
||||
},
|
||||
"""
|
||||
return {
|
||||
"data": {
|
||||
"sessionId":"12345678",
|
||||
@@ -437,15 +430,15 @@ class PokkenBase:
|
||||
}
|
||||
}
|
||||
|
||||
def handle_matching_stop_matching(
|
||||
async def handle_matching_stop_matching(
|
||||
self, data: Dict = {}, client_ip: str = "127.0.0.1"
|
||||
) -> Dict:
|
||||
return {}
|
||||
|
||||
def handle_admission_noop(self, data: Dict, req_ip: str = "127.0.0.1") -> Dict:
|
||||
async def handle_admission_noop(self, data: Dict, req_ip: str = "127.0.0.1") -> Dict:
|
||||
return {}
|
||||
|
||||
def handle_admission_joinsession(self, data: Dict, req_ip: str = "127.0.0.1") -> Dict:
|
||||
async def handle_admission_joinsession(self, data: Dict, req_ip: str = "127.0.0.1") -> Dict:
|
||||
self.logger.info(f"Admission: JoinSession from {req_ip}")
|
||||
return {
|
||||
'data': {
|
||||
|
||||
@@ -3,6 +3,7 @@ from enum import Enum
|
||||
|
||||
class PokkenConstants:
|
||||
GAME_CODE = "SDAK"
|
||||
GAME_CDS = ["PKF1"]
|
||||
|
||||
CONFIG_NAME = "pokken.yaml"
|
||||
|
||||
@@ -10,6 +11,12 @@ class PokkenConstants:
|
||||
|
||||
VERSION_NAMES = "Pokken Tournament"
|
||||
|
||||
SERIAL_IDENT = [2747]
|
||||
NETID_PREFIX = ["ABGN"]
|
||||
SERIAL_REGIONS = [1]
|
||||
SERIAL_ROLES = [3]
|
||||
SERIAL_CAB_IDENTS = [19]
|
||||
|
||||
class BATTLE_TYPE(Enum):
|
||||
TUTORIAL = 1
|
||||
AI = 2
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import yaml
|
||||
import jinja2
|
||||
from twisted.web.http import Request
|
||||
from starlette.requests import Request
|
||||
from os import path
|
||||
from twisted.web.server import Session
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
from typing import Tuple, List, Dict
|
||||
from twisted.web.http import Request
|
||||
from twisted.web import resource
|
||||
from twisted.internet import reactor
|
||||
import json, ast
|
||||
from starlette.requests import Request
|
||||
from starlette.requests import Request
|
||||
from starlette.responses import Response, JSONResponse
|
||||
from starlette.routing import Route, WebSocketRoute
|
||||
from starlette.websockets import WebSocket, WebSocketState, WebSocketDisconnect
|
||||
import ast
|
||||
from datetime import datetime
|
||||
import yaml
|
||||
import logging, coloredlogs
|
||||
@@ -17,8 +19,6 @@ from .config import PokkenConfig
|
||||
from .base import PokkenBase
|
||||
from .const import PokkenConstants
|
||||
from .proto import jackal_pb2
|
||||
from .services import PokkenAdmissionFactory
|
||||
|
||||
|
||||
class PokkenServlet(BaseServlet):
|
||||
def __init__(self, core_cfg: CoreConfig, cfg_dir: str) -> None:
|
||||
@@ -69,47 +69,73 @@ class PokkenServlet(BaseServlet):
|
||||
|
||||
return True
|
||||
|
||||
def get_endpoint_matchers(self) -> Tuple[List[Tuple[str, str, Dict]], List[Tuple[str, str, Dict]]]:
|
||||
return (
|
||||
[],
|
||||
[
|
||||
("render_POST", "/pokken/", {}),
|
||||
("handle_matching", "/pokken/matching", {}),
|
||||
]
|
||||
)
|
||||
def get_routes(self) -> List[Route]:
|
||||
return [
|
||||
Route("/pokken/", self.render_POST, methods=['POST']),
|
||||
Route("/pokken/matching", self.handle_matching, methods=['POST']),
|
||||
WebSocketRoute("/pokken/admission", self.handle_admission)
|
||||
]
|
||||
|
||||
def get_allnet_info(self, game_code: str, game_ver: int, keychip: str) -> Tuple[str, str]:
|
||||
if self.game_cfg.ports.game != 443:
|
||||
return (
|
||||
f"https://{self.game_cfg.server.hostname}:{self.game_cfg.ports.game}/pokken/",
|
||||
f"{self.game_cfg.server.hostname}/pokken/",
|
||||
)
|
||||
return (
|
||||
f"https://{self.game_cfg.server.hostname}/pokken/",
|
||||
f"{self.game_cfg.server.hostname}/pokken/",
|
||||
f"https://{self.game_cfg.server.hostname}:{self.game_cfg.ports.game}/pokken/",
|
||||
f"{self.game_cfg.server.hostname}:{self.game_cfg.ports.game}/pokken/",
|
||||
)
|
||||
|
||||
def get_mucha_info(self, core_cfg: CoreConfig, cfg_dir: str) -> Tuple[bool, str]:
|
||||
game_cfg = PokkenConfig()
|
||||
if not self.game_cfg.server.enable:
|
||||
return (False, [], [])
|
||||
|
||||
if path.exists(f"{cfg_dir}/{PokkenConstants.CONFIG_NAME}"):
|
||||
game_cfg.update(
|
||||
yaml.safe_load(open(f"{cfg_dir}/{PokkenConstants.CONFIG_NAME}"))
|
||||
)
|
||||
return (True, PokkenConstants.GAME_CDS, PokkenConstants.NETID_PREFIX)
|
||||
|
||||
async def handle_admission(self, ws: WebSocket) -> None:
|
||||
client_ip = Utils.get_ip_addr(ws)
|
||||
await ws.accept()
|
||||
while True:
|
||||
try:
|
||||
msg: Dict = await ws.receive_json()
|
||||
except WebSocketDisconnect as e:
|
||||
self.logger.debug(f"Client {client_ip} disconnected - {e}")
|
||||
break
|
||||
except Exception as e:
|
||||
self.logger.error(f"Could not load JSON from message from {client_ip} - {e}")
|
||||
if ws.client_state != WebSocketState.DISCONNECTED:
|
||||
await ws.close()
|
||||
break
|
||||
|
||||
self.logger.debug(f"Admission: Message from {client_ip}:{ws.client.port} - {msg}")
|
||||
|
||||
api = msg.get("api", "noop")
|
||||
handler = getattr(self.base, f"handle_admission_{api.lower()}")
|
||||
resp = await handler(msg, client_ip)
|
||||
|
||||
if resp is None:
|
||||
resp = {}
|
||||
|
||||
if not game_cfg.server.enable:
|
||||
return (False, "")
|
||||
if "type" not in resp:
|
||||
resp['type'] = "res"
|
||||
if "data" not in resp:
|
||||
resp['data'] = {}
|
||||
if "api" not in resp:
|
||||
resp['api'] = api
|
||||
if "result" not in resp:
|
||||
resp['result'] = 'true'
|
||||
|
||||
self.logger.debug(f"Websocket response: {resp}")
|
||||
try:
|
||||
await ws.send_json(resp)
|
||||
except WebSocketDisconnect as e:
|
||||
self.logger.debug(f"Client {client_ip} disconnected - {e}")
|
||||
break
|
||||
except Exception as e:
|
||||
self.logger.error(f"Could not send JSON message to {client_ip} - {e}")
|
||||
break
|
||||
|
||||
if ws.client_state != WebSocketState.DISCONNECTED:
|
||||
await ws.close()
|
||||
|
||||
return (True, "PKF1")
|
||||
|
||||
def setup(self) -> None:
|
||||
if self.game_cfg.server.enable_matching:
|
||||
reactor.listenTCP(
|
||||
self.game_cfg.ports.admission, PokkenAdmissionFactory(self.core_cfg, self.game_cfg)
|
||||
)
|
||||
|
||||
def render_POST(self, request: Request, game_code: str, matchers: Dict) -> bytes:
|
||||
content = request.content.getvalue()
|
||||
async def render_POST(self, request: Request) -> bytes:
|
||||
content = await request.body()
|
||||
if content == b"":
|
||||
self.logger.info("Empty request")
|
||||
return b""
|
||||
@@ -134,19 +160,19 @@ class PokkenServlet(BaseServlet):
|
||||
|
||||
self.logger.info(f"{endpoint} request from {Utils.get_ip_addr(request)}")
|
||||
|
||||
ret = handler(pokken_request)
|
||||
return ret
|
||||
ret = await handler(pokken_request)
|
||||
return Response(ret)
|
||||
|
||||
def handle_matching(self, request: Request, game_code: str, matchers: Dict) -> bytes:
|
||||
async def handle_matching(self, request: Request) -> bytes:
|
||||
if not self.game_cfg.server.enable_matching:
|
||||
return b""
|
||||
return Response()
|
||||
|
||||
content = request.content.getvalue()
|
||||
content = await request.body()
|
||||
client_ip = Utils.get_ip_addr(request)
|
||||
|
||||
if content is None or content == b"":
|
||||
self.logger.info("Empty matching request")
|
||||
return json.dumps(self.base.handle_matching_noop()).encode()
|
||||
return JSONResponse(self.base.handle_matching_noop())
|
||||
|
||||
json_content = ast.literal_eval(
|
||||
content.decode()
|
||||
@@ -166,7 +192,7 @@ class PokkenServlet(BaseServlet):
|
||||
self.logger.warning(
|
||||
f"No handler found for message type {json_content['call']}"
|
||||
)
|
||||
return json.dumps(self.base.handle_matching_noop()).encode()
|
||||
return JSONResponse(self.base.handle_matching_noop())
|
||||
|
||||
ret = handler(json_content, client_ip)
|
||||
|
||||
@@ -181,4 +207,4 @@ class PokkenServlet(BaseServlet):
|
||||
|
||||
self.logger.debug(f"Response {ret}")
|
||||
|
||||
return json.dumps(ret).encode()
|
||||
return JSONResponse(ret)
|
||||
|
||||
Reference in New Issue
Block a user