pokken support

This commit is contained in:
Hay1tsme committed 2023-02-17 02:09:26 -05:00
1 parent 9ee155792e
commit abb25aa328
7 files changed
+390

No files matched your search

+9
View File
@@ -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
+17
View File
@@ -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
+103
View File
@@ -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()
+37
View File
@@ -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)
+12
View File
@@ -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]
+73
View File
@@ -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)
+139
View File
@@ -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)