mirror of
https://gitea.tendokyu.moe/Hay1tsme/artemis.git
synced 2026-02-15 12:17:28 +08:00
port frontend changes from different project
This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
import json
|
||||
from typing import List
|
||||
from starlette.routing import Route
|
||||
from starlette.responses import Response, RedirectResponse
|
||||
import yaml
|
||||
import jinja2
|
||||
from os import path
|
||||
from twisted.web.util import redirectTo
|
||||
from starlette.requests import Request
|
||||
from twisted.web.server import Session
|
||||
|
||||
from core.frontend import FE_Base, IUserSession
|
||||
from core.frontend import FE_Base, UserSession
|
||||
from core.config import CoreConfig
|
||||
from titles.idac.database import IDACData
|
||||
from titles.idac.schema.profile import *
|
||||
@@ -26,7 +27,8 @@ class IDACFrontend(FE_Base):
|
||||
self.game_cfg.update(
|
||||
yaml.safe_load(open(f"{cfg_dir}/{IDACConstants.CONFIG_NAME}"))
|
||||
)
|
||||
self.nav_name = "頭文字D THE ARCADE"
|
||||
#self.nav_name = "頭文字D THE ARCADE"
|
||||
self.nav_name = "IDAC"
|
||||
# TODO: Add version list
|
||||
self.version = IDACConstants.VER_IDAC_SEASON_2
|
||||
|
||||
@@ -36,6 +38,11 @@ class IDACFrontend(FE_Base):
|
||||
25: "full_tune_tickets",
|
||||
34: "full_tune_fragments",
|
||||
}
|
||||
|
||||
def get_routes(self) -> List[Route]:
|
||||
return [
|
||||
Route("/", self.render_GET)
|
||||
]
|
||||
|
||||
async def generate_all_tables_json(self, user_id: int):
|
||||
json_export = {}
|
||||
@@ -87,35 +94,32 @@ class IDACFrontend(FE_Base):
|
||||
return json.dumps(json_export, indent=4, default=str, ensure_ascii=False)
|
||||
|
||||
async def render_GET(self, request: Request) -> bytes:
|
||||
uri: str = request.uri.decode()
|
||||
uri: str = request.url.path
|
||||
|
||||
template = self.environment.get_template(
|
||||
"titles/idac/frontend/idac_index.jinja"
|
||||
"titles/idac/templates/idac_index.jinja"
|
||||
)
|
||||
sesh: Session = request.getSession()
|
||||
usr_sesh = IUserSession(sesh)
|
||||
user_id = usr_sesh.userId
|
||||
usr_sesh = self.validate_session(request)
|
||||
if not usr_sesh:
|
||||
usr_sesh = UserSession()
|
||||
user_id = usr_sesh.user_id
|
||||
# user_id = usr_sesh.user_id
|
||||
|
||||
# profile export
|
||||
if uri.startswith("/game/idac/export"):
|
||||
if user_id == 0:
|
||||
return redirectTo(b"/game/idac", request)
|
||||
return RedirectResponse(b"/game/idac", request)
|
||||
|
||||
# set the file name, content type and size to download the json
|
||||
content = await self.generate_all_tables_json(user_id).encode("utf-8")
|
||||
request.responseHeaders.addRawHeader(
|
||||
b"content-type", b"application/octet-stream"
|
||||
)
|
||||
request.responseHeaders.addRawHeader(
|
||||
b"content-disposition", b"attachment; filename=idac_profile.json"
|
||||
)
|
||||
request.responseHeaders.addRawHeader(
|
||||
b"content-length", str(len(content)).encode("utf-8")
|
||||
)
|
||||
|
||||
self.logger.info(f"User {user_id} exported their IDAC data")
|
||||
return content
|
||||
return Response(
|
||||
content,
|
||||
200,
|
||||
{'content-disposition': 'attachment; filename=idac_profile.json'},
|
||||
"application/octet-stream"
|
||||
)
|
||||
|
||||
profile_data, tickets, rank = None, None, None
|
||||
if user_id > 0:
|
||||
@@ -128,7 +132,7 @@ class IDACFrontend(FE_Base):
|
||||
for ticket in ticket_data
|
||||
}
|
||||
|
||||
return template.render(
|
||||
return Response(template.render(
|
||||
title=f"{self.core_config.server.name} | {self.nav_name}",
|
||||
game_list=self.environment.globals["game_list"],
|
||||
profile=profile_data,
|
||||
@@ -136,4 +140,4 @@ class IDACFrontend(FE_Base):
|
||||
rank=rank,
|
||||
sesh=vars(usr_sesh),
|
||||
active_page="idac",
|
||||
).encode("utf-16")
|
||||
))
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{% extends "core/frontend/index.jinja" %}
|
||||
{% extends "core/templates/index.jinja" %}
|
||||
{% block content %}
|
||||
<h1 class="mb-3">頭文字D THE ARCADE</h1>
|
||||
|
||||
{% if sesh is defined and sesh["userId"] > 0 %}
|
||||
{% if sesh is defined and sesh["user_id"] > 0 %}
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<div class="card-title">
|
||||
@@ -128,7 +128,7 @@
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
{% include "titles/idac/frontend/js/idac_scripts.js" %}
|
||||
{% include "titles/idac/templates/js/idac_scripts.js" %}
|
||||
</script>
|
||||
|
||||
{% endblock content %}
|
||||
@@ -1,11 +1,14 @@
|
||||
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 twisted.web.util import redirectTo
|
||||
from twisted.web.server import Session
|
||||
|
||||
from core.frontend import FE_Base, IUserSession
|
||||
from core.frontend import FE_Base, UserSession
|
||||
from core.config import CoreConfig
|
||||
|
||||
from titles.ongeki.config import OngekiConfig
|
||||
@@ -27,24 +30,31 @@ class OngekiFrontend(FE_Base):
|
||||
)
|
||||
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/frontend/ongeki_index.jinja"
|
||||
"titles/ongeki/templates/ongeki_index.jinja"
|
||||
)
|
||||
sesh: Session = request.getSession()
|
||||
usr_sesh = IUserSession(sesh)
|
||||
usr_sesh = self.validate_session(request)
|
||||
if not usr_sesh:
|
||||
usr_sesh = UserSession()
|
||||
|
||||
self.version = usr_sesh.ongeki_version
|
||||
if getattr(usr_sesh, "userId", 0) != 0:
|
||||
profile_data =self.data.profile.get_profile_data(usr_sesh.userId, self.version)
|
||||
rival_list = await self.data.profile.get_rivals(usr_sesh.userId)
|
||||
profile_data =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.userId
|
||||
"userId": usr_sesh.user_id
|
||||
}
|
||||
rival_info = OngekiBase.handle_get_user_rival_data_api_request(self, rival_data)
|
||||
|
||||
return template.render(
|
||||
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"],
|
||||
@@ -54,34 +64,36 @@ class OngekiFrontend(FE_Base):
|
||||
version_list=self.version_list,
|
||||
version=self.version,
|
||||
sesh=vars(usr_sesh)
|
||||
).encode("utf-16")
|
||||
))
|
||||
else:
|
||||
return redirectTo(b"/gate/", request)
|
||||
return RedirectResponse("/gate/", 303)
|
||||
|
||||
async def render_POST(self, request: Request):
|
||||
uri = request.uri.decode()
|
||||
sesh: Session = request.getSession()
|
||||
usr_sesh = IUserSession(sesh)
|
||||
if hasattr(usr_sesh, "userId"):
|
||||
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.userId, rival_id)
|
||||
# self.logger.info(f"{usr_sesh.userId} added a rival")
|
||||
return redirectTo(b"/game/ongeki/", request)
|
||||
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.userId, rival_id)
|
||||
await self.data.profile.delete_rival(usr_sesh.user_id, rival_id)
|
||||
# self.logger.info(f"{response}")
|
||||
return redirectTo(b"/game/ongeki/", request)
|
||||
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 redirectTo(b"/game/ongeki/", request)
|
||||
return RedirectResponse("/game/ongeki/", 303)
|
||||
|
||||
else:
|
||||
return b"Something went wrong"
|
||||
Response("Something went wrong", status_code=500)
|
||||
else:
|
||||
return b"User is not logged in"
|
||||
return RedirectResponse("/gate/", 303)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% extends "core/frontend/index.jinja" %}
|
||||
{% extends "core/templates/index.jinja" %}
|
||||
{% block content %}
|
||||
|
||||
{% if sesh is defined and sesh["userId"] > 0 %}
|
||||
{% if sesh is defined and sesh["user_id"] > 0 %}
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
@@ -75,7 +75,7 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
{% include 'titles/ongeki/frontend/js/ongeki_scripts.js' %}
|
||||
{% include 'titles/ongeki/templates/js/ongeki_scripts.js' %}
|
||||
</script>
|
||||
{% else %}
|
||||
<h2>Not Currently Logged In</h2>
|
||||
@@ -1,10 +1,12 @@
|
||||
import yaml
|
||||
import jinja2
|
||||
from typing import List
|
||||
from starlette.requests import Request
|
||||
from starlette.responses import Response, RedirectResponse
|
||||
from starlette.routing import Route
|
||||
from os import path
|
||||
from twisted.web.server import Session
|
||||
|
||||
from core.frontend import FE_Base, IUserSession
|
||||
from core.frontend import FE_Base, UserSession
|
||||
from core.config import CoreConfig
|
||||
from .database import PokkenData
|
||||
from .config import PokkenConfig
|
||||
@@ -12,6 +14,8 @@ from .const import PokkenConstants
|
||||
|
||||
|
||||
class PokkenFrontend(FE_Base):
|
||||
SN_PREFIX = PokkenConstants.SERIAL_IDENT
|
||||
NETID_PREFIX = PokkenConstants.NETID_PREFIX
|
||||
def __init__(
|
||||
self, cfg: CoreConfig, environment: jinja2.Environment, cfg_dir: str
|
||||
) -> None:
|
||||
@@ -23,17 +27,75 @@ class PokkenFrontend(FE_Base):
|
||||
yaml.safe_load(open(f"{cfg_dir}/{PokkenConstants.CONFIG_NAME}"))
|
||||
)
|
||||
self.nav_name = "Pokken"
|
||||
|
||||
def get_routes(self) -> List[Route]:
|
||||
return [
|
||||
Route("/", self.render_GET, methods=['GET']),
|
||||
Route("/update.name", self.change_name, methods=['POST']),
|
||||
]
|
||||
|
||||
def render_GET(self, request: Request) -> bytes:
|
||||
async def render_GET(self, request: Request) -> Response:
|
||||
template = self.environment.get_template(
|
||||
"titles/pokken/frontend/pokken_index.jinja"
|
||||
"titles/pokken/templates/pokken_index.jinja"
|
||||
)
|
||||
pf = None
|
||||
|
||||
usr_sesh = self.validate_session(request)
|
||||
if not usr_sesh:
|
||||
usr_sesh = UserSession()
|
||||
|
||||
else:
|
||||
profile = await self.data.profile.get_profile(usr_sesh.user_id)
|
||||
if profile is not None and profile['trainer_name']:
|
||||
pf = profile._asdict()
|
||||
|
||||
if "e" in request.query_params:
|
||||
try:
|
||||
err = int(request.query_params.get("e", 0))
|
||||
except Exception:
|
||||
err = 0
|
||||
|
||||
sesh: Session = request.getSession()
|
||||
usr_sesh = IUserSession(sesh)
|
||||
else:
|
||||
err = 0
|
||||
|
||||
if "s" in request.query_params:
|
||||
try:
|
||||
succ = int(request.query_params.get("s", 0))
|
||||
except Exception:
|
||||
succ = 0
|
||||
|
||||
return template.render(
|
||||
else:
|
||||
succ = 0
|
||||
|
||||
return Response(template.render(
|
||||
title=f"{self.core_config.server.name} | {self.nav_name}",
|
||||
game_list=self.environment.globals["game_list"],
|
||||
sesh=vars(usr_sesh)
|
||||
).encode("utf-16")
|
||||
sesh=vars(usr_sesh),
|
||||
profile=pf,
|
||||
error=err,
|
||||
success=succ
|
||||
))
|
||||
|
||||
async def change_name(self, request: Request) -> RedirectResponse:
|
||||
usr_sesh = self.validate_session(request)
|
||||
if not usr_sesh:
|
||||
return RedirectResponse("/game/pokken/?e=9", 303)
|
||||
|
||||
frm = await request.form()
|
||||
new_name = frm.get("new_name")
|
||||
gender = frm.get("new_gender", 1)
|
||||
|
||||
if len(new_name) > 14:
|
||||
return RedirectResponse("/game/pokken/?e=8", 303)
|
||||
|
||||
if not gender.isdigit():
|
||||
return RedirectResponse("/game/pokken/?e=4", 303)
|
||||
|
||||
gender = int(gender)
|
||||
|
||||
if gender != 1 and gender != 2:
|
||||
return RedirectResponse("/game/pokken/?e=4", 303) # no code for this yet, whatever
|
||||
|
||||
await self.data.profile.set_profile_name(usr_sesh.user_id, new_name, gender)
|
||||
|
||||
return RedirectResponse("/game/pokken/?s=1", 303)
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
{% extends "core/frontend/index.jinja" %}
|
||||
{% block content %}
|
||||
<h1>Pokken</h1>
|
||||
{% endblock content %}
|
||||
48
titles/pokken/templates/pokken_index.jinja
Normal file
48
titles/pokken/templates/pokken_index.jinja
Normal file
@@ -0,0 +1,48 @@
|
||||
{% extends "core/templates/index.jinja" %}
|
||||
{% block content %}
|
||||
<h1>Pokken</h1>
|
||||
{% if profile is defined and profile is not none and profile.id > 0 %}
|
||||
<script type="text/javascript">
|
||||
function toggle_new_name_form() {
|
||||
let frm = document.getElementById("new_name_form");
|
||||
let btn = document.getElementById("btn_toggle_form");
|
||||
|
||||
if (frm.style['display'] != "") {
|
||||
frm.style['display'] = "";
|
||||
frm.style['max-height'] = "";
|
||||
btn.innerText = "Cancel";
|
||||
} else {
|
||||
frm.style['display'] = "none";
|
||||
frm.style['max-height'] = "0px";
|
||||
btn.innerText = "Edit";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<h3>Profile for {{ profile.trainer_name }} <button onclick="toggle_new_name_form()" class="btn btn-secondary" id="btn_toggle_form">Edit</button></h3>
|
||||
{% if error is defined %}
|
||||
{% include "core/templates/widgets/err_banner.jinja" %}
|
||||
{% endif %}
|
||||
{% if success is defined and success == 1 %}
|
||||
<div style="background-color: #00AA00; padding: 20px; margin-bottom: 10px; width: 15%;">
|
||||
Update successful
|
||||
</div>
|
||||
{% endif %}
|
||||
<form style="max-width: 33%; display: none; max-height: 0px;" action="/game/pokken/update.name" method="post" id="new_name_form">
|
||||
<div class="mb-3">
|
||||
<label for="new_name" class="form-label">New Trainer Name</label>
|
||||
<input type="text" class="form-control" id="new_name" name="new_name" aria-describedby="new_name_help" maxlength="14">
|
||||
<div id="new_name_help" class="form-text">Must be 14 characters or less</div>
|
||||
<br>
|
||||
<input type="radio" id="new_gender_male" name="new_gender" value="1" {% if profile.avatar_gender is none or profile.avatar_gender == 1 %}checked{% endif %}>
|
||||
<label for="new_gender_male">Male</label>
|
||||
<input type="radio" id="new_gender_female" name="new_gender" value="2" {% if profile.avatar_gender == 2 %}checked{% endif %}>
|
||||
<label for="new_gender_male">Female</label>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</form>
|
||||
{% elif sesh is defined and sesh is not none and sesh.user_id > 0 %}
|
||||
No profile information found for this account.
|
||||
{% else %}
|
||||
Login to view profile information.
|
||||
{% endif %}
|
||||
{% endblock content %}
|
||||
@@ -1,10 +1,12 @@
|
||||
from typing import List
|
||||
from starlette.routing import Route
|
||||
from starlette.requests import Request
|
||||
from starlette.responses import Response
|
||||
from os import path
|
||||
import yaml
|
||||
import jinja2
|
||||
from starlette.requests import Request
|
||||
from os import path
|
||||
from twisted.web.server import Session
|
||||
|
||||
from core.frontend import FE_Base, IUserSession
|
||||
from core.frontend import FE_Base, UserSession
|
||||
from core.config import CoreConfig
|
||||
from titles.wacca.database import WaccaData
|
||||
from titles.wacca.config import WaccaConfig
|
||||
@@ -24,15 +26,21 @@ class WaccaFrontend(FE_Base):
|
||||
)
|
||||
self.nav_name = "Wacca"
|
||||
|
||||
def get_routes(self) -> List[Route]:
|
||||
return [
|
||||
Route("/", self.render_GET, methods=['GET'])
|
||||
]
|
||||
|
||||
async def render_GET(self, request: Request) -> bytes:
|
||||
template = self.environment.get_template(
|
||||
"titles/wacca/frontend/wacca_index.jinja"
|
||||
"titles/wacca/templates/wacca_index.jinja"
|
||||
)
|
||||
sesh: Session = request.getSession()
|
||||
usr_sesh = IUserSession(sesh)
|
||||
usr_sesh = self.validate_session(request)
|
||||
if not usr_sesh:
|
||||
usr_sesh = UserSession()
|
||||
|
||||
return template.render(
|
||||
return Response(template.render(
|
||||
title=f"{self.core_config.server.name} | {self.nav_name}",
|
||||
game_list=self.environment.globals["game_list"],
|
||||
sesh=vars(usr_sesh)
|
||||
).encode("utf-16")
|
||||
))
|
||||
@@ -1,4 +0,0 @@
|
||||
{% extends "core/frontend/index.jinja" %}
|
||||
{% block content %}
|
||||
<h1>Wacca</h1>
|
||||
{% endblock content %}
|
||||
4
titles/wacca/templates/wacca_index.jinja
Normal file
4
titles/wacca/templates/wacca_index.jinja
Normal file
@@ -0,0 +1,4 @@
|
||||
{% extends "core/templates/index.jinja" %}
|
||||
{% block content %}
|
||||
<h1>Wacca</h1>
|
||||
{% endblock content %}
|
||||
Reference in New Issue
Block a user