pokken support
This commit is contained in:
1 parent
9ee155792e
commit
abb25aa328
7 files changed
+390
No files matched your search
@@ -0,0 +1,9 @@
|
||||
server:
|
||||
enable: True
|
||||
loglevel: "info"
|
||||
hostname: "localhost"
|
||||
ssl_enable: False
|
||||
port: 9000
|
||||
port_matching: 9001
|
||||
ssl_cert: cert/pokken.crt
|
||||
ssl_key: cert/pokken.key
|
||||
@@ -0,0 +1,17 @@
|
||||
from titles.pokken.index import PokkenServlet
|
||||
from titles.pokken.const import PokkenConstants
|
||||
|
||||
index = PokkenServlet
|
||||
|
||||
use_default_title = True
|
||||
include_protocol = True
|
||||
title_secure = True
|
||||
game_codes = [PokkenConstants.GAME_CODE]
|
||||
trailing_slash = True
|
||||
use_default_host = False
|
||||
|
||||
include_port = True
|
||||
uri="https://$h:$p/"
|
||||
host="$h:$p/"
|
||||
|
||||
current_schema_version = 1
|
||||
@@ -0,0 +1,103 @@
|
||||
from datetime import datetime, timedelta
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.pokken.config import PokkenConfig
|
||||
from titles.pokken.proto import jackal_pb2
|
||||
|
||||
class PokkenBase():
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: PokkenConfig) -> None:
|
||||
self.core_cfg = core_cfg
|
||||
self.game_cfg = game_cfg
|
||||
self.version = 0
|
||||
|
||||
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.PingRequestData) -> 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.RegisterPcbRequestData) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.REGISTER_PCB
|
||||
|
||||
regist_pcb = jackal_pb2.RegisterPcbResponseData()
|
||||
regist_pcb.server_time = int(datetime.now().timestamp() / 1000)
|
||||
biwa_setting = {
|
||||
"MatchingServer": {
|
||||
"host": f"https://{self.core_cfg.title.hostname}",
|
||||
"port": 9000,
|
||||
"url": "/matching"
|
||||
},
|
||||
"StunServer": {
|
||||
"addr": self.core_cfg.title.hostname,
|
||||
"port": 3333
|
||||
},
|
||||
"TurnServer": {
|
||||
"addr": self.core_cfg.title.hostname,
|
||||
"port": 4444
|
||||
},
|
||||
"AdmissionUrl": f"ws://{self.core_cfg.title.hostname}:1111",
|
||||
"locationId": 123,
|
||||
"logfilename": "JackalMatchingLibrary.log",
|
||||
"biwalogfilename": "./biwa.log"
|
||||
}
|
||||
regist_pcb.bnp_baseuri = f"{self.core_cfg.title.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.SaveAdsRequestData) -> 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.SaveClientLogRequestData) -> 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.CheckDiagnosisRequestData) -> 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.CheckDiagnosisRequestData) -> bytes:
|
||||
res = jackal_pb2.Response()
|
||||
res.result = 1
|
||||
res.type = jackal_pb2.MessageType.LOAD_CLIENT_SETTINGS
|
||||
settings = jackal_pb2.LoadClientSettingsResponseData()
|
||||
|
||||
settings.money_magnification = 0
|
||||
settings.continue_bonus_exp = 100
|
||||
settings.continue_fight_money = 100
|
||||
settings.event_bonus_exp = 100
|
||||
settings.level_cap = 999
|
||||
settings.op_movie_flag = 0xFFFFFFFF
|
||||
settings.lucky_bonus_rate = 1
|
||||
settings.fail_support_num = 10
|
||||
settings.chara_open_flag = 0xFFFFFFFF
|
||||
settings.chara_open_date = int(datetime.now().timestamp() / 1000)
|
||||
settings.chara_pre_open_date = int(datetime.now().timestamp() / 1000)
|
||||
settings.search_id = 123
|
||||
res.load_client_settings.CopyFrom(settings)
|
||||
|
||||
return res.SerializeToString()
|
||||
@@ -0,0 +1,37 @@
|
||||
from core.config import CoreConfig
|
||||
|
||||
class PokkenServerConfig():
|
||||
def __init__(self, parent_config: "PokkenConfig"):
|
||||
self.__config = parent_config
|
||||
|
||||
@property
|
||||
def enable(self) -> bool:
|
||||
return CoreConfig.get_config_field(self.__config, 'pokken', 'server', 'enable', default=True)
|
||||
|
||||
@property
|
||||
def loglevel(self) -> int:
|
||||
return CoreConfig.str_to_loglevel(CoreConfig.get_config_field(self.__config, 'pokken', 'server', 'loglevel', default="info"))
|
||||
|
||||
@property
|
||||
def hostname(self) -> str:
|
||||
return CoreConfig.get_config_field(self.__config, 'pokken', 'server', 'hostname', default="localhost")
|
||||
|
||||
@property
|
||||
def port(self) -> int:
|
||||
return CoreConfig.get_config_field(self.__config, 'pokken', 'server', 'port', default=9000)
|
||||
|
||||
@property
|
||||
def port_matching(self) -> int:
|
||||
return CoreConfig.get_config_field(self.__config, 'pokken', 'server', 'port', default=9001)
|
||||
|
||||
@property
|
||||
def ssl_cert(self) -> str:
|
||||
return CoreConfig.get_config_field(self.__config, 'pokken', 'server', 'ssl_cert', default="cert/pokken.crt")
|
||||
|
||||
@property
|
||||
def ssl_key(self) -> str:
|
||||
return CoreConfig.get_config_field(self.__config, 'pokken', 'server', 'ssl_key', default="cert/pokken.key")
|
||||
|
||||
class PokkenConfig(dict):
|
||||
def __init__(self) -> None:
|
||||
self.server = PokkenServerConfig(self)
|
||||
@@ -0,0 +1,12 @@
|
||||
class PokkenConstants():
|
||||
GAME_CODE = "SDAK"
|
||||
|
||||
CONFIG_NAME = "pokken.yaml"
|
||||
|
||||
VER_POKKEN = 0
|
||||
|
||||
VERSION_NAMES = ("Pokken Tournament")
|
||||
|
||||
@classmethod
|
||||
def game_ver_to_string(cls, ver: int):
|
||||
return cls.VERSION_NAMES[ver]
|
||||
@@ -0,0 +1,73 @@
|
||||
from twisted.web.http import Request
|
||||
from twisted.web import resource, server
|
||||
from twisted.internet import reactor, endpoints
|
||||
import yaml
|
||||
import logging, coloredlogs
|
||||
from logging.handlers import TimedRotatingFileHandler
|
||||
from titles.pokken.proto import jackal_pb2
|
||||
from google.protobuf import text_format
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.pokken.config import PokkenConfig
|
||||
from titles.pokken.base import PokkenBase
|
||||
|
||||
class PokkenServlet(resource.Resource):
|
||||
def __init__(self, core_cfg: CoreConfig, cfg_dir: str) -> None:
|
||||
self.isLeaf = True
|
||||
self.core_cfg = core_cfg
|
||||
self.config_dir = cfg_dir
|
||||
self.game_cfg = PokkenConfig()
|
||||
self.game_cfg.update(yaml.safe_load(open(f"{cfg_dir}/pokken.yaml")))
|
||||
|
||||
self.logger = logging.getLogger("pokken")
|
||||
if not hasattr(self.logger, "inited"):
|
||||
log_fmt_str = "[%(asctime)s] Pokken | %(levelname)s | %(message)s"
|
||||
log_fmt = logging.Formatter(log_fmt_str)
|
||||
fileHandler = TimedRotatingFileHandler("{0}/{1}.log".format(self.core_cfg.server.log_dir, "pokken"), encoding='utf8',
|
||||
when="d", backupCount=10)
|
||||
|
||||
fileHandler.setFormatter(log_fmt)
|
||||
|
||||
consoleHandler = logging.StreamHandler()
|
||||
consoleHandler.setFormatter(log_fmt)
|
||||
|
||||
self.logger.addHandler(fileHandler)
|
||||
self.logger.addHandler(consoleHandler)
|
||||
|
||||
self.logger.setLevel(self.game_cfg.server.loglevel)
|
||||
coloredlogs.install(level=self.game_cfg.server.loglevel, logger=self.logger, fmt=log_fmt_str)
|
||||
self.logger.inited = True
|
||||
|
||||
self.base = PokkenBase(core_cfg, self.game_cfg)
|
||||
|
||||
def setup(self):
|
||||
if self.game_cfg.server.enable:
|
||||
if self.core_cfg.server.is_develop:
|
||||
endpoints.serverFromString(reactor, f"ssl:{self.game_cfg.server.port}"\
|
||||
f":interface={self.game_cfg.server.hostname}:privateKey={self.game_cfg.server.ssl_key}:"\
|
||||
f"certKey={self.game_cfg.server.ssl_cert}")\
|
||||
.listen(server.Site(PokkenServlet(self.core_cfg, self.config_dir)))
|
||||
|
||||
else:
|
||||
endpoints.serverFromString(reactor, f"tcp:{self.game_cfg.server.port}"\
|
||||
f":interface={self.game_cfg.server.hostname}")\
|
||||
.listen(server.Site(PokkenServlet(self.core_cfg, self.config_dir)))
|
||||
|
||||
self.logger.info(f"Pokken title server ready on port {self.game_cfg.server.port}")
|
||||
|
||||
def render_POST(self, request: Request, version: int, endpoints: str) -> bytes:
|
||||
req_url = request.uri.decode()
|
||||
if req_url == "/matching":
|
||||
self.logger.info("Matching request")
|
||||
|
||||
pokken_request = jackal_pb2.Request()
|
||||
pokken_request.ParseFromString(request.content.getvalue())
|
||||
endpoint = jackal_pb2.MessageType(pokken_request.type).name.lower()
|
||||
|
||||
self.logger.info(f"{endpoint} request")
|
||||
|
||||
handler = getattr(self.base, f"handle_{endpoint}", None)
|
||||
if handler is None:
|
||||
self.logger.warn(f"No handler found for message type {endpoint}")
|
||||
return self.base.handle_noop(pokken_request)
|
||||
return handler(pokken_request)
|
||||
@@ -0,0 +1,139 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: jackal.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cjackal.proto\x12\x0fjackal.protobuf\"\xae\x0b\n\x07Request\x12*\n\x04type\x18\x01 \x02(\x0e\x32\x1c.jackal.protobuf.MessageType\x12.\n\x04noop\x18\x02 \x01(\x0b\x32 .jackal.protobuf.NoopRequestData\x12.\n\x04ping\x18\x03 \x01(\x0b\x32 .jackal.protobuf.PingRequestData\x12=\n\x0cregister_pcb\x18\x04 \x01(\x0b\x32\'.jackal.protobuf.RegisterPcbRequestData\x12\x35\n\x08save_ads\x18\x05 \x01(\x0b\x32#.jackal.protobuf.SaveAdsRequestDataLine truncated
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'jackal_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
_MESSAGETYPE._serialized_start=14623
|
||||
_MESSAGETYPE._serialized_end=15057
|
||||
_REQUEST._serialized_start=34
|
||||
_REQUEST._serialized_end=1488
|
||||
_RESPONSE._serialized_start=1491
|
||||
_RESPONSE._serialized_end=2983
|
||||
_NOOPREQUESTDATA._serialized_start=2985
|
||||
_NOOPREQUESTDATA._serialized_end=3034
|
||||
_NOOPRESPONSEDATA._serialized_start=3036
|
||||
_NOOPRESPONSEDATA._serialized_end=3054
|
||||
_PINGREQUESTDATA._serialized_start=3056
|
||||
_PINGREQUESTDATA._serialized_end=3105
|
||||
_PINGRESPONSEDATA._serialized_start=3107
|
||||
_PINGRESPONSEDATA._serialized_end=3125
|
||||
_REGISTERPCBREQUESTDATA._serialized_start=3128
|
||||
_REGISTERPCBREQUESTDATA._serialized_end=3462
|
||||
_REGISTERPCBRESPONSEDATA._serialized_start=3465
|
||||
_REGISTERPCBRESPONSEDATA._serialized_end=3598
|
||||
_SAVEADSREQUESTDATA._serialized_start=3601
|
||||
_SAVEADSREQUESTDATA._serialized_end=3944
|
||||
_SAVEADSREQUESTDATA_ADSPLAYTIME._serialized_start=3887
|
||||
_SAVEADSREQUESTDATA_ADSPLAYTIME._serialized_end=3944
|
||||
_SAVEADSRESPONSEDATA._serialized_start=3946
|
||||
_SAVEADSRESPONSEDATA._serialized_end=3967
|
||||
_CHECKACCESSCODEREQUESTDATA._serialized_start=3969
|
||||
_CHECKACCESSCODEREQUESTDATA._serialized_end=4046
|
||||
_CHECKACCESSCODERESPONSEDATA._serialized_start=4048
|
||||
_CHECKACCESSCODERESPONSEDATA._serialized_end=4125
|
||||
_SETBNPASSIDLOCKREQUESTDATA._serialized_start=4128
|
||||
_SETBNPASSIDLOCKREQUESTDATA._serialized_end=4292
|
||||
_SETBNPASSIDLOCKRESPONSEDATA._serialized_start=4294
|
||||
_SETBNPASSIDLOCKRESPONSEDATA._serialized_end=4323
|
||||
_LOADUSERREQUESTDATA._serialized_start=4326
|
||||
_LOADUSERREQUESTDATA._serialized_end=4459
|
||||
_LOADUSERRESPONSEDATA._serialized_start=4462
|
||||
_LOADUSERRESPONSEDATA._serialized_end=6890
|
||||
_LOADUSERRESPONSEDATA_POKEMONDATA._serialized_start=6522
|
||||
_LOADUSERRESPONSEDATA_POKEMONDATA._serialized_end=6890
|
||||
_SAVEUSERREQUESTDATA._serialized_start=6893
|
||||
_SAVEUSERREQUESTDATA._serialized_end=8453
|
||||
_SAVEUSERREQUESTDATA_BATTLEDATA._serialized_start=7948
|
||||
_SAVEUSERREQUESTDATA_BATTLEDATA._serialized_end=8184
|
||||
_SAVEUSERREQUESTDATA_POKEMONDATA._serialized_start=8187
|
||||
_SAVEUSERREQUESTDATA_POKEMONDATA._serialized_end=8366
|
||||
_SAVEUSERREQUESTDATA_REWARDDATA._serialized_start=8368
|
||||
_SAVEUSERREQUESTDATA_REWARDDATA._serialized_end=8453
|
||||
_SAVEUSERRESPONSEDATA._serialized_start=8455
|
||||
_SAVEUSERRESPONSEDATA._serialized_end=8477
|
||||
_CHECKDIAGNOSISREQUESTDATA._serialized_start=8479
|
||||
_CHECKDIAGNOSISREQUESTDATA._serialized_end=8538
|
||||
_CHECKDIAGNOSISRESPONSEDATA._serialized_start=8541
|
||||
_CHECKDIAGNOSISRESPONSEDATA._serialized_end=8818
|
||||
_CHECKDIAGNOSISRESPONSEDATA_DIAGNOSISDATA._serialized_start=8655
|
||||
_CHECKDIAGNOSISRESPONSEDATA_DIAGNOSISDATA._serialized_end=8818
|
||||
_SAVECLIENTLOGREQUESTDATA._serialized_start=8821
|
||||
_SAVECLIENTLOGREQUESTDATA._serialized_end=9065
|
||||
_SAVECLIENTLOGRESPONSEDATA._serialized_start=9067
|
||||
_SAVECLIENTLOGRESPONSEDATA._serialized_end=9094
|
||||
_PRELOADINFORMATIONREQUESTDATA._serialized_start=9096
|
||||
_PRELOADINFORMATIONREQUESTDATA._serialized_end=9182
|
||||
_PRELOADINFORMATIONRESPONSEDATA._serialized_start=9185
|
||||
_PRELOADINFORMATIONRESPONSEDATA._serialized_end=9386
|
||||
_LOADINFORMATIONREQUESTDATA._serialized_start=9388
|
||||
_LOADINFORMATIONREQUESTDATA._serialized_end=9506
|
||||
_LOADINFORMATIONRESPONSEDATA._serialized_start=9509
|
||||
_LOADINFORMATIONRESPONSEDATA._serialized_end=9659
|
||||
_PRESAVEREPLAYREQUESTDATA._serialized_start=9662
|
||||
_PRESAVEREPLAYREQUESTDATA._serialized_end=9790
|
||||
_PRESAVEREPLAYRESPONSEDATA._serialized_start=9792
|
||||
_PRESAVEREPLAYRESPONSEDATA._serialized_end=9898
|
||||
_SAVEREPLAYREQUESTDATA._serialized_start=9901
|
||||
_SAVEREPLAYREQUESTDATA._serialized_end=10159
|
||||
_SAVEREPLAYRESPONSEDATA._serialized_start=10161
|
||||
_SAVEREPLAYRESPONSEDATA._serialized_end=10185
|
||||
_SAVECHARGEREQUESTDATA._serialized_start=10188
|
||||
_SAVECHARGEREQUESTDATA._serialized_end=10329
|
||||
_SAVECHARGERESPONSEDATA._serialized_start=10331
|
||||
_SAVECHARGERESPONSEDATA._serialized_end=10409
|
||||
_CHECKRANKINGREQUESTDATA._serialized_start=10411
|
||||
_CHECKRANKINGREQUESTDATA._serialized_end=10528
|
||||
_CHECKRANKINGRESPONSEDATA._serialized_start=10530
|
||||
_CHECKRANKINGRESPONSEDATA._serialized_end=10576
|
||||
_LOADRANKINGREQUESTDATA._serialized_start=10578
|
||||
_LOADRANKINGREQUESTDATA._serialized_end=10675
|
||||
_LOADRANKINGRESPONSEDATA._serialized_start=10678
|
||||
_LOADRANKINGRESPONSEDATA._serialized_end=11763
|
||||
_LOADRANKINGRESPONSEDATA_TRAINERDATA._serialized_start=10907
|
||||
_LOADRANKINGRESPONSEDATA_TRAINERDATA._serialized_end=11763
|
||||
_SAVEINGAMELOGREQUESTDATA._serialized_start=11765
|
||||
_SAVEINGAMELOGREQUESTDATA._serialized_end=11869
|
||||
_SAVEINGAMELOGRESPONSEDATA._serialized_start=11871
|
||||
_SAVEINGAMELOGRESPONSEDATA._serialized_end=11898
|
||||
_PRELOADINFORMATIONATTRACTREQUESTDATA._serialized_start=11900
|
||||
_PRELOADINFORMATIONATTRACTREQUESTDATA._serialized_end=11993
|
||||
_PRELOADINFORMATIONATTRACTRESPONSEDATA._serialized_start=11996
|
||||
_PRELOADINFORMATIONATTRACTRESPONSEDATA._serialized_end=12204
|
||||
_LOADINFORMATIONATTRACTREQUESTDATA._serialized_start=12206
|
||||
_LOADINFORMATIONATTRACTREQUESTDATA._serialized_end=12331
|
||||
_LOADINFORMATIONATTRACTRESPONSEDATA._serialized_start=12334
|
||||
_LOADINFORMATIONATTRACTRESPONSEDATA._serialized_end=12491
|
||||
_LOADCLIENTSETTINGSREQUESTDATA._serialized_start=12493
|
||||
_LOADCLIENTSETTINGSREQUESTDATA._serialized_end=12556
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA._serialized_start=12559
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA._serialized_end=14620
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_EVENTINFO._serialized_start=13482
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_EVENTINFO._serialized_end=13706
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_BANNERINFO._serialized_start=13709
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_BANNERINFO._serialized_end=13871
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_ATTRACTINFO._serialized_start=13874
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_ATTRACTINFO._serialized_end=14134
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_INFOWINDOW._serialized_start=14137
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_INFOWINDOW._serialized_end=14388
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_LUCKYBONUS._serialized_start=14390
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_LUCKYBONUS._serialized_end=14500
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_SPECIALBONUS._serialized_start=14502
|
||||
_LOADCLIENTSETTINGSRESPONSEDATA_SPECIALBONUS._serialized_end=14620
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
Reference in new issue
Block a user