/
DEBServer.py
135 lines (105 loc) · 4.3 KB
/
DEBServer.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
128
129
130
131
132
133
134
135
import os, sys
import pickle
import socket
import struct
import traceback
import copy
import _thread as thread
from time import sleep
import msgs
from player import Player
class WinMain:
def __init__(self):
self.players = []
self.timeout = 300
if len(sys.argv) > 1:
for index, arg in enumerate(sys.argv):
if 'timeout=' in arg:
self.timeout = int(arg.split('=')[1])
del sys.argv[index]
break
if len(sys.argv) < 1:
self.subject = "Sample Subject"
else:
stuf = copy.copy(sys.argv)
del stuf[0]
self.subject = " ".join(stuf)
print("Starting new server on port 5565!")
print("Topic is", self.subject)
print("Timeout is", self.timeout)
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind(('', 5565))
thread.start_new_thread(self.getPlayers, ())
thread.start_new_thread(self.runTimer, ())
def getPlayers(self):
try:
while 1:
self.server.listen(1)
conn, _ = self.server.accept()
conn.setblocking(False)
self.players.append(Player(conn, None, len(self.players)))
self.sendMsg(self.players[len(self.players) - 1], msgs.AssignID(pid=len(self.players) - 1))
self.sendMsg(self.players[len(self.players) - 1], msgs.SetSubject(subject=self.subject))
except:traceback.print_exc(file=sys.stdout)
def update(self):
for player in self.players:
try:
datalen, = struct.unpack('h', player.getSocket().recv(2))
msg = pickle.loads(player.getSocket().recv(datalen))
self.processMsg(msg, player)
except socket.error as e:
if e.errno == 10035: pass
if e.errno == 10054:
self.killPlayer(player)
except:traceback.print_exc(file=sys.stdout)
def sendMsg(self, receiver, msg):
msg = pickle.dumps(msg)
msg = struct.pack('h', len(msg)) + msg
receiver.socket.send(msg)
def broadcastMsg(self, msg):
msg = pickle.dumps(msg)
for player in self.players:
player.socket.send(struct.pack('h', len(msg)) + msg)
def processMsg(self, msg, sender=...):
if msg.getID() == msgs.MSG_SETNAME:
sender.setName(msg.name)
self.broadcastMsg(msgs.Chat(chat=msg.name + " has joined the debate!"))
print("Got name:", msg.name)
elif msg.getID() == msgs.MSG_CHAT:
print("CHAT:", msg.getChat())
thecolor = {True: 1, False: 4, None: 15}[sender.getTeam()]
self.broadcastMsg(msgs.Chat(chat=sender.name + ": " + msg.getChat(), color=thecolor))
elif msg.getID() == msgs.MSG_SETTEAM:
print(sender.getName(), "changed team to:", str(msg.getTeam()))
sender.setTeam(msg.getTeam())
self.sendMsg(sender, msgs.SetTeam(team=msg.getTeam()))
elif msg.getID() == msgs.MSG_SETSUBJ:
self.subject = msg.getSubject()
print(sender.getName(), "changed the subject to", self.subject)
self.broadcastMsg(msg)
elif msg.getID() == msgs.MSG_RESETTIMEOUT:
self.timeout = msg.getTimeout()
thread.start_new_thread(self.runTimer, ())
def killPlayer(self, player):
for index, item in enumerate(self.players):
if item is player:
del self.players[index]
self.broadcastMsg(msgs.Chat(item.getName() + " has left the debate."))
break
def mainLoop(self):
while 1: self.update()
def runTimer(self):
sleep(self.timeout)
procount = 0
concount = 0
for player in self.players:
if player.team == True:
procount += 1
if player.team == False:
concount += 1
if procount == concount:
self.broadcastMsg(msgs.Chat("GAME OVER! There was a tie!", color=3))
else:
self.broadcastMsg(msgs.Chat("GAME OVER! Team " + {True: "Pro", False:"Con"}[procount>concount] + " had the majority vote!", color=3))
winmain = WinMain()
winmain.mainLoop()