예제 #1
0
	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 )
예제 #2
0
 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)
예제 #3
0
 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
예제 #4
0
파일: gamebot.py 프로젝트: renemilk/slbot
	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' )
예제 #5
0
	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
예제 #6
0
 def sayingame(self, text):
     #print "Sending %s to spring" % text
     try:
         self.s.sendto(text, self.addr)
     except Exception, e:
         Log.exception(e)
예제 #7
0
	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)
예제 #8
0
	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 )
예제 #9
0
    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)
예제 #10
0
	def sayingame(self,text):
		#print "Sending %s to spring" % text
		try:
			self.s.sendto(text,self.addr)
		except Exception, e:
			Log.exception( e )