-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
125 lines (107 loc) · 3.95 KB
/
server.py
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import socket
import select
import sys
import json
import helper
import maze
from datetime import datetime, timedelta
if len(sys.argv) < 2:
print("need to give server ip")
print(sys.argv)
sys.exit(1)
debug_mode = "-d" in sys.argv
# Constants
server = sys.argv[1]
port = 5555
class AllState:
def __init__(self):
# format: { name: (xPos, yPos)}
self.locations = {}
self.maze_width = 30
self.maze_height = 30
self.maze, self.start, self.end, self.solution = maze.generate_maze(self.maze_width, self.maze_height)
self.maze[self.start[0]][self.start[1]] = '.'
self.barrier_positions = []
self.colors = {}
for i in range(30, len(self.solution), 30):
self.barrier_positions.append(self.solution[i])
# Create a socket to listen on
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
listen_socket.bind((server, port))
except socket.error as e:
str(e)
sys.exit(1)
# Only accept 2 connections
listen_socket.listen(helper.NUM_CLIENTS)
print("Waiting for connections...Server Started")
# Initialize
game_state = AllState()
num_finished = 0
finished = []
start_time = None
# Start the game logic (No longer accept any new connections)
connections = [listen_socket]
while True:
# Get the list sockets which are readable
read_sockets, write_sockets, error_sockets = select.select(connections, [], [])
for sock in read_sockets:
if sock is listen_socket:
# server accepting new connection
client, _ = sock.accept()
connections.append(client)
continue
data = str(sock.recv(1500, socket.MSG_WAITALL).decode())
if not data:
connections.remove(sock)
sock.close()
continue
else:
data = json.loads(data)
# print("data received", data)
if data["type"] == helper.ENTER:
game_state.locations[data["name"]] = (0, 0)
game_state.colors[data["name"]] = data["color"]
if len(game_state.locations) == helper.NUM_CLIENTS or debug_mode:
# everyone entered the game, we can return the maze board
serialized_maze = maze.serialize_maze(game_state.maze)
if start_time is None:
start_time = datetime.now() + timedelta(seconds=4)
d = helper.toJSON({
"type": helper.BEGIN,
"start": game_state.start,
"end": game_state.end,
"maze": serialized_maze,
"players": list(game_state.locations.keys()),
"barriers": game_state.barrier_positions,
"start_time": start_time.isoformat(),
})
sock.sendall(d)
else:
d = helper.toJSON({
"type": helper.PLAYERS,
"players": list(game_state.locations.keys())
})
sock.sendall(d)
elif data['type'] == helper.POSITION:
name = data["name"]
position = data["position"]
game_state.locations[name] = position
d = helper.toJSON({
"type": helper.ALL_POSITIONS,
"locations": game_state.locations,
"colors": game_state.colors,
})
sock.sendall(d)
elif data['type'] == helper.FINISH:
name = data["name"]
if name not in finished:
finished.append(name)
f = helper.toJSON({
"type": helper.FINISH,
"rankings": finished
})
sock.sendall(f)
else:
print("unhandled TYPE")
sys.exit(1)