mirror of
https://github.com/norohind/SquadsActivityMonitor.git
synced 2025-04-12 13:00:02 +03:00
Add get_latest_leaderboard
This commit is contained in:
parent
c5ae70a5f8
commit
c129c3d1bf
@ -31,3 +31,6 @@ class AbstractModel(abc.ABC):
|
||||
@abc.abstractmethod
|
||||
def get_leaderboard_by_action_id(self, action_id: int) -> list[dict]:
|
||||
raise NotImplemented
|
||||
|
||||
def get_latest_leaderboard(self, platform: str, leaderboard_type: str) -> list[dict]:
|
||||
raise NotImplemented
|
||||
|
@ -212,3 +212,29 @@ class PostgresModel(AbstractModel):
|
||||
cache.set(cache_key, json.dumps(result))
|
||||
|
||||
return result
|
||||
|
||||
@errors_catcher
|
||||
def get_latest_leaderboard(self, platform: str, leaderboard_type: str) -> list[dict]:
|
||||
cache_key = f'latest_leaderboard_{platform}_{leaderboard_type}'
|
||||
cached_result: typing.Union[str, None] = cache.get(cache_key)
|
||||
|
||||
if cached_result is not None:
|
||||
logger.debug(f'Cached result for {cache_key}')
|
||||
return json.loads(cached_result)
|
||||
|
||||
logger.debug(f'Not cached result for {cache_key}')
|
||||
|
||||
with self.db.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cursor:
|
||||
cursor.execute(
|
||||
postgres_sql_requests.select_latest_leaderboard,
|
||||
{
|
||||
'platform': platform.upper(),
|
||||
'LB_type': leaderboard_type.lower()
|
||||
}
|
||||
)
|
||||
result: list[dict] = cursor.fetchall()
|
||||
|
||||
if not cache.disabled:
|
||||
cache.set(cache_key, json.dumps(result))
|
||||
|
||||
return result
|
||||
|
@ -98,7 +98,7 @@ limit 1000;
|
||||
"""
|
||||
|
||||
select_leaderboard_by_action_id = """select
|
||||
name,
|
||||
name as squadron_name,
|
||||
tag,
|
||||
rank,
|
||||
score,
|
||||
@ -110,3 +110,20 @@ from squads_stats_states
|
||||
where action_id = %(action_id)s
|
||||
order by score desc;
|
||||
"""
|
||||
|
||||
select_latest_leaderboard = """select
|
||||
name as squadron_name,
|
||||
tag,
|
||||
rank,
|
||||
score,
|
||||
to_char(timestamp, 'YYYY-MM-DD HH24:MI:SS') as timestamp,
|
||||
leaderboard_type,
|
||||
platform,
|
||||
squadron_id
|
||||
from squads_stats_states
|
||||
where action_id = (
|
||||
select max(action_id) as action_id
|
||||
from squads_stats_states
|
||||
where leaderboard_type = %(LB_type)s and platform = %(platform)s)
|
||||
order by score desc;
|
||||
"""
|
||||
|
@ -3,50 +3,101 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link type="text/css" rel="stylesheet" href="/js/table_styles.css">
|
||||
<style>
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table>
|
||||
<tr>
|
||||
<th>PC</th>
|
||||
<th>PS4</th>
|
||||
<th>XBOX</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/aegis/platform/pc">AX</a></td>
|
||||
<td><a href="/leaderboard/aegis/platform/ps4">AX</a></td>
|
||||
<td><a href="/leaderboard/aegis/platform/xbox">AX</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/bgs/platform/pc">BGS</a></td>
|
||||
<td><a href="/leaderboard/bgs/platform/ps4">BGS</a></td>
|
||||
<td><a href="/leaderboard/bgs/platform/xbox">BGS</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/combat/platform/pc">COMBAT</a></td>
|
||||
<td><a href="/leaderboard/combat/platform/ps4">COMBAT</a></td>
|
||||
<td><a href="/leaderboard/combat/platform/xbox">COMBAT</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/cqc/platform/pc">CQC</a></td>
|
||||
<td><a href="/leaderboard/cqc/platform/ps4">CQC</a></td>
|
||||
<td><a href="/leaderboard/cqc/platform/xbox">CQC</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/exploration/platform/pc">EXPLORATION</a></td>
|
||||
<td><a href="/leaderboard/exploration/platform/ps4">EXPLORATION</a></td>
|
||||
<td><a href="/leaderboard/exploration/platform/xbox">EXPLORATION</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/powerplay/platform/pc">POWERPLAY</a></td>
|
||||
<td><a href="/leaderboard/powerplay/platform/ps4">POWERPLAY</a></td>
|
||||
<td><a href="/leaderboard/powerplay/platform/xbox">POWERPLAY</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/trade/platform/pc">TRADE</a></td>
|
||||
<td><a href="/leaderboard/trade/platform/ps4">TRADE</a></td>
|
||||
<td><a href="/leaderboard/trade/platform/xbox">TRADE</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div>
|
||||
<p>Squadrons activity</p>
|
||||
<table>
|
||||
<tr>
|
||||
<th>PC</th>
|
||||
<th>PS4</th>
|
||||
<th>XBOX</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/aegis/platform/pc">AX</a></td>
|
||||
<td><a href="/leaderboard/aegis/platform/ps4">AX</a></td>
|
||||
<td><a href="/leaderboard/aegis/platform/xbox">AX</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/bgs/platform/pc">BGS</a></td>
|
||||
<td><a href="/leaderboard/bgs/platform/ps4">BGS</a></td>
|
||||
<td><a href="/leaderboard/bgs/platform/xbox">BGS</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/combat/platform/pc">COMBAT</a></td>
|
||||
<td><a href="/leaderboard/combat/platform/ps4">COMBAT</a></td>
|
||||
<td><a href="/leaderboard/combat/platform/xbox">COMBAT</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/cqc/platform/pc">CQC</a></td>
|
||||
<td><a href="/leaderboard/cqc/platform/ps4">CQC</a></td>
|
||||
<td><a href="/leaderboard/cqc/platform/xbox">CQC</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/exploration/platform/pc">EXPLORATION</a></td>
|
||||
<td><a href="/leaderboard/exploration/platform/ps4">EXPLORATION</a></td>
|
||||
<td><a href="/leaderboard/exploration/platform/xbox">EXPLORATION</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/powerplay/platform/pc">POWERPLAY</a></td>
|
||||
<td><a href="/leaderboard/powerplay/platform/ps4">POWERPLAY</a></td>
|
||||
<td><a href="/leaderboard/powerplay/platform/xbox">POWERPLAY</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard/trade/platform/pc">TRADE</a></td>
|
||||
<td><a href="/leaderboard/trade/platform/ps4">TRADE</a></td>
|
||||
<td><a href="/leaderboard/trade/platform/xbox">TRADE</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div>
|
||||
<p>Latest leaderboards</p>
|
||||
<table>
|
||||
<tr>
|
||||
<th>PC</th>
|
||||
<th>PS4</th>
|
||||
<th>XBOX</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard-state/now/aegis/platform/pc">AX</a></td>
|
||||
<td><a href="/leaderboard-state/now/platform/ps4">AX</a></td>
|
||||
<td><a href="/leaderboard-state/now/aegis/platform/xbox">AX</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard-state/now/bgs/platform/pc">BGS</a></td>
|
||||
<td><a href="/leaderboard-state/now/bgs/platform/ps4">BGS</a></td>
|
||||
<td><a href="/leaderboard-state/now/bgs/platform/xbox">BGS</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard-state/now/combat/platform/pc">COMBAT</a></td>
|
||||
<td><a href="/leaderboard-state/now/combat/platform/ps4">COMBAT</a></td>
|
||||
<td><a href="/leaderboard-state/now/combat/platform/xbox">COMBAT</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard-state/now/cqc/platform/pc">CQC</a></td>
|
||||
<td><a href="/leaderboard-state/now/cqc/platform/ps4">CQC</a></td>
|
||||
<td><a href="/leaderboard-state/now/cqc/platform/xbox">CQC</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard-state/now/exploration/platform/pc">EXPLORATION</a></td>
|
||||
<td><a href="/leaderboard-state/now/exploration/platform/ps4">EXPLORATION</a></td>
|
||||
<td><a href="/leaderboard-state/now/exploration/platform/xbox">EXPLORATION</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard-state/now/powerplay/platform/pc">POWERPLAY</a></td>
|
||||
<td><a href="/leaderboard-state/now/powerplay/platform/ps4">POWERPLAY</a></td>
|
||||
<td><a href="/leaderboard-state/now/powerplay/platform/xbox">POWERPLAY</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/leaderboard-state/now/trade/platform/pc">TRADE</a></td>
|
||||
<td><a href="/leaderboard-state/now/trade/platform/ps4">TRADE</a></td>
|
||||
<td><a href="/leaderboard-state/now/trade/platform/xbox">TRADE</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<a>In order to access to api, add /api/ prefix to any endpoint url<br>
|
||||
Author contact: a31#6403 (discord), a31@demb.design (email)<br>
|
||||
<a href="https://github.com/norohind/SquadsActivityMonitor">Source code</a></a>
|
||||
|
26
web.py
26
web.py
@ -125,7 +125,7 @@ class ActivityDiffHtml:
|
||||
resp.text = render(
|
||||
'table_diff_template.html',
|
||||
{
|
||||
'target_column_name': 'Tag',
|
||||
'target_column_name': keys_mapping['tag'],
|
||||
'target_new_url': '/squads/now/by-tag/short/',
|
||||
'action_id': action_id
|
||||
}
|
||||
@ -160,6 +160,26 @@ class SumLeaderboardHistoryHtml:
|
||||
)
|
||||
|
||||
|
||||
class LatestLeaderboard:
|
||||
def on_get(self, req: falcon.request.Request, resp: falcon.response.Response, leaderboard: str, platform: str)\
|
||||
-> None:
|
||||
resp.content_type = falcon.MEDIA_JSON
|
||||
resp.text = json.dumps(model.get_latest_leaderboard(platform, leaderboard))
|
||||
|
||||
|
||||
class LatestLeaderboardHtml:
|
||||
def on_get(self, req: falcon.request.Request, resp: falcon.response.Response, leaderboard: str, platform: str)\
|
||||
-> None:
|
||||
resp.content_type = falcon.MEDIA_HTML
|
||||
resp.text = render(
|
||||
'table_template.html',
|
||||
{
|
||||
'target_column_name': 'tag',
|
||||
'target_new_url': '/squads/now/by-tag/short/'
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
class LeaderboardByActionID:
|
||||
def on_get(self, req: falcon.request.Request, resp: falcon.response.Response, action_id: int) -> None:
|
||||
resp.content_type = falcon.MEDIA_JSON
|
||||
@ -172,7 +192,7 @@ class LeaderboardByActionIDHTML:
|
||||
resp.text = render(
|
||||
'table_template.html',
|
||||
{
|
||||
'target_column_name': keys_mapping['tag'],
|
||||
'target_column_name': 'tag',
|
||||
'target_new_url': '/api/leaderboard-state/by-action-id/'
|
||||
}
|
||||
)
|
||||
@ -198,11 +218,13 @@ app.add_route('/api/leaderboard/{leaderboard}/platform/{platform}', Activity())
|
||||
app.add_route('/api/diff/{action_id}', ActivityDiff())
|
||||
app.add_route('/api/leaderboard-history/leaderboard/{leaderboard}/platform/{platform}', SumLeaderboardHistory())
|
||||
app.add_route('/api/leaderboard-state/by-action-id/{action_id}', LeaderboardByActionID())
|
||||
app.add_route('/api/leaderboard-state/now/{leaderboard}/platform/{platform}', LatestLeaderboard())
|
||||
|
||||
app.add_route('/leaderboard/{leaderboard}/platform/{platform}', ActivityHtml())
|
||||
app.add_route('/diff/{action_id}', ActivityDiffHtml())
|
||||
app.add_route('/leaderboard-history/leaderboard/{leaderboard}/platform/{platform}', SumLeaderboardHistoryHtml())
|
||||
app.add_route('/leaderboard-state/by-action-id/{action_id}', LeaderboardByActionIDHTML())
|
||||
app.add_route('/leaderboard-state/now/{leaderboard}/platform/{platform}', LatestLeaderboardHtml())
|
||||
|
||||
|
||||
app.add_route('/api/cache/{action}', Cache())
|
||||
|
Loading…
x
Reference in New Issue
Block a user