-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathServer.py
127 lines (97 loc) · 4.02 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
126
127
import sys
from time import sleep, localtime
import random
from PodSixNet.Server import Server
from PodSixNet.Channel import Channel
PlayersReady = {}
n = 0
class ClientChannel(Channel):
"""
This is the server representation of a connected client.
"""
def __init__(self, *args, **kwargs):
self.nickname = ""
Channel.__init__(self, *args, **kwargs)
def Close(self):
self._server.DelPlayer(self)
def Network_ListPlayers(self, data):
self.Send({"action": "ListPlayers",
'ListPlayers': self._server.ListPlayers()})
def Network_ReadyToPlay(self, data):
global n
n += 1
self._server.SendToOthersR(
{"ready": data["ready"], "who": self.nickname})
PlayersReady[self.nickname] = data["ready"]
if len(PlayersReady) == 2 and (n == 2 or n == 6):
self._server.SendToAllP1({"P1": random.randint(1, 2)})
if len(PlayersReady) == 2 and n == 4:
self._server.SendToAllP1Bis({"P1": 0})
def Network_BombDropped(self, data):
self._server.SendToOthersB(
{"bomb": data["bomb"], "screensize": data["screensize"], "who": self.nickname})
def Network_Touched(self, data):
self._server.SendToOthersT(
{"touched": data["touched"], "bomb": data["bomb"], "B": data["B"], "who": self.nickname})
def Network_retry(self, data):
self._server.SendToOthersRep(
{"rep": data["rep"], "who": self.nickname})
def Network_nickname(self, data):
self.nickname = data["nickname"]
self._server.PrintPlayers()
self.Send({"action": "start"})
self.Send({"action": "ListPlayers"})
def Network_GameWinner(self, data):
print(data['Winner'], "gagne la partie contre", data['Loser'])
class MyServer(Server):
channelClass = ClientChannel
def __init__(self, *args, **kwargs):
Server.__init__(self, *args, **kwargs)
self.players = {}
print('Server launched')
def Connected(self, channel, addr):
self.AddPlayer(channel)
def AddPlayer(self, player):
print("New Player connected")
self.players[player] = True
def PrintPlayers(self):
print("players' nicknames :", [p.nickname for p in self.players])
def DelPlayer(self, player):
global n
print("Deleting Player " + player.nickname + " at "+str(player.addr))
del self.players[player]
if len(PlayersReady) != 0:
del PlayersReady[player.nickname]
n = 0
def ListPlayers(self):
return([p.nickname for p in self.players])
def SendToAllP1(self, data):
[p.Send({"action": "PlayerNumberOne", "P1": data["P1"], "listPlayers":[
p.nickname for p in self.players], "nickname":p.nickname}) for p in self.players]
def SendToAllP1Bis(self, data):
[p.Send({"action": "PlayerNumberOneBis", "P1": data["P1"]})
for p in self.players]
def SendToOthersR(self, data):
[p.Send({"action": "ReadyToPlay", "ready": data["ready"]})
for p in self.players if p.nickname != data["who"]]
def SendToOthersB(self, data):
[p.Send({"action": "BombDropped", "bomb": data["bomb"], "screensize": data["screensize"]})
for p in self.players if p.nickname != data["who"]]
def SendToOthersT(self, data):
[p.Send({"action": "Touched", "touched": data["touched"], "bomb": data["bomb"],
"B":data["B"]}) for p in self.players if p.nickname != data["who"]]
def SendToOthersRep(self, data):
[p.Send({"action": "retry", "rep": data["rep"]})
for p in self.players if p.nickname != data["who"]]
def Launch(self):
while True:
self.Pump()
sleep(0.001)
# get command line argument of server, port
if len(sys.argv) != 2:
print("Please use: python3", sys.argv[0], "host:port")
print("e.g., python3", sys.argv[0], "localhost:31425")
else:
host, port = sys.argv[1].split(":")
s = MyServer(localaddr=(host, int(port)))
s.Launch()