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')
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()