3
2
forked from Dniel97/artemis
artemis/core/title.py

105 lines
3.7 KiB
Python
Raw Normal View History

from typing import Dict, Any
import logging, coloredlogs
from logging.handlers import TimedRotatingFileHandler
2023-02-16 22:13:41 +00:00
from twisted.web.http import Request
from core.config import CoreConfig
from core.data import Data
2023-02-16 22:13:41 +00:00
from core.utils import Utils
2023-03-09 16:38:58 +00:00
class TitleServlet:
def __init__(self, core_cfg: CoreConfig, cfg_folder: str):
super().__init__()
self.config = core_cfg
self.config_folder = cfg_folder
2023-02-16 22:13:41 +00:00
self.data = Data(core_cfg)
self.title_registry: Dict[str, Any] = {}
2023-02-16 22:13:41 +00:00
self.logger = logging.getLogger("title")
if not hasattr(self.logger, "initialized"):
log_fmt_str = "[%(asctime)s] Title | %(levelname)s | %(message)s"
2023-03-09 16:38:58 +00:00
log_fmt = logging.Formatter(log_fmt_str)
2023-02-16 22:13:41 +00:00
2023-03-09 16:38:58 +00:00
fileHandler = TimedRotatingFileHandler(
"{0}/{1}.log".format(self.config.server.log_dir, "title"),
when="d",
backupCount=10,
)
2023-02-16 22:13:41 +00:00
fileHandler.setFormatter(log_fmt)
2023-03-09 16:38:58 +00:00
2023-02-16 22:13:41 +00:00
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(log_fmt)
self.logger.addHandler(fileHandler)
self.logger.addHandler(consoleHandler)
2023-03-09 16:38:58 +00:00
2023-02-16 22:13:41 +00:00
self.logger.setLevel(core_cfg.title.loglevel)
2023-03-09 16:38:58 +00:00
coloredlogs.install(
level=core_cfg.title.loglevel, logger=self.logger, fmt=log_fmt_str
)
2023-02-16 22:13:41 +00:00
self.logger.initialized = True
2023-03-09 16:38:58 +00:00
2023-02-18 05:00:30 +00:00
plugins = Utils.get_all_titles()
2023-03-09 16:38:58 +00:00
2023-02-18 05:00:30 +00:00
for folder, mod in plugins.items():
if hasattr(mod, "game_codes") and hasattr(mod, "index"):
should_call_setup = True
2023-03-09 16:38:58 +00:00
if hasattr(mod.index, "get_allnet_info"):
for code in mod.game_codes:
2023-03-09 16:38:58 +00:00
enabled, _, _ = mod.index.get_allnet_info(
code, self.config, self.config_folder
)
if enabled:
handler_cls = mod.index(self.config, self.config_folder)
2023-03-09 16:38:58 +00:00
if hasattr(handler_cls, "setup") and should_call_setup:
handler_cls.setup()
should_call_setup = False
self.title_registry[code] = handler_cls
2023-03-09 16:38:58 +00:00
else:
self.logger.warn(f"Game {folder} has no get_allnet_info")
2023-03-09 16:38:58 +00:00
else:
self.logger.error(f"{folder} missing game_code or index in __init__.py")
2023-03-09 16:38:58 +00:00
self.logger.info(
f"Serving {len(self.title_registry)} game codes {'on port ' + str(core_cfg.title.port) if core_cfg.title.port > 0 else ''}"
2023-03-09 16:38:58 +00:00
)
def render_GET(self, request: Request, endpoints: dict) -> bytes:
code = endpoints["game"]
if code not in self.title_registry:
self.logger.warn(f"Unknown game code {code}")
2023-03-02 05:14:13 +00:00
request.setResponseCode(404)
return b""
2023-03-09 16:38:58 +00:00
index = self.title_registry[code]
if not hasattr(index, "render_GET"):
self.logger.warn(f"{code} does not dispatch GET")
2023-03-02 05:14:13 +00:00
request.setResponseCode(405)
return b""
return index.render_GET(request, int(endpoints["version"]), endpoints["endpoint"])
2023-03-09 16:38:58 +00:00
def render_POST(self, request: Request, endpoints: dict) -> bytes:
code = endpoints["game"]
if code not in self.title_registry:
self.logger.warn(f"Unknown game code {code}")
2023-03-02 05:14:13 +00:00
request.setResponseCode(404)
return b""
2023-03-09 16:38:58 +00:00
index = self.title_registry[code]
if not hasattr(index, "render_POST"):
self.logger.warn(f"{code} does not dispatch POST")
2023-03-02 05:14:13 +00:00
request.setResponseCode(405)
return b""
2023-03-09 16:38:58 +00:00
return index.render_POST(
request, int(endpoints["version"]), endpoints["endpoint"]
)