Entry 3237

playertime

   

Submitted by anonymous on Feb. 20, 2010 at 6:38 p.m.
Language: Python. Code size: 1.9 KB.

#!/usr/bin/env python
# a gift of cake and love, from ravice to fairy ;)

'''I'm in ur logs, finding ur most regular players'''

import os, re

logdir = 'logs'

log = [i for i in reduce(lambda x, y : x + y, (open('%s/%s' % (logdir, logfile)).readlines() for logfile in os.listdir(logdir))) if 'connect { steam_id' in i and 'BOT' not in i]

players = {}

def time(x):
	'''Returns the UNIX TIME of the event'''
	return re.search('''time: ([0-9]*)''', x).group(1)

def disconnect(x):
	'''Returns True if this is a disconnect event'''
	return True if 'disconnect' in x else False

def steamid(x):
	'''Returns the Steamid of a given log line'''
	try: return re.search("steam_id: '(STEAM_[0-9]:[0-9]:[0-9]*)", x).group(1)
	except AttributeError: del log[log.index(x)]

def name(x):
	'''Returns the name of a player on a given log line'''
	return re.search("name: '(.*)'", x).group(1)

for x in log:
	if not disconnect(x):
		_steamid = steamid(x)

		if _steamid not in players:
			players[_steamid] = [name(x), 0]

log = [(disconnect(i), steamid(i), time(i)) for i in log]

def find_disconnect(event):
	'''Finds the next disconnect event for that player and returns the difference in time'''
	for entry in log:
		if entry[1] == event[1]:
			if entry[0]:
				time = int(entry[2]) - int(event[2])
				del log[log.index(entry)]
				return time
			return 1800
	return False

timegenerator = (j for j in ((i[1], find_disconnect(i)) for i in log) if j[1])
for i in timegenerator: players[i[0]][1] += i[1]

playerlist = [tuple(i) for i in players.items()]
playerlist.sort(key = lambda x : x[1][1])
playerlist.reverse()

for player in playerlist:
	t = int(player[1][1])
	playtime = '%s minutes' % (t/60) if t/60 < 60 else '%s hours' % (t/60**2)

	print 'Name: %s\t\tSteamID: %s\t\tPlaytime: %s (~%s)' % (player[1][0], player[0], player[1][1], playtime)

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).