#!/usr/bin/python import fileinput import json import time import calendar import shutil import re logfile = "/home/archangelic/irc/log" # logfile = "/home/jumblesale/Code/irc/log" outfile = "/home/krowbar/logs/chatStats.json" # hash keyed by "user" that contains a start timestamp, last timestamp, last said string, chat count, letter count, and word count userData = {} # also now happy emotes and sad emotes rejectRegexp = "http[s]?://|[0-9]{2}[;:][0-9]{2}" happyRegexp = ":[-]?[])}]" sadRegexp = ":[-]?[[({]" nameFix = { "archangel": "archangelic", "jumblesal": "jumblesale", "hardmath1": "kc", "hardmath123": "kc", "bendorphan": "endorphant", "endorphan": "endorphant", "synergian": "synergiance", } with open(logfile, "r") as log: lastUser = "" currentStreak = 1 for line in log: try: time, user, message = line.split("\t", 3) time = int(time) if nameFix.has_key(user): user = nameFix[user] else: user = user.lower() except ValueError: continue # There are some bad lines in the log file that we'll ignore if we can't parse if user in userData: day = time / 86400 # seconds in a day if userData[user]["startTime"] == 0: userData[user]["startTime"] = time if userData[user]["lastDay"] != day: userData[user]["daysActive"] += 1 userData[user]["lastDay"] = day if lastUser == user: currentStreak += 1 if currentStreak > userData[user]["streak"]: userData[user]["streak"] = currentStreak else: currentStreak = 1 if userData[user]["lastMention"]: resTime = time - userData[user]["lastMention"] userData[user]["responseTime"] += min( resTime, 7200 ) # cap the value at 2hrs, things get skewed toward the high end otherwise userData[user]["lastMention"] = 0 userData[user]["endTime"] = time # userData[user]['lastSaid'] = message userData[user]["lineCount"] += 1 userData[user]["wordCount"] += len(message.split()) userData[user]["charCount"] += len(message) else: # if they are new userData[user] = {} userData[user]["startTime"] = time userData[user]["endTime"] = time # userData[user]['lastSaid'] = message userData[user]["lineCount"] = 1 userData[user]["wordCount"] = len(message.split()) userData[user]["charCount"] = len(message) userData[user]["daysActive"] = 1 userData[user]["lastDay"] = time / 86400 userData[user]["streak"] = 1 userData[user]["mentions"] = 0 userData[user]["lastMention"] = 0 userData[user]["responseTime"] = 0 userData[user]["botUse"] = 0 userData[user]["happyEmotes"] = 0 userData[user]["sadEmotes"] = 0 lastUser = user if message.rstrip() and message[0] == "!": userData[user]["botUse"] += 1 if not re.search(rejectRegexp, message): if re.search(happyRegexp, message): userData[user]["happyEmotes"] += 1 if re.search(sadRegexp, message): userData[user]["sadEmotes"] += 1 try: if ( message.rstrip() and message.split()[0][-1] == ":" ): # last character of first word name = message.split()[0][0:-1] if user != name and userData.has_key(name): userData[name]["mentions"] += 1 if not userData[name]["lastMention"]: userData[name]["lastMention"] = time except IndexError: print("##" + message + "##") continue with open(outfile + ".tmp", "w") as tmpFile: tmpFile.write(json.dumps(userData)) shutil.move(outfile + ".tmp", outfile)