Exemple #1
0
    def __init__(self, config, event=None):
        if event:
            logging.info("Starting %s game : %s" % (config.sv_gametype, event.title))
        else:
            logging.info("Starting %s game : free for all" % (config.sv_gametype, ))

        self.config = config
        self.event = event

        if self.event:
            self.server_info = {'players': {}}

        command = ["/usr/games/" + binary[config.sv_gametype], '-f', cfg[config.sv_gametype]]

        self.process = AsyncProcess(command)
        self.process.name = config.sv_gametype
        self.process.start()
        self.logs = open(fout[config.sv_gametype], 'a')
Exemple #2
0
class TwProcess():
    scoreboard = {}
    team = {}
    maps = set()
    teamscores = {'0': 0, '1': 0}

    def __init__(self, config, event=None):
        if event:
            logging.info("Starting %s game : %s" % (config.sv_gametype, event.title))
        else:
            logging.info("Starting %s game : free for all" % (config.sv_gametype, ))

        self.config = config
        self.event = event

        if self.event:
            self.server_info = {'players': {}}

        command = ["/usr/games/" + binary[config.sv_gametype], '-f', cfg[config.sv_gametype]]

        self.process = AsyncProcess(command)
        self.process.name = config.sv_gametype
        self.process.start()
        self.logs = open(fout[config.sv_gametype], 'a')

    def __del__(self):
        logging.info("Stopping " + self.config.sv_gametype + " game")

        self.tick()
        if self.event:
            self.save_server_info()

        self.process.stop()
        if self.process.is_alive():
            self.process.join(3.0)

        self.logs.close()

    def is_running(self):
        return self.process.is_running()

    def tick(self):
        last_line = ''
        for line in iter(self.process.readline, ''):
            if not re.match("^\[[a-z0-9]*\]\[", line):
                line = last_line.strip() + line.strip()

            self.process_global_data(line)

            if self.event:
                self.process_event_data(line)

            self.logs.write(line)
            last_line = line

        if self.event and self.is_running():
            try:
                self.server_info = get_server_info(port[self.config.sv_gametype])
            except:
                pass

        self.logs.flush()

    def process_global_data(self, line):
        # Join game
        if re.match("\[(.*)\]\[server\]: player has entered the game\. ClientID=(.*) addr=(.*):(.*)", line):
            when, id, ip, port = re.match(
                "\[(.*)\]\[server\]: player has entered the game\. ClientID=(.*) addr=(.*):(.*)", line).groups()
            self.player_ip = ip
        # Join team
        elif re.match("\[(.*)\]\[game\]: team_join player='(.*):(.*)' team=(.*)", line):
            when, id, player, team = re.match("\[(.*)\]\[game\]: team_join player='(.*):(.*)' team=(.*)", line).groups()
            p, created = GlobalPlayer.objects.get_or_create(name=player)
            p.ip = self.player_ip
            p.save()

    def process_event_data(self, line):
        # Map change
        if re.match("\[(.*)\]\[datafile\]: loading done. datafile='(.*)'", line):
            when, raw_map = re.match("\[(.*)\]\[datafile\]: loading done. datafile='(.*)'", line).groups()
            map_name, ext = os.path.splitext(os.path.basename(raw_map))
            self.event.map = map_name
        # Join team:
        elif re.match("\[(.*)\]\[game\]: team_join player='.*:(.*)' team=(.*)", line):
            when, player, team = re.match("\[(.*)\]\[game\]: team_join player='.*:(.*)' team=(.*)", line).groups()
            self.team[player] = team
        # Change team
        elif re.match("\[(.*)\]\[game\]: team_join player='.*:(.*)' m_Team=(.*)", line):
            when, player, team = re.match("\[(.*)\]\[game\]: team_join player='.*:(.*)' m_Team=(.*)", line).groups()
            self.team[player] = team
        # Capture flag
        elif re.match("\[(.*)\]\[game\]: flag_capture player='.*:(.*)'", line):
            when, player = re.match("\[(.*)\]\[game\]: flag_capture player='.*:(.*)'", line).groups()
            self.teamscores[self.team[player]] += 100
        # Grab flag
        elif re.match("\[(.*)\]\[game\]: flag_grab player='.*:(.*)'", line):
            when, player = re.match("\[(.*)\]\[game\]: flag_grab player='.*:(.*)'", line).groups()
            self.teamscores[self.team[player]] += 1
        # OpenFNG Freeze
        elif re.match("\[(.*)\]\[game\]: frzkill k:.*:'(.*)' v:.*:'.*' w:4", line):
            when, player = re.match("\[(.*)\]\[game\]: frzkill k:.*:'(.*)' v:.*:'.*' w:4", line).groups()
            self.teamscores[self.team[player]] += 1
        # OpenFNG sacrifice
        elif re.match("\[(.*)\]\[game\]: kill killer='.*:(.*)' victim='.*:.*' weapon=.* special=.*", line):
            when, player, victim = re.match(
                "\[(.*)\]\[game\]: kill killer='.*:(.*)' victim='.*:(.*)' weapon=.* special=.*", line).groups()
            if self.team[player] != self.team[victim]:
                self.teamscores[self.team[player]] += 10
            else:
                self.teamscores[self.team[player]] -= -2
        # Change name
        elif re.match("\[(.*)\]\[chat\]: \*\*\* '(.*)' changed name to '(.*)'", line):
            when, name, new_name = re.match("\[(.*)\]\[chat\]: \*\*\* '(.*)' changed name to '(.*)'", line).groups()
            self.team[new_name] = self.team[name]
            del self.team[name]

    def save_server_info(self):
        logging.log(logging.INFO, self.server_info)
        for player in self.server_info['players']:
            p, created = GlobalPlayer.objects.get_or_create(name=player['name'])
            p.clan = player['clan']
            p.save()

            self.scoreboard[player['name']] = player
            sb = ScoreBoard()
            sb.event = self.event
            sb.player = player['name']
            sb.clan = player['clan']
            sb.score = player['score']
            sb.country = player['country']
            sb.team = (self.team[player['name']] == '1')
            sb.save()

        ts = TeamScore()
        ts.event = self.event
        ts.score0 = self.teamscores['0']
        ts.score1 = self.teamscores['1']
        ts.save()