aboutsummaryrefslogtreecommitdiff
path: root/api/game
diff options
context:
space:
mode:
Diffstat (limited to 'api/game')
-rw-r--r--api/game/accept.py1
-rw-r--r--api/game/cleanup.py2
-rw-r--r--api/game/info.py10
-rw-r--r--api/game/new.py2
-rw-r--r--api/game/random.py3
-rw-r--r--api/game/socket.py1
-rw-r--r--api/game/voerbak_connector.py8
7 files changed, 26 insertions, 1 deletions
diff --git a/api/game/accept.py b/api/game/accept.py
index 7aab697..073f422 100644
--- a/api/game/accept.py
+++ b/api/game/accept.py
@@ -12,6 +12,7 @@ from game.new import start_game
join_game = Blueprint('game_accept', __name__)
+# join a game by game_id (public or private)
@join_game.route('/accept', methods = ['POST'])
@auth_required("user")
def index(game_id):
diff --git a/api/game/cleanup.py b/api/game/cleanup.py
index 3c285e1..0a9aa46 100644
--- a/api/game/cleanup.py
+++ b/api/game/cleanup.py
@@ -2,6 +2,7 @@ from db import cursor, connection
import threading
import time
+# cleanup function that's ran every five minutes
def cleanup():
now = int( time.time() * 1000 )
old_games = cursor.execute("select game_id from games where (status = \"wait_for_opponent\" or status = \"in_progress\") and last_activity < ?", [now - 5 * 60 * 1e3]).fetchall()
@@ -17,5 +18,6 @@ def set_interval(func, sec): # https://stackoverflow.com/questions/2697039/pytho
t.start()
return t
+# run every five minutes
set_interval(cleanup, 5 * 60)
diff --git a/api/game/info.py b/api/game/info.py
index 030c6ae..76a3ef8 100644
--- a/api/game/info.py
+++ b/api/game/info.py
@@ -22,12 +22,19 @@ def format_game(game_id, user_id = None):
"status", # 12
"private", # 13
]) + " from games where game_id = ?", [game_id]).fetchone()
+
is_player_1 = game[4] != user_id
+
+ # get opponent from perspective of `user_id`
opponent = game[4] if is_player_1 else game[3]
+
+ # parse moves into list and return empty list if moves string is empty
+ moves = [] if len(game[2]) == 0 else [int(move) for move in str(game[2] + "0").split(",")]
+
return {
"id": game[0],
"parent": game[1],
- "moves": [] if len(game[2]) == 0 else [int(move) for move in str(game[2] + "0").split(",")],
+ "moves": moves,
"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],
@@ -40,6 +47,7 @@ def format_game(game_id, user_id = None):
"private": bool(game[13]),
}
+# check if game_id exists in database
def valid_game_id(game_id):
query = cursor.execute("select game_id from games where game_id = ?", [game_id]).fetchone()
return bool(query)
diff --git a/api/game/new.py b/api/game/new.py
index 5d8d5b7..9868099 100644
--- a/api/game/new.py
+++ b/api/game/new.py
@@ -36,6 +36,8 @@ new_game = Blueprint('new_game', __name__)
@new_game.route('/new', methods = ["GET", "POST"])
@auth_required("user")
def index(user_id):
+ # create a new private game (join by link)
+ #TODO: friend invites + notifications
game_id = create_game(user_id, True)
return { "id": game_id }, 200
diff --git a/api/game/random.py b/api/game/random.py
index 7e4c512..4d70b56 100644
--- a/api/game/random.py
+++ b/api/game/random.py
@@ -14,13 +14,16 @@ random_game = Blueprint('random', __name__)
@random_game.route('/random')
@auth_required("user")
def index(user_id):
+ # get public_games (random opponent queue)
public_games = cursor.execute("select game_id from games where private = FALSE and status = \"wait_for_opponent\"").fetchall()
game_started = False
+ # create a new public game if the queue is empty
if len(public_games) == 0:
game_id = create_game(user_id)
player_1 = True
+ # otherwise join a random public game
else:
game_id = random.choice(public_games)[0]
diff --git a/api/game/socket.py b/api/game/socket.py
index 5f0d710..cf45eb6 100644
--- a/api/game/socket.py
+++ b/api/game/socket.py
@@ -18,6 +18,7 @@ class game:
self.player_1_id = player_1_id
self.player_2_id = player_2_id
+ # drop a disc in `column`
def move(self, user_id, column):
if user_id != self.player_1_id and user_id != self.player_2_id: return
move = self.player_1_id if self.board.player_1 else self.player_2_id
diff --git a/api/game/voerbak_connector.py b/api/game/voerbak_connector.py
index 2e90ad4..048a5d1 100644
--- a/api/game/voerbak_connector.py
+++ b/api/game/voerbak_connector.py
@@ -25,6 +25,7 @@ class bord:
stderr=None)
self.process.stdin.flush()
+ # get output from voerbak without trailing newline character (this might break on windows because crlf)
def get_output(self):
return self.process.stdout.readline().decode()[:-1]
@@ -32,24 +33,30 @@ class bord:
self.process.stdin.write(bytearray("0", "utf-8"))
self.process.stdin.flush()
+ # read messages from voerbak
def update_board(self):
buffer = self.get_output()
while not buffer.isdigit():
+ # win message
if buffer.startswith("w:"):
self.win_positions.append(buffer[2:].split("-"))
log.info(f"won: {buffer[2:].split('-')}")
self.kill_voerbak()
+ # error message
elif buffer.startswith("e:"):
log.warning(buffer[2:])
+ # turn update message
elif buffer.startswith("m:"):
substr = buffer[2:]
self.player_1 = True if substr == "true" else False
+ # draw game message
elif buffer.startswith("d:"):
self.board_full = True
self.kill_voerbak()
buffer = self.get_output()
self.board = buffer
+ # debug board print function
def print(self):
for y in range(self.height -1, -1, -1):
for x in range(self.width):
@@ -66,6 +73,7 @@ class bord:
self.process.stdin.flush()
self.update_board()
+# debug game
def main():
gert = bord(7, 6)
while True: