forked from Hay1tsme/artemis
pokken: add requirement for autobahn, add stun, turn and admission servers
This commit is contained in:
72
titles/pokken/services.py
Normal file
72
titles/pokken/services.py
Normal file
@ -0,0 +1,72 @@
|
||||
from twisted.internet.interfaces import IAddress
|
||||
from twisted.internet.protocol import DatagramProtocol
|
||||
from twisted.internet.protocol import Protocol
|
||||
from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory
|
||||
from datetime import datetime
|
||||
import logging
|
||||
import json
|
||||
|
||||
from core.config import CoreConfig
|
||||
from .config import PokkenConfig
|
||||
from .base import PokkenBase
|
||||
|
||||
class PokkenStunProtocol(DatagramProtocol):
|
||||
def __init__(self, cfg: CoreConfig, game_cfg: PokkenConfig, type: str) -> None:
|
||||
super().__init__()
|
||||
self.core_config = cfg
|
||||
self.game_config = game_cfg
|
||||
self.logger = logging.getLogger("pokken")
|
||||
self.server_type = type
|
||||
|
||||
def datagramReceived(self, data, addr):
|
||||
self.logger.debug(
|
||||
f"{self.server_type} from from {addr[0]}:{addr[1]} -> {self.transport.getHost().port} - {data.hex()}"
|
||||
)
|
||||
self.transport.write(data, addr)
|
||||
|
||||
# 474554202f20485454502f312e310d0a436f6e6e656374696f6e3a20557067726164650d0a486f73743a207469746c65732e6861793174732e6d653a393030330d0a5365632d576562536f636b65742d4b65793a204f4a6b6d522f376b646d6953326573483548783776413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a557067726164653a20776562736f636b65740d0a557365722d4167656e743a20576562536f636b65742b2b2f302e332e300d0a0d0a
|
||||
class PokkenAdmissionProtocol(WebSocketServerProtocol):
|
||||
def __init__(self, cfg: CoreConfig, game_cfg: PokkenConfig):
|
||||
super().__init__()
|
||||
self.core_config = cfg
|
||||
self.game_config = game_cfg
|
||||
self.logger = logging.getLogger("pokken")
|
||||
|
||||
self.base = PokkenBase(cfg, game_cfg)
|
||||
|
||||
def onMessage(self, payload, isBinary: bool) -> None:
|
||||
msg = json.loads(payload)
|
||||
self.logger.debug(f"WebSocket from from {self.transport.getPeer().host}:{self.transport.getPeer().port} -> {self.transport.getHost().port} - {msg}")
|
||||
|
||||
handler = getattr(self.base, f"handle_admission_{msg['api'].lower()}")
|
||||
resp = handler(msg, self.transport.getPeer().host)
|
||||
|
||||
if "type" not in resp:
|
||||
resp['type'] = "res"
|
||||
if "data" not in resp:
|
||||
resp['data'] = {}
|
||||
if "api" not in resp:
|
||||
resp['api'] = msg["api"]
|
||||
if "result" not in resp:
|
||||
resp['result'] = 'true'
|
||||
|
||||
self.logger.debug(f"Websocket response: {resp}")
|
||||
self.sendMessage(json.dumps(resp).encode(), isBinary)
|
||||
|
||||
# 0001002c2112a442334a0506a62efa71477dcd698022002872655455524e2053796e6320436c69656e7420302e33202d20524643353338392f7475726e2d3132
|
||||
class PokkenAdmissionFactory(WebSocketServerFactory):
|
||||
protocol = PokkenAdmissionProtocol
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
cfg: CoreConfig,
|
||||
game_cfg: PokkenConfig
|
||||
) -> None:
|
||||
self.core_config = cfg
|
||||
self.game_config = game_cfg
|
||||
super().__init__(f"ws://{self.game_config.server.hostname}:{self.game_config.server.port_admission}")
|
||||
|
||||
def buildProtocol(self, addr: IAddress) -> Protocol:
|
||||
p = self.protocol(self.core_config, self.game_config)
|
||||
p.factory = self
|
||||
return p
|
Reference in New Issue
Block a user