Add get_latest_leaderboard

This commit is contained in:
norohind 2022-01-31 20:04:23 +03:00
parent c5ae70a5f8
commit c129c3d1bf
Signed by: norohind
GPG Key ID: 01C3BECC26FB59E1
5 changed files with 164 additions and 45 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
"""

View File

@ -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
View File

@ -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())