def mainloop(self,messagecb,eventcb): try: while self.running: try: data, address = self.s.recvfrom(8192) except socket.timeout: if self.running: continue else: break self.addr = address event = ord(data[0]) #print "Received event %i from %s" % (event,str(address)) if event == 10: n = ord(data[1]) name = data[2:] self.players.update([(n,name)]) if event == 13: n = ord(data[1]) text = data[3:] if not text.lower().startswith("a:"): messagecb(self.players[n],text) if event == 3: #gameover self.sayingame("/kill") eventcb(ord(data[0]),data[1:]) except Exception, e: Log.exception( e )
def mainloop(self, messagecb, eventcb): try: while self.running: try: data, address = self.s.recvfrom(8192) except socket.timeout: if self.running: continue else: break self.addr = address event = ord(data[0]) #print "Received event %i from %s" % (event,str(address)) if event == 10: n = ord(data[1]) name = data[2:] self.players.update([(n, name)]) if event == 13: n = ord(data[1]) text = data[3:] if not text.lower().startswith("a:"): messagecb(self.players[n], text) if event == 3: #gameover self.sayingame("/kill") eventcb(ord(data[0]), data[1:]) except Exception, e: Log.exception(e)
def __init__(self, output, ladder_id, config, db): super(AutomaticMatchToDbWrapper, self).__init__(db) self.config = config if os.path.exists(output): self.replay = output else: log_start = "[f=0000000] recording demo: " datapath = config.get("tasbot", "springdatapath") for line in output.split("\n"): if line.startswith(log_start): self.replay = os.path.join(datapath, line[len(log_start) :].split("\n")[0]) break try: os.path.exists(self.replay) except Exception, e: Log.error("match has no replay") Log.exception(e) raise e
def oncommandfromserver(self,command,args,socket): if command == "JOINED" : chan = args[0] nick = args[1] if chan in self.modchannels: self.db.SetPrimaryGame( nick, self.modname ) try: user = self.db.GetUser( nick ) #Log.info('%s -- %d -- %d'%(nick, user.welcome_sent,user.rank )) if not user.welcome_sent and user.rank < 1: #socket.send('say %s hello first time visitor %s\n'%(chan,nick) ) #user.welcome_sent = True self.db.SetUser( user ) except Exception, e: Log.exception(e) elif chan in self.channels: self.db.SetPrimaryGame( nick, 'multiple' )
def SubmitLadderReplay( self, replaypath, ladderid, do_validation=True ): try: if not self.db.LadderExists( ladderid ): Log.error( "Error: ladder %d does not exist" % ( ladderid ) ) return False else: try: open(replaypath).close() mr = AutomaticMatchToDbWrapper(replaypath, ladderid, self.config, self.db) return self.db.ReportMatch( mr, do_validation ) except UnterminatedReplayException: Log.error('skipping unterminated replay %s'%replaypath, 'ReplayReporter') except Exception,e: Log.error('reporting match failed', 'ReplayReporter') Log.exception(e) return False except Exception, e: Log.exception(e) return False
def sayingame(self, text): #print "Sending %s to spring" % text try: self.s.sendto(text, self.addr) except Exception, e: Log.exception(e)
def oncommandfromserver(self,command,args,socket): try: if command == "SAIDPRIVATE" and len(args) == 2 and args[1] == "!enable" and args[0] in self.app.admins: self.disabled = False socket.send("MYSTATUS %i\n" % int(int(self.listfull)+int(self.disabled)*2)) socket.send("SAYPRIVATE %s %s\n" % (args[0],"Hosting new games enabled")) self.app.config.set('autohost', "enabled", "1") self.app.SaveConfig() elif command == "SAIDPRIVATE" and len(args) == 2 and args[1] == "!disable" and args[0] in self.app.admins: self.disabled = True socket.send("MYSTATUS %i\n" % int(int(self.listfull)+int(self.disabled)*2)) socket.send("SAYPRIVATE %s %s\n" % (args[0],"Hosting new games disabled")) self.app.config.set('autohost', "enabled", "0") self.app.SaveConfig() elif command == "SAIDPRIVATE" and len(args) == 2 and args[1] == "!listbans" and args[0] in self.app.admins: x = 0 l0 = [] for b in self.bans: l0.append(b) x += 1 if x >= 5: socket.send("SAYPRIVATE %s %s\n" % (args[0],' | '.join(l0))) x = 0 l0 = [] socket.send("SAYPRIVATE %s %s\n" % (args[0],' | '.join(l0))) elif command == "SAIDPRIVATE" and len(args) >= 3 and args[1] == "!ban" and args[0] in self.app.admins: toban = args[2:] for b in toban: if not b in self.bans: self.bans.append(b) socket.send("SAYPRIVATE %s %s\n" % (args[0],b+" Banned")) else: socket.send("SAYPRIVATE %s %s\n" % (args[0],b+" is already banned")) self.app.config.set('autohost', "bans", ','.join(self.bans)) self.app.SaveConfig() socket.send("SAYPRIVATE %s %s\n" % (args[0],"Done.")) elif command == "SAIDPRIVATE" and len(args) >= 3 and args[1] == "!unban" and args[0] in self.app.admins: toban = args[2:] for b in toban: if not b in self.bans: socket.send("SAYPRIVATE %s %s\n" % (args[0],b+"is not currently banned")) else: self.bans.remove(b) socket.send("SAYPRIVATE %s %s\n" % (args[0],b+" has been unbanned")) self.app.config.set('autohost', "bans", ','.join(self.bans)) self.app.SaveConfig() socket.send("SAYPRIVATE %s %s\n" % (args[0],"Done.")) elif command == "SAIDPRIVATE" and len(args) == 2 and args[1] == "!registerall" and args[0] in self.app.admins: for b in self.botstatus: if not self.botstatus[b]: slot = b self.threads.append(thread.start_new_thread(self.botthread,(slot,self.an[slot],socket,args[0],self.ap,self))) self.botstatus[slot] = True time.sleep(1) if b + 1 == len(self.botstatus): # The bot spawned was the last one self.listfull = True socket.send("MYSTATUS 1\n") elif command == "SAIDPRIVATE" and len(args) == 2 and args[1] == "!spawn" and args[0] not in self.ul and not self.disabled: if args[0] in self.bans: socket.send("SAYPRIVATE %s %s\n" %(args[0],"\001 Error: You are banned!")) return freeslot = False slot = 0 for b in self.botstatus: if not self.botstatus[b]: freeslot = True slot = b break if freeslot: self.threads.append(thread.start_new_thread(self.botthread,(slot,self.an[slot],socket,args[0],self.ap,self))) socket.send("SAYPRIVATE %s %s\n" %(args[0],self.an[slot])) self.ul.append(args[0]) self.botstatus[slot] = True if b + 1 == len(self.botstatus): # The bot spawned was the last one self.listfull = True socket.send("MYSTATUS 1\n") else: socket.send("SAYPRIVATE %s %s\n" %(args[0],"\001 Error: All bots are spawned")) #elif command == "SAIDPRIVATE" and len(args) == 2 and args[1] == "!spawn" and len(self.ul) >= len(self.an): # socket.send("SAYPRIVATE %s %s\n" %(args[0],"\001 Error: All bots are spawned")) #elif command == "SAIDPRIVATE" and len(args) >= 1 and : # socket.send("SAYPRIVATE %s %s\n" %(args[0],"\002")) elif command == "LEFT" and args[0] == "autohost" and len(args) > 4 and args[3] == "inconsistent" and args[1] in self.bots: self.say_ah("Bot(%s) kicked by inconsistent data error , killing" % args[1]) try: if platform.system() == "Windows": handle = win32api.OpenProcess(1, 0, self.bots[args[1]]) win32api.TerminateProcess(handle, 0) else: os.kill(self.bots[args[1]],signal.SIGKILL) except Exception, e: Log.exception(e) except Exception, e: exc = traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2]) self.sayex_ah("*** EXCEPTION: BEGIN") for line in exc: self.sayex_ah(line) self.sayex_ah("*** EXCEPTION: END") Log.exception(e)
def ParseSpringOutput(self): with open(self.replay, 'rb') as demofile: parser = demoparser.DemoParser(demofile) open('/tmp/sc.txt', 'w').write(parser.getScript()) script = Script(parser.getScript()) self.players = script.players self.bots = script.bots self.teams = script.teams self.allies = script.allies self.options = dict(script.modoptions.items() + script.other.items() + script.mapoptions.items()) self.restrictions = script.restrictions self.gameid = 'no game id found' packet = True currentFrame = 0 playerIDToName = {} kop = open('/tmp/msg.data','w') def _invalidPlayer(name): return name in script.spectators.keys() or name not in self.players while packet: packet = parser.readPacket() try: messageData = demoparser.parsePacket(packet) kop.write(str(messageData)) kop.write('\n') def clean(name): return name.replace('\x00','') if messageData: try: clean_name = clean(messageData['playerName']) except: pass if messageData['cmd'] == 'keyframe': currentFrame = messageData['framenum'] elif messageData['cmd'] == 'setplayername': if _invalidPlayer(clean_name): continue playerIDToName[messageData['playerNum']] = clean_name self.players[clean_name].connected = True elif messageData['cmd'] == 'startplaying' and messageData['countdown'] == 0: self.game_started = True elif messageData['cmd'] == 'gameover': if not self.game_started: Log.error( 'game not started on gameover found', 'Match.py' ) else: self.game_over = currentFrame elif messageData['cmd'] == 'gameid': self.gameid = messageData['gameID'] elif messageData['cmd'] == 'playerleft': playername = clean(messageData['playerName']) if _invalidPlayer(clean_name): continue if messageData['bIntended'] == 0: self.players[playername].timeout = True if messageData['bIntended'] == 1: self.players[playername].quit = True if messageData['bIntended'] == 2: self.players[playername].kicked = True elif messageData['cmd'] == 'team': if clean_name in script.spectators.keys(): continue if messageData['action'] == 'team_died': #team died event deadTeam = messageData['param'] for name,rank in self.players.iteritems(): if rank.team == deadTeam: self.players[name].died = currentFrame elif messageData['action'] == 'giveaway': #giving everything away == death self.players[clean_name].died = currentFrame except Exception, e: Log.exception(e) raise e kop.close() if self.game_over < 0: raise UnterminatedReplayException( self.gameid, self.ladder_id )
def ParseSpringOutput(self): with open(self.replay, "rb") as demofile: parser = demoparser.DemoParser(demofile) open("/tmp/sc.txt", "w").write(parser.getScript()) script = Script(parser.getScript()) self.players = script.players self.bots = script.bots self.teams = script.teams self.allies = script.allies self.options = dict(script.modoptions.items() + script.other.items() + script.mapoptions.items()) self.restrictions = script.restrictions self.gameid = "no game id found" packet = True currentFrame = 0 playerIDToName = {} kop = open("/tmp/msg.data", "w") def _invalidPlayer(name): return name in script.spectators.keys() or name not in self.players while packet: packet = parser.readPacket() try: messageData = demoparser.parsePacket(packet) kop.write(str(messageData)) kop.write("\n") def clean(name): return name.replace("\x00", "") if messageData: try: clean_name = clean(messageData["playerName"]) except: pass if messageData["cmd"] == "keyframe": currentFrame = messageData["framenum"] elif messageData["cmd"] == "setplayername": if _invalidPlayer(clean_name): continue playerIDToName[messageData["playerNum"]] = clean_name self.players[clean_name].connected = True elif messageData["cmd"] == "startplaying" and messageData["countdown"] == 0: self.game_started = True elif messageData["cmd"] == "gameover": print("GAMEOVER") if not self.game_started: Log.error("game not started on gameover found", "Match.py") else: self.game_over = currentFrame elif messageData["cmd"] == "gameid": self.gameid = messageData["gameID"] elif messageData["cmd"] == "playerleft": playername = clean(messageData["playerName"]) if _invalidPlayer(clean_name): continue if messageData["bIntended"] == 0: self.players[playername].timeout = True if messageData["bIntended"] == 1: self.players[playername].quit = True if messageData["bIntended"] == 2: self.players[playername].kicked = True elif messageData["cmd"] == "team": if clean_name in script.spectators.keys(): continue if messageData["action"] == "team_died": # team died event deadTeam = messageData["param"] for name, rank in self.players.iteritems(): if rank.team == deadTeam: self.players[name].died = currentFrame elif messageData["action"] == "giveaway": # giving everything away == death self.players[clean_name].died = currentFrame except Exception, e: Log.exception(e) raise e kop.close() # if self.game_over < 0 or len(self.teams) < 2: # raise UnterminatedReplayException( self.gameid, self.ladder_id ) print("game over %d" % self.game_over)
def sayingame(self,text): #print "Sending %s to spring" % text try: self.s.sendto(text,self.addr) except Exception, e: Log.exception( e )