from demo2 import Demo from demparse import * import sys, time def do(fname): ts = [] kills = 0 secs = 0 skill = '' time = '' players = [] interest = tuple(c.code for c in [UpdateStat, ServerInfo, KilledMonster, FoundSecret, Print, UpdateName]) for block in Demo(fname): for m in block.filtered(interest): cls = m.__class__ if cls is ServerInfo: si = m players = ['']*si.maxclients elif cls is UpdateStat: if m.index == 11: maxsecs = m.value elif m.index == 12: maxkills = m.value elif cls is KilledMonster: kills += 1 elif cls is FoundSecret: secs += 1 elif cls is UpdateName: players[m.player] = m.netname elif cls is Print: if m.text.startswith("Playing on"): skill = block.next().text[0] if 'The recorded time was' in m.text: while 1: m = block.next() if m.__class__ is not Print or '\n' in m.text: break else: time += m.text if secs == maxsecs and kills == maxkills: skill += 'H' else: skill += 'R' for i in range(len(players)): players[i] = ''.join(map(scrub, players[i])) if len(players) > 1: skill += str(len(players)) d = time.find('.') t = time[:d] if ':' in t: m, s = map(int, t.split(':')) s += 60*m else: s = int(t) t = '%d:%02d'%divmod(s, 60) print si.models[0][5:-4], skill, t, players def scrub(n): if ord(n) >= 128: return '?' else: return n def main(argv): for fname in argv: do(fname) if __name__ == '__main__': T = time.time() main(sys.argv[1:]) print time.time() - T