add better dashboard with full snake game board
This commit is contained in:
+24
-25
@@ -14,7 +14,7 @@ from server.metrics import (
|
||||
MetricsCollector,
|
||||
)
|
||||
|
||||
from quart import Quart, request, jsonify, render_template
|
||||
from quart import Quart, request, jsonify, render_template, send_from_directory
|
||||
import logging, json, os, re, time
|
||||
from typing import cast
|
||||
|
||||
@@ -144,6 +144,7 @@ class Server:
|
||||
database=os.getenv('EDGEDB_DATABASE', None),
|
||||
)
|
||||
|
||||
await self._record_gameplay_end(game_state)
|
||||
await await_log(self.logger.info(f'GAME ENDED: Winner is {[x['name'] for x in game_state['board']['snakes']]}'))
|
||||
await self._delete_game_board(game_state)
|
||||
await self.metrics_collector.record_game_end(game_state)
|
||||
@@ -190,36 +191,30 @@ class Server:
|
||||
{'Content-Type': 'text/plain; version=0.0.4; charset=utf-8'},
|
||||
)
|
||||
|
||||
@self.app.get('/dashboard/summary')
|
||||
async def dashboard_summary():
|
||||
summary = await self._get_dashboard_summary()
|
||||
return jsonify(summary)
|
||||
|
||||
@self.app.get('/dashboard')
|
||||
async def dashboard_view():
|
||||
initial_game_id = request.args.get('game_id', '')
|
||||
initial_summary = await self._get_dashboard_summary()
|
||||
initial_games = await self._get_dashboard_games(limit=100)
|
||||
return await render_template(
|
||||
'dashboard.html',
|
||||
initial_game_id=initial_game_id,
|
||||
initial_summary=initial_summary,
|
||||
initial_games=initial_games,
|
||||
)
|
||||
|
||||
@self.app.get('/dashboard/games')
|
||||
async def dashboard_games():
|
||||
raw_limit = request.args.get('limit', '50')
|
||||
try:
|
||||
limit = max(1, min(200, int(raw_limit)))
|
||||
except ValueError:
|
||||
limit = 50
|
||||
games = await self._get_dashboard_games(limit)
|
||||
return jsonify(games)
|
||||
|
||||
@self.app.get('/dashboard/game/<string:game_id>')
|
||||
async def dashboard_game_replay(game_id:str):
|
||||
replay = await self._get_dashboard_game_replay(game_id)
|
||||
if replay is None:
|
||||
return jsonify({'error':'game_not_found', 'game_id':game_id}), 404
|
||||
return jsonify({'error': 'game_not_found', 'game_id': game_id}), 404
|
||||
return jsonify(replay)
|
||||
|
||||
@self.app.get('/dashboard/customizations/<path:asset_path>')
|
||||
async def dashboard_customizations_asset(asset_path:str):
|
||||
customization_root = os.path.join(self.data_path, 'server', 'static', 'customizations')
|
||||
return await send_from_directory(customization_root, asset_path)
|
||||
|
||||
async def run(self, host:str='0.0.0.0', port:int=8000, debug:bool=False):
|
||||
logging.getLogger('werkzeug').setLevel(logging.ERROR)
|
||||
|
||||
@@ -372,7 +367,11 @@ class Server:
|
||||
if self.gameplay_database is None:
|
||||
return
|
||||
try:
|
||||
await self.gameplay_database.record_game_start(game_state)
|
||||
await self.gameplay_database.record_game_start(
|
||||
game_state,
|
||||
snake_type=self.snake_type,
|
||||
snake_version=self.snake_version,
|
||||
)
|
||||
except Exception as error:
|
||||
await await_log(self.logger.warning(f'Gameplay DB start record failed:{error}'))
|
||||
|
||||
@@ -405,28 +404,28 @@ class Server:
|
||||
|
||||
async def _get_dashboard_summary(self) -> dict:
|
||||
if self.gameplay_database is None:
|
||||
return {'enabled':False}
|
||||
return {'enabled': False}
|
||||
try:
|
||||
summary = await self.gameplay_database.get_summary()
|
||||
summary['enabled'] = True
|
||||
return summary
|
||||
except Exception as error:
|
||||
await await_log(self.logger.warning(f'Gameplay DB summary failed:{error}'))
|
||||
return {'enabled':True, 'error':'summary_unavailable'}
|
||||
return {'enabled': True, 'error':' summary_unavailable'}
|
||||
|
||||
async def _get_dashboard_games(self, limit:int=50) -> dict:
|
||||
if self.gameplay_database is None:
|
||||
return {'enabled':False, 'games':[]}
|
||||
return {'enabled': False, 'games': []}
|
||||
try:
|
||||
games = await self.gameplay_database.list_games(limit=limit)
|
||||
return {'enabled':True, 'games':games}
|
||||
return {'enabled': True, 'games': games}
|
||||
except Exception as error:
|
||||
await await_log(self.logger.warning(f'Gameplay DB game list failed:{error}'))
|
||||
return {'enabled':True, 'error':'games_unavailable', 'games':[]}
|
||||
return {'enabled': True, 'error': 'games_unavailable', 'games': []}
|
||||
|
||||
async def _get_dashboard_game_replay(self, game_id:str) -> dict | None:
|
||||
if self.gameplay_database is None:
|
||||
return {'enabled':False, 'error':'database_disabled', 'game_id':game_id}
|
||||
return {'enabled': False, 'error': 'database_disabled', 'game_id': game_id}
|
||||
try:
|
||||
replay = await self.gameplay_database.get_game_replay(game_id)
|
||||
if replay is None:
|
||||
@@ -435,4 +434,4 @@ class Server:
|
||||
return replay
|
||||
except Exception as error:
|
||||
await await_log(self.logger.warning(f'Gameplay DB replay failed:{error}'))
|
||||
return {'enabled':True, 'error':'replay_unavailable', 'game_id':game_id}
|
||||
return {'enabled': True, 'error': 'replay_unavailable', 'game_id': game_id}
|
||||
|
||||
Reference in New Issue
Block a user