예제 #1
0
		def disqus_matches():
			try:
				return dict([ (int(x['identifiers'][0][6:]),x['posts']) for x in self._disqus.forums.listThreads(forum=self.forum) if x['identifiers'][0][:5] == 'match' ])
			except APIError,a: 
				if str(a.code) != '5':
					raise a
				else:
					Log.error('Invalid disqus api-keys')
예제 #2
0
 def GetPrintableRepresentation(self, rank_list, db):
     if len(rank_list) < 1:
         return "no ranks to represent"
     else:
         el = rank_list[0]
         for algo in self.algos.values():
             if isinstance(el, algo.GetDbEntityType()):
                 return algo.GetPrintableRepresentation(rank_list, db)
         Log.error("no suitable algo for printing rank list found ", "Ranking")
         return ""
예제 #3
0
	def Update(self,ladder_id,match,db):
		#print 'match id %d'%match.id
		scores, result_dict = calculateWinnerOrder(match,db)
		session = db.session()

		teams = defaultdict(tuple)
		player_id_map = defaultdict(list)
		def constant_factory(value):
			import itertools
			return itertools.repeat(value).next
		minteam_score = defaultdict(constant_factory(100000))
		for name,result in result_dict.iteritems():
			score = scores[name] * -1
			player_id = session.query( Player ).filter( Player.nick == name ).first().id
			rank = session.query( TrueskillRanks ).filter( TrueskillRanks.ladder_id == ladder_id ).filter( TrueskillRanks.player_id == player_id ).first()
			if not rank:
				rank = TrueskillRanks()
				rank.ladder_id = ladder_id
				rank.player_id = player_id
			session.add(rank)

			rank.rank = score
			l = list(teams[result.team])
			l.append(rank.rating)
			teams[result.team] = tuple(l)
			player_id_map[result.team].append(player_id)
			minteam_score[result.team] = min(minteam_score[result.team],score)
		session.commit()

		ordered_teams = []
		ordered_minteam_score = []
		team_ids = teams.keys()
		team_ids.sort()
		for i in range(len(teams)):
			ordered_teams.append(teams[team_ids[i]])
			ordered_minteam_score.append(minteam_score[team_ids[i]])
		i = 0
		if len(ordered_teams) < 2:
			Log.error('less than 2 teams, cannot update ranking')
			raise Exception('not enough teams')
		for team_ratings in trueskill.transform_ratings(ordered_teams,ordered_minteam_score):
			j = 0
			current_team = team_ids[i]
			q = session.query( TrueskillRanks ).filter( TrueskillRanks.ladder_id == ladder_id )
			for rating in team_ratings:
				pids = player_id_map[current_team]
				pid = pids[j]
				rank = q.filter( TrueskillRanks.player_id == pid ).one()
				rank.rating = rating
				session.add( rank )
				j += 1
			i += 1
		session.commit()
		session.close()
예제 #4
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
예제 #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 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 )
예제 #7
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)
예제 #8
0
def mError( msg ):
	Log.error( msg, '[LadderManager]' )
예제 #9
0
	def oncommandfromuser(self,fromwho,fromwhere,ispm,command,args,socket):
		try:
			if fromwho == self.app.config.get('tasbot', "nick"):
				return
			if len(command) > 0 and command[0] == "!":
				if not self.db.AccessCheck( -1, fromwho, Roles.User ):
					self.sayPermissionDenied( socket, command, fromwho, fromwhere, ispm )
					#log
					return
			else:
				return

			# !TODO refactor to use function dict
			if command == "!ladder":
				if not self.enabled and not self.db.AccessCheck( -1, fromwho, Roles.GlobalAdmin ):
					self.notifyuser( socket, fromwho, fromwhere, ispm, "Ladder functionality is temporarily disabled." )
					return
				ladderid = -1
				battleid = -2
				password = ""
				if len(args) > 0:
					if args[0].isdigit():
						ladderid = int(args[0])
						if len(args) > 1:
							password = "******".join(args[1:])
					else:
						password = "******".join(args[0:])
				try:
					battleid = self.tsc.users[fromwho].battleid
				except Exception:
					Log.bad("User " + fromwho + " not found")
				if ( battleid < 0 ):
					self.notifyuser( socket, fromwho, fromwhere, ispm, "You are not in a battle." )
				else:
					if not self.db.AccessCheck( ladderid, fromwho, Roles.User ):
						self.sayPermissionDenied( socket, command, fromwho, fromwhere, ispm )
						#log
						return
					if ( battleid in self.battleswithbots ):
						self.notifyuser( socket, fromwho, fromwhere, ispm, "A ladder bot is already present in your battle." )
					else:
						if ( ladderid == -1 or self.db.LadderExists( ladderid ) ):
							self.spawnbot( socket, battleid, password, fromwho, ladderid )
						else:
							self.notifyuser( socket, fromwho, fromwhere, ispm, "Invalid ladder ID." )
			if command == "!ladderjoinchannel":
				if not self.db.AccessCheck( -1, fromwho, Roles.GlobalAdmin ):
					self.sayPermissionDenied( socket, command, fromwho, fromwhere, ispm )
					#log
					return
				if len(args) < 1:
					self.notifyuser( socket, fromwho, fromwhere, ispm, "Invalid command syntax, check !ladderhelp for usage." )
				else:
					channel = " ".join(args[0:])
					socket.send("JOIN " + channel + "\n")
					if not channel in self.channels:
						self.channels.append(channel)
						self.app.config.set('join_channels',"channels", ','.join(self.channels))
						self.app.SaveConfig()
			if command == "!ladderleavechannel":
				if not self.db.AccessCheck( -1, fromwho, Roles.GlobalAdmin ):
					self.sayPermissionDenied( socket, command, fromwho, fromwhere, ispm )
					#log
					return
				if len(args) != 1:
					self.notifyuser( socket, fromwho, fromwhere, ispm, "Invalid command syntax, check !ladderhelp for usage." )
				else:
					channel = args[0]
					if channel in self.channels:
						socket.send("LEAVE " + channel + "\n")
						self.channels.remove(channel)
						self.app.config.set('join_channels',"channels", ','.join(self.channels))
						self.app.SaveConfig()
			if command == "!ladderlist":
				self.notifyuser( socket, fromwho, fromwhere, ispm, "Available ladders, format name: ID:" )
				for l in self.db.GetLadderList(Ladder.name):
					self.notifyuser( socket, fromwho, fromwhere, ispm, "%s: %d" %(l.name, l.id ) )
			if command == "!ladderadd":
				if not self.db.AccessCheck( -1, fromwho, Roles.GlobalAdmin ):
					self.sayPermissionDenied( socket, command, fromwho, fromwhere, ispm )
					#log
					return
				if len(args) < 1:
					self.notifyuser( socket, fromwho, fromwhere, ispm, "Ladder name can't be empty." )
				else:
					try:
						laddername = " ".join(args[0:])
						ladderid = self.db.AddLadder( laddername )
						self.notifyuser( socket, fromwho, fromwhere, ispm, "New ladder created, ID: " + str(ladderid) )
					except ElementExistsException, e:
						Log.error(e)
			if command == "!ladderremove":
				if not self.db.AccessCheck( -1, fromwho, Roles.GlobalAdmin ):
					self.sayPermissionDenied( socket, command, fromwho, fromwhere, ispm )
					#log
					return
				if len(args) != 1 or not args[0].isdigit():
					self.notifyuser( socket, fromwho, fromwhere, ispm, "Invalid command syntax, check !ladderhelp for usage." )
				else:
					ladderid = int(args[0])
					try:
						self.db.RemoveLadder( args[0] )
						self.notifyuser( socket, fromwho, fromwhere, ispm, "Ladder removed." )
					except ElementNotFoundException, e:
						self.notifyuser( socket, fromwho, fromwhere, ispm, "Invalid ladder ID." )