Frontend for adding rivals, versionless backend function to support
This commit is contained in:
parent
1f545aed41
commit
147d7adaaf
@ -77,6 +77,9 @@
|
|||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
width: 15%;
|
width: 15%;
|
||||||
}
|
}
|
||||||
|
.modal-content {
|
||||||
|
background-color: #181a1b;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -2,6 +2,7 @@ import yaml
|
|||||||
import jinja2
|
import jinja2
|
||||||
from twisted.web.http import Request
|
from twisted.web.http import Request
|
||||||
from os import path
|
from os import path
|
||||||
|
from twisted.web.util import redirectTo
|
||||||
from twisted.web.server import Session
|
from twisted.web.server import Session
|
||||||
|
|
||||||
from core.frontend import FE_Base, IUserSession
|
from core.frontend import FE_Base, IUserSession
|
||||||
@ -10,6 +11,7 @@ from core.config import CoreConfig
|
|||||||
from titles.ongeki.config import OngekiConfig
|
from titles.ongeki.config import OngekiConfig
|
||||||
from titles.ongeki.const import OngekiConstants
|
from titles.ongeki.const import OngekiConstants
|
||||||
from titles.ongeki.database import OngekiData
|
from titles.ongeki.database import OngekiData
|
||||||
|
from titles.ongeki.base import OngekiBase
|
||||||
|
|
||||||
|
|
||||||
class OngekiFrontend(FE_Base):
|
class OngekiFrontend(FE_Base):
|
||||||
@ -24,19 +26,51 @@ class OngekiFrontend(FE_Base):
|
|||||||
yaml.safe_load(open(f"{cfg_dir}/{OngekiConstants.CONFIG_NAME}"))
|
yaml.safe_load(open(f"{cfg_dir}/{OngekiConstants.CONFIG_NAME}"))
|
||||||
)
|
)
|
||||||
self.nav_name = "O.N.G.E.K.I."
|
self.nav_name = "O.N.G.E.K.I."
|
||||||
self.geki_version = OngekiConstants.VERSION_NAMES[-1]+"?"
|
self.version = 7
|
||||||
print(OngekiConstants.VERSION_NAMES[-1])
|
|
||||||
def render_GET(self, request: Request) -> bytes:
|
def render_GET(self, request: Request) -> bytes:
|
||||||
template = self.environment.get_template(
|
template = self.environment.get_template(
|
||||||
"titles/ongeki/frontend/ongeki_index.jinja"
|
"titles/ongeki/frontend/ongeki_index.jinja"
|
||||||
)
|
)
|
||||||
sesh: Session = request.getSession()
|
sesh: Session = request.getSession()
|
||||||
usr_sesh = IUserSession(sesh)
|
usr_sesh = IUserSession(sesh)
|
||||||
|
if getattr(usr_sesh, "userId", 0) != 0:
|
||||||
return template.render(
|
profile_data =self.data.profile.get_profile_data_ignore_version(usr_sesh.userId)
|
||||||
title=f"{self.core_config.server.name} | {self.nav_name}",
|
rival_list = self.data.profile.get_rivals(usr_sesh.userId)
|
||||||
game_list=self.environment.globals["game_list"],
|
rival_data = {
|
||||||
gachas=self.game_cfg.gachas.enabled_gachas,
|
"userRivalList": rival_list,
|
||||||
version= self.geki_version,
|
"userId": usr_sesh.userId
|
||||||
sesh=vars(usr_sesh)
|
}
|
||||||
).encode("utf-16")
|
self.version = getattr(profile_data, "version" , 7)
|
||||||
|
if len(rival_list) > 0:
|
||||||
|
rival_info = OngekiBase.handle_get_user_rival_data_api_request(self, rival_data)
|
||||||
|
|
||||||
|
return 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"],
|
||||||
|
sesh=vars(usr_sesh)
|
||||||
|
).encode("utf-16")
|
||||||
|
else:
|
||||||
|
return redirectTo(b"/gate/", request)
|
||||||
|
|
||||||
|
def render_POST(self, request: Request):
|
||||||
|
uri = request.uri.decode()
|
||||||
|
sesh: Session = request.getSession()
|
||||||
|
usr_sesh = IUserSession(sesh)
|
||||||
|
if hasattr(usr_sesh, "userId"):
|
||||||
|
if uri == "/game/ongeki/rival.add":
|
||||||
|
rival_id = request.args[b"rivalUserId"][0].decode()
|
||||||
|
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)
|
||||||
|
elif uri == "/game/ongeki/rival.delete":
|
||||||
|
return b""
|
||||||
|
|
||||||
|
else:
|
||||||
|
return b""
|
||||||
|
else:
|
||||||
|
return b"User is not logged in"
|
||||||
|
@ -1,8 +1,73 @@
|
|||||||
{% extends "core/frontend/index.jinja" %}
|
{% extends "core/frontend/index.jinja" %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
|
{% if sesh is defined and sesh["userId"] > 0 %}
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<h1>{{ title }}</h1>
|
|
||||||
Version: {{version}}
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<h2> Profile </h2>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<h2> {{ profile_data.userName }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<h4> ID: {{ profile_data.user}}</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<h2> Rivals <button class="btn btn-success" data-bs-toggle="modal" data-bs-target="#rival_add">Add</button></h2>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<table class="table table-dark table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">ID</th>
|
||||||
|
<th scope="col">Name</th>
|
||||||
|
<th scope="col">Delete</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for rival in rival_info%}
|
||||||
|
<tr>
|
||||||
|
<td>{{rival.rivalUserId}}</td>
|
||||||
|
<td>{{rival.rivalUserName}}</td>
|
||||||
|
<td><button class="btn-danger btn btn-sm">Delete</button></td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="modal fade" id="rival_add" tabindex="-1" aria-labelledby="card_add_label" data-bs-theme="dark" aria-hidden="true">
|
||||||
|
<form id="rival" action="/game/ongeki/rival.add" method="post">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Modal title</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
Note:<br>
|
||||||
|
Please use the ID show next to your name in the profile page.
|
||||||
|
<br>
|
||||||
|
<label for="rivalUserId">ID: </label><input form="rival" id="rivalUserId" name="rivalUserId" maxlength="5" type="number" required>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<input type=submit class="btn btn-primary" type="button" form="rival" value="Add">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{# <script>
|
||||||
|
</script> #}
|
||||||
|
{% else %}
|
||||||
|
<h2>Not Currently Logged In</h2>
|
||||||
|
{% endif %}
|
||||||
{% endblock content %}
|
{% endblock content %}
|
@ -269,7 +269,7 @@ class OngekiProfileData(BaseData):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
return row["userName"]
|
return row["userName"]
|
||||||
|
|
||||||
def get_profile_preview(self, aime_id: int, version: int) -> Optional[Row]:
|
def get_profile_preview(self, aime_id: int, version: int) -> Optional[Row]:
|
||||||
sql = (
|
sql = (
|
||||||
select([profile, option])
|
select([profile, option])
|
||||||
@ -295,6 +295,17 @@ class OngekiProfileData(BaseData):
|
|||||||
return None
|
return None
|
||||||
return result.fetchone()
|
return result.fetchone()
|
||||||
|
|
||||||
|
def get_profile_data_ignore_version(self, aime_id: int) -> Optional[Row]:
|
||||||
|
sql = select(profile).where(
|
||||||
|
and_(
|
||||||
|
profile.c.user == aime_id,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
result = self.execute(sql)
|
||||||
|
if result is None:
|
||||||
|
return None
|
||||||
|
return result.fetchone()
|
||||||
def get_profile_options(self, aime_id: int) -> Optional[Row]:
|
def get_profile_options(self, aime_id: int) -> Optional[Row]:
|
||||||
sql = select(option).where(
|
sql = select(option).where(
|
||||||
and_(
|
and_(
|
||||||
@ -499,7 +510,7 @@ class OngekiProfileData(BaseData):
|
|||||||
def put_rival(self, aime_id: int, rival_id: int) -> Optional[int]:
|
def put_rival(self, aime_id: int, rival_id: int) -> Optional[int]:
|
||||||
sql = insert(rival).values(user=aime_id, rivalUserId=rival_id)
|
sql = insert(rival).values(user=aime_id, rivalUserId=rival_id)
|
||||||
|
|
||||||
conflict = sql.on_duplicate_key_update(rival=rival_id)
|
conflict = sql.on_duplicate_key_update(rivalUserId=rival_id)
|
||||||
|
|
||||||
result = self.execute(conflict)
|
result = self.execute(conflict)
|
||||||
if result is None:
|
if result is None:
|
||||||
|
Loading…
Reference in New Issue
Block a user