move route code out of server into own blueprints and cleanup the codebase
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
from typing import TYPE_CHECKING, cast
|
||||
import json, time, os
|
||||
|
||||
from quart import Blueprint, request, jsonify
|
||||
|
||||
from quart_common.web.logger import await_log
|
||||
from server.storage import StorageLoader
|
||||
from server.GameBoard import GameBoard
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from server.Server import Server
|
||||
|
||||
def create_battlesnake_blueprint(server:'Server') -> Blueprint:
|
||||
blueprint = Blueprint('battlesnake', __name__)
|
||||
|
||||
@blueprint.get('/')
|
||||
async def on_info():
|
||||
server.metrics_collector.record_http_request('info')
|
||||
snake_config = await server._read_json_config_or_create()
|
||||
await await_log(server.logger.info(f'INFO Snake: {snake_config}'))
|
||||
return snake_config
|
||||
|
||||
@blueprint.post('/start')
|
||||
async def on_start():
|
||||
server.metrics_collector.record_http_request('start')
|
||||
await server._prune_stale_games()
|
||||
game_state = await request.get_json()
|
||||
await server._create_game_board(game_state)
|
||||
await server._record_gameplay_start(game_state)
|
||||
await await_log(server.logger.info(f'GAME START: {game_state['game']}'))
|
||||
return 'ok'
|
||||
|
||||
@blueprint.post('/move')
|
||||
async def on_move():
|
||||
server.metrics_collector.record_http_request('move')
|
||||
game_state = await request.get_json()
|
||||
move_started = time.perf_counter()
|
||||
game_board = cast(GameBoard, await server._get_game_board(game_state))
|
||||
next_move = game_board.snake_neat_make_a_move()
|
||||
await server._persist_game_board(game_state['game']['id'], game_board)
|
||||
await server._record_gameplay_turn(game_state, next_move, game_board)
|
||||
elapsed_ms = (time.perf_counter() - move_started) * 1000.0
|
||||
await server.metrics_collector.record_move(next_move, elapsed_ms)
|
||||
|
||||
if server.debug:
|
||||
await await_log(server.logger.debug(f'TURN: {game_state['turn']:3}, MOVE: {next_move:5}'))
|
||||
|
||||
return {'move': next_move}
|
||||
|
||||
@blueprint.post('/end')
|
||||
async def on_end():
|
||||
server.metrics_collector.record_http_request('end')
|
||||
await server._prune_stale_games()
|
||||
game_state = await request.get_json()
|
||||
if server.store_game_state:
|
||||
game_board = cast(GameBoard, await server._get_game_board(game_state, end=True))
|
||||
if server.check_tls_security:
|
||||
await game_board.save(
|
||||
StorageLoader.build(server.storage_type),
|
||||
file_path=os.path.join(server.data_path, 'data'),
|
||||
database=os.getenv('EDGEDB_DATABASE', None),
|
||||
tls_security=None,
|
||||
)
|
||||
else:
|
||||
await game_board.save(
|
||||
StorageLoader.build(server.storage_type),
|
||||
file_path=os.path.join(server.data_path, 'data'),
|
||||
database=os.getenv('EDGEDB_DATABASE', None),
|
||||
)
|
||||
|
||||
await server._record_gameplay_end(game_state)
|
||||
await server._push_dashboard_games_update(game_state)
|
||||
await await_log(server.logger.info(f'GAME ENDED: Winner is {[x['name'] for x in game_state['board']['snakes']]}'))
|
||||
await server._delete_game_board(game_state)
|
||||
await server.metrics_collector.record_game_end(game_state)
|
||||
return 'ok'
|
||||
|
||||
@blueprint.get("/cleanup")
|
||||
async def cleanup():
|
||||
results = server._cleanup_database()
|
||||
return jsonify(data=json.loads(results), status=200)
|
||||
|
||||
return blueprint
|
||||
Reference in New Issue
Block a user