artemis/titles/ongeki/frontend.py

100 lines
3.9 KiB
Python

from typing import List
from starlette.routing import Route
import yaml
import jinja2
from starlette.requests import Request
from starlette.responses import Response, RedirectResponse
from os import path
from core.frontend import FE_Base, UserSession
from core.config import CoreConfig
from titles.ongeki.config import OngekiConfig
from titles.ongeki.const import OngekiConstants
from titles.ongeki.database import OngekiData
from titles.ongeki.base import OngekiBase
class OngekiFrontend(FE_Base):
def __init__(
self, cfg: CoreConfig, environment: jinja2.Environment, cfg_dir: str
) -> None:
super().__init__(cfg, environment)
self.data = OngekiData(cfg)
self.game_cfg = OngekiConfig()
if path.exists(f"{cfg_dir}/{OngekiConstants.CONFIG_NAME}"):
self.game_cfg.update(
yaml.safe_load(open(f"{cfg_dir}/{OngekiConstants.CONFIG_NAME}"))
)
self.nav_name = "O.N.G.E.K.I."
self.version_list = OngekiConstants.VERSION_NAMES
def get_routes(self) -> List[Route]:
return [
Route("/", self.render_GET)
]
async def render_GET(self, request: Request) -> bytes:
template = self.environment.get_template(
"titles/ongeki/templates/ongeki_index.jinja"
)
usr_sesh = self.validate_session(request)
if not usr_sesh:
usr_sesh = UserSession()
self.version = usr_sesh.ongeki_version
if usr_sesh.user_id > 0:
profile_data =await self.data.profile.get_profile_data(usr_sesh.user_id, self.version)
rival_list = await self.data.profile.get_rivals(usr_sesh.user_id)
rival_data = {
"userRivalList": rival_list,
"userId": usr_sesh.user_id
}
# Hay1tsme 01/09/2024: ??????????????????????????????????????????????????????????????
rival_info = await OngekiBase.handle_get_user_rival_data_api_request(self, rival_data)
return Response(template.render(
data=self.data.profile,
title=f"{self.core_config.server.name} | {self.nav_name}",
game_list=self.environment.globals["game_list"],
gachas=self.game_cfg.gachas.enabled_gachas,
profile_data=profile_data,
rival_info=rival_info["userRivalDataList"],
version_list=self.version_list,
version=self.version,
sesh=vars(usr_sesh)
), media_type="text/html; charset=utf-8")
else:
return RedirectResponse("/gate/", 303)
async def render_POST(self, request: Request):
uri = request.uri.decode()
usr_sesh = self.validate_session(request)
if not usr_sesh:
usr_sesh = UserSession()
if usr_sesh.user_id > 0:
if uri == "/game/ongeki/rival.add":
rival_id = request.args[b"rivalUserId"][0].decode()
await self.data.profile.put_rival(usr_sesh.user_id, rival_id)
# self.logger.info(f"{usr_sesh.user_id} added a rival")
return RedirectResponse(b"/game/ongeki/", 303)
elif uri == "/game/ongeki/rival.delete":
rival_id = request.args[b"rivalUserId"][0].decode()
await self.data.profile.delete_rival(usr_sesh.user_id, rival_id)
# self.logger.info(f"{response}")
return RedirectResponse(b"/game/ongeki/", 303)
elif uri == "/game/ongeki/version.change":
ongeki_version=request.args[b"version"][0].decode()
if(ongeki_version.isdigit()):
usr_sesh.ongeki_version=int(ongeki_version)
return RedirectResponse("/game/ongeki/", 303)
else:
Response("Something went wrong", status_code=500)
else:
return RedirectResponse("/gate/", 303)