1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
from flask import Blueprint, request, make_response
from flask_socketio import SocketIO, emit, Namespace
from game.voerbak_connector import bord
from auth.login_token import token_login
from db import cursor, connection
import time
import json
from socket_io import io
games = {}
listeners = {}
class game:
def __init__(self, game_id, io, player_1_id, player_2_id):
self.game_id = game_id
self.board = bord(7, 6)
self.io = io
self.player_1_id = player_1_id
self.player_2_id = player_2_id
def send(self, message, data):
if not self.game_id in listeners: return
for listener in listeners[self.game_id]:
self.io.emit(message, data, room=listener)
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
if user_id != move: return
self.board.drop_fisje(column)
self.send("fieldUpdate", { "field": self.board.board })
now = int( time.time() * 1000 )
cursor.execute("update games set last_activity = ?, moves = moves || ? || ',' where game_id = ?", [now, column, self.game_id])
connection.commit()
if len(self.board.win_positions) > 0 or self.board.board_full:
outcome = "d"
if not self.board.board_full:
winner = self.board.board[int(self.board.win_positions[0][0])]
outcome = "w" if winner == "2" else "l"
self.send("finish", {
"winPositions": self.board.win_positions,
"boardFull": self.board.board_full
})
self.close("finished", outcome)
return
self.send("turnUpdate", { "player1": self.board.player_1 })
def resign(self):
self.board.kill_voerbak()
self.send("resign", "")
self.close("resign", "d")
def close(self, new_status, outcome):
cursor.execute(" ".join([
"update games set",
"moves = moves || '0',",
"duration = ?,",
"status = ?,",
"outcome = ?",
"where game_id = ?"
]), [
int( time.time() * 1000 ) - cursor.execute("select started from games where game_id = ?", [self.game_id]).fetchone()[0],
new_status,
outcome,
self.game_id
])
connection.commit()
games.pop(self.game_id)
listeners.pop(self.game_id)
@io.on("newMove")
def new_move(data):
if not data["game_id"] or \
not data["move"] or \
not data["token"]: return
if not data["game_id"] in games: return
game = games[data["game_id"]]
if(len(game.board.win_positions) > 0 or game.board.board_full): return
user_id = token_login(data["token"])
game.move(user_id, data["move"])
@io.on("resign")
def resign(data):
if not data["game_id"] or \
not request.cookies.get("token"): return
if not data["game_id"] in games: return
user_id = token_login(request.cookies.get("token"))
if not user_id: return
if games[data["game_id"]].player_1_id != user_id and \
games[data["game_id"]].player_2_id != user_id:
return
games[data["game_id"]].resign()
@io.on("registerGameListener")
def register_game_listener(data):
if not data["game_id"]: return
if not data["game_id"] in listeners: listeners[data["game_id"]] = set()
listeners[data["game_id"]].add(request.sid)
|