aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/game/info.py70
-rw-r--r--api/user/games.py43
2 files changed, 72 insertions, 41 deletions
diff --git a/api/game/info.py b/api/game/info.py
new file mode 100644
index 0000000..64812d8
--- /dev/null
+++ b/api/game/info.py
@@ -0,0 +1,70 @@
+from flask import Blueprint, request
+from functools import reduce
+from db import cursor
+from auth.login_token import token_login
+from user.info import format_user
+from ruleset import resolve_ruleset
+
+def outcome(outcome_str, player_1):
+ outcome_int = { "w": 1, "l": -1, "d": 0 }[outcome_str]
+ if not player_1: outcome_int *= -1
+ return { 1: "w", -1: "l", 0: "d" }[outcome_int]
+
+def format_game(game_id, user_id = None):
+ game = cursor.execute("select " + ", ".join([
+ "game_id", # 0
+ "parent_game", # 1
+ "moves", # 2
+ "player_1_id", # 3
+ "player_2_id", # 4
+ "outcome", # 5
+ "created", # 6
+ "started", # 7
+ "duration", # 8
+ "rating_delta_player_1", # 9
+ "rating_delta_player_2", # 10
+ "ruleset", # 11
+ "status", # 12
+ "private", # 13
+ ]) + " from games where game_id = ?", [game_id]).fetchone()
+ is_player_1 = game[4] != user_id
+ opponent = game[4] if is_player_1 else game[3]
+ return {
+ "id": game[0],
+ "parent": game[1],
+ "moves": [] if len(game[2]) == 0 else [int(move) for move in str(game[2] + "0").split(",")],
+ "opponent": None if not opponent else format_user(opponent),
+ "outcome": None if not game[5] else outcome(game[5], is_player_1),
+ "created": game[6],
+ "started": game[7],
+ "duration": game[8],
+ "rating": game[9] if is_player_1 else game[10],
+ "rating_opponent": game[10] if is_player_1 else game[9],
+ "ruleset": resolve_ruleset(game[11]),
+ "status": game[12],
+ "private": bool(game[13]),
+ }
+
+def valid_game_id(game_id):
+ query = cursor.execute("select game_id from games where game_id = ?", [game_id]).fetchone()
+ return bool(query)
+
+game_info = Blueprint('game_info', __name__)
+
+@game_info.route('/info', methods = ['POST'])
+def index():
+ data = request.get_json()
+ if not data: return "", 400
+
+ game_id = data.get("id") or ""
+ if not game_id: return "", 400
+
+ user_id = None
+ token = request.cookies.get("token") or ""
+ if token: user_id = token_login(token)
+
+ if not valid_game_id(game_id): return "", 403
+
+ return format_game(game_id, user_id), 200
+
+dynamic_route = ["/game", game_info]
diff --git a/api/user/games.py b/api/user/games.py
index 1cd19f2..6072afa 100644
--- a/api/user/games.py
+++ b/api/user/games.py
@@ -5,48 +5,9 @@ from db import cursor
from auth.login_token import token_login
from user.info import format_user
from ruleset import resolve_ruleset
+from game.info import format_game
import json
-def outcome(outcome_str, player_1):
- outcome_int = { "w": 1, "l": -1, "d": 0 }[outcome_str]
- if not player_1: outcome_int *= -1
- return { 1: "w", -1: "l", 0: "d" }[outcome_int]
-
-def game_info(game_id, user_id = None):
- game = cursor.execute("select " + ", ".join([
- "game_id", # 0
- "parent_game", # 1
- "moves", # 2
- "player_1_id", # 3
- "player_2_id", # 4
- "outcome", # 5
- "created", # 6
- "started", # 7
- "duration", # 8
- "rating_delta_player_1", # 9
- "rating_delta_player_2", # 10
- "ruleset", # 11
- "status", # 12
- "private", # 13
- ]) + " from games where game_id = ?", [game_id]).fetchone()
- is_player_1 = game[4] != user_id
- opponent = game[4] if is_player_1 else game[3]
- return {
- "id": game[0],
- "parent": game[1],
- "moves": [] if len(game[2]) == 0 else [int(move) for move in str(game[2] + "0").split(",")],
- "opponent": None if not opponent else format_user(opponent),
- "outcome": None if not game[5] else outcome(game[5], is_player_1),
- "created": game[6],
- "started": game[7],
- "duration": game[8],
- "rating": game[9] if is_player_1 else game[10],
- "rating_opponent": game[10] if is_player_1 else game[9],
- "ruleset": resolve_ruleset(game[11]),
- "status": game[12],
- "private": bool(game[13]),
- }
-
def sum_games(user_id): #! SANITIZE USER_ID FIRST
wld_querys = [' '.join([
"select count(game_id)",
@@ -79,7 +40,7 @@ def fetch_games(user_id, count):
export = []
for game_id in game_ids:
- export.append(game_info(game_id[0], user_id))
+ export.append(format_game(game_id[0], user_id))
return export