class GameClient(object): def __init__(self, server, connection): super(GameClient, self).__init__() # internals self.number = None self.teamid = None self.buffer = [] self.x = 0 self.y = 0 self.r = 0 self.server = server # io initialisation self.io = WebSocket(connection) self.io.on('data', self._onData) self.io.on('close', self._onClose) self.io.on('pause', self._onPause) self.io.pause(False) def _onData(self, data): try: for d in data: if d.startswith('iwannaplay'): self._register() elif d.startswith('pos'): self._position(d) elif d.startswith('fire'): self._fire() elif d.startswith('hit'): self._hit(d) else: print "UNKNOWN ACTION", d except: print 'It was nasty:', data self.io.close() def _onClose(self): print 'client gone' if self.number: self.server.unregister(self) def _onPause(self, pause): if pause == False: for d in self.buffer: self.io.write(d) def _write(self, data): if self.io.w_paused: if len(self.buffer) > 70: # Sloooowpoke self.io.close() return self.buffer.append(data) else: self.io.write(data) def _register(self): self.server.register(self) if not self.number: self._write('fuckoff') print 'we are not in mood', self.number else: self._write('level:%s' % self.server.getLevel(self)) self._write('okay:%d:%d' % (self.teamid, self.number)) stats = self.server.getStats() self._write('stats:%d:%d:%d:%d' % (stats[0], stats[1], stats[2], stats[3])) self.server.updatePosClient(self) print 'client registred', self.number def _position(self, d): (x,y,r) = d.split(':')[1:] x = int(x) y = int(y) r = int(r) if self.x!=x or self.y!=y or self.r!=r: self.x = x self.y = y self.r = r self.server.updateClientPos(self) def _fire(self): self.server.updateFire(self) def _hit(self, d): (who, by) = d.split(':')[1:] who = int(who) by = int(by) self.server.updateHit(who, by) def anyHit(self, who, by): self._write('hit:%d:%d' % (who, by)) def updateOpponent(self, client): self._write('op_update:%d:%d:%d:%d' % (client.teamid, client.x, client.y, client.r)) def updateOpponentFire(self, client): self._write('op_fire:%d' % (client.teamid)) def removeOpponent(self, client): self._write('op_remove:%d' % client.teamid)