From b54b79feaece98defc88f3eaf7f3d7b7af6ab4ae Mon Sep 17 00:00:00 2001 From: Russell Date: Mon, 11 Jan 2016 16:26:15 -0500 Subject: [PATCH] Chatstats work --- Code/irc/numberwangscores.txt | 3 +- Code/irc/puzzle.py | 11 +++++-- Code/irc/tildescores.txt | 9 ++++-- Code/python/chatstats.py | 51 ++++++++++++++++++++++++++++++++ public_html/chatstats/index.html | 51 ++++++++++++++++++++++++-------- 5 files changed, 107 insertions(+), 18 deletions(-) diff --git a/Code/irc/numberwangscores.txt b/Code/irc/numberwangscores.txt index a4c1435..67614dc 100644 --- a/Code/irc/numberwangscores.txt +++ b/Code/irc/numberwangscores.txt @@ -1,4 +1,5 @@ endorphant&^%68 -krowbar&^%119 +krowbar&^%142 karlen&^%2 jumblesal&^%37 +marcus&^%28 diff --git a/Code/irc/puzzle.py b/Code/irc/puzzle.py index 8d931a6..cb94c38 100644 --- a/Code/irc/puzzle.py +++ b/Code/irc/puzzle.py @@ -3,13 +3,14 @@ import random import inflect p = inflect.engine() +primes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71] def make_puzzle(): answer = 0 puzzle = random.choice(["Prove you're not a robot: ", "Are you a robot?: ", "Anti-bot check: ", "Counter-cndorphant measures: "]) puzzle += random.choice(["What is", "How many is", "What do you get from", "What do you get with", "What is the value of", "Can you answer", "Can you tell me"]) puzzle += " " - roll = random.randrange(0,4) + roll = random.randrange(0,6) var1 = random.randrange(1,10) var2 = random.randrange(1,10) @@ -31,8 +32,14 @@ def make_puzzle(): answer = var1 * 2 / var2 puzzle += p.number_to_words(var1*2) + " " + random.choice(["divided by", "over"]) + " " + p.number_to_words(var2) + " (no remainder)" elif roll == 4: - answer == var1 ** var2 + answer = var1 ** var2 puzzle += p.number_to_words(var1) + " to the " + p.ordinal(p.number_to_words(var2)) + " power" + elif roll == 5: + p1 = primes[random.randrange(0,len(primes))] + p2 = primes[random.randrange(0,len(primes))] + answer = str(p1) + ',' + str(p2) + puzzle += p.number_to_words(p1 * p2) + " when factored into its two primes (answer in the form of the two primes with a comman between)" + puzzle += "? (Answer with numbers)" return [answer, puzzle] diff --git a/Code/irc/tildescores.txt b/Code/irc/tildescores.txt index 75e75e4..48ac6db 100644 --- a/Code/irc/tildescores.txt +++ b/Code/irc/tildescores.txt @@ -1,8 +1,8 @@ -krowbar&^%292&^%1452094972 +krowbar&^%336&^%1452540446 karlen&^%272&^%1449500011 endorphant&^%682&^%1444775660 jumblesale&^%24&^%1426171214 -marcus&^%826&^%1452092376 +marcus&^%834&^%1452521269 papa&^%179&^%1438878499 epicmorphism&^%5&^%1421937744 audy&^%78&^%1442345315 @@ -14,7 +14,7 @@ cndorphant&^%788&^%1424094192 rain&^%17&^%1422310975 sl2c&^%91&^%1424847521 selfsame&^%1&^%1422230012 -bear&^%220&^%1452096373 +bear&^%223&^%1452518640 coaxial&^%8&^%1422325983 joe&^%8&^%1422325983 hardmath123&^%4&^%1422325983 @@ -33,3 +33,6 @@ cndorphbo&^%2&^%1447862524 santi&^%3&^%1447873216 insom&^%1&^%1450346059 tahnok&^%3&^%1450457276 +nilsding&^%8&^%1452449452 +vypr&^%3&^%1452470872 +synergian&^%1&^%1452541847 diff --git a/Code/python/chatstats.py b/Code/python/chatstats.py index b19e1d9..e7553cd 100644 --- a/Code/python/chatstats.py +++ b/Code/python/chatstats.py @@ -8,17 +8,46 @@ import shutil logfile = "/home/jumblesale/Code/irc/log" outfile = "/home/krowbar/logs/chatStats.json" userData = {} #hash keyed by "user" that contains a start timestamp, last timestamp, last said string, chat count, letter count, and word count +nameFix = { + '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 @@ -32,6 +61,28 @@ with open(logfile, "r") as log: 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 + + lastUser = user; + if message.rstrip() and message[0] == '!': + userData[user]['botUse'] += 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: diff --git a/public_html/chatstats/index.html b/public_html/chatstats/index.html index 310b1c7..4582ce0 100644 --- a/public_html/chatstats/index.html +++ b/public_html/chatstats/index.html @@ -13,11 +13,19 @@ charset="utf-8">--> data = []; jQuery.getJSON("/~krowbar/data/chatStats.json", function(json) { + now = new Date(); + nowSec = Math.round(now.getTime()/1000) _.forEach(json, function(userData, user) { data.push([user, new Date(userData.startTime*1000), new Date(userData.endTime*1000), - Number(((userData.endTime - userData.startTime) / 86400).toFixed(2)), userData.lineCount, + Number(((userData.endTime - userData.startTime) / 86400).toFixed(2)), + userData.daysActive, + Math.min(Number(((86400 * userData.daysActive) / (nowSec - userData.startTime)).toFixed(2)), 1), + userData.lineCount, userData.wordCount, Number((userData.wordCount / userData.lineCount).toFixed(2)), - userData.charCount, Number((userData.charCount / userData.lineCount).toFixed(2))]); + userData.charCount, Number((userData.charCount / userData.lineCount).toFixed(2)), + userData.streak, userData.mentions, userData.botUse, + Number((userData.responseTime / (userData.mentions ? userData.mentions : 1) / 60).toFixed(2)), + ]); }); google.setOnLoadCallback(drawTable); }); @@ -25,22 +33,41 @@ charset="utf-8">--> function drawTable() { var dataTable = new google.visualization.DataTable(); + var minFormatter = new google.visualization.NumberFormat({pattern: '##.## minutes'}); + var dayFormatter = new google.visualization.NumberFormat({pattern: '## days'}); + var wordFormatter = new google.visualization.NumberFormat({pattern: '##.## words'}); + var charFormatter = new google.visualization.NumberFormat({pattern: '##.## chars'}); + var streakFormatter = new google.visualization.NumberFormat({pattern: '## lines'}); + var mentionsFormatter = new google.visualization.NumberFormat({pattern: '## mentions'}); - dataTable.addColumn('string', 'User'); - dataTable.addColumn('datetime', 'Start'); - dataTable.addColumn('datetime', 'End'); - dataTable.addColumn('number', 'Days Active'); - dataTable.addColumn('number', 'Lines'); - dataTable.addColumn('number', 'Words'); - dataTable.addColumn('number', 'per Line'); - dataTable.addColumn('number', 'Characters'); - dataTable.addColumn('number', 'per Line'); + dataTable.addColumn('string', 'User'); //col0 + dataTable.addColumn('datetime', 'First Spoke'); //col1 + dataTable.addColumn('datetime', 'Last Spoke'); //col2 + dataTable.addColumn('number', 'Total Time'); //col3 + dataTable.addColumn('number', 'Active on'); //col4 + dataTable.addColumn('number', 'Active Ratio');//col5 + dataTable.addColumn('number', 'Lines'); //col6 + dataTable.addColumn('number', 'Words'); //col7 + dataTable.addColumn('number', 'per Line'); //col8 + dataTable.addColumn('number', 'Characters'); //col9 + dataTable.addColumn('number', 'per Line'); //col10 + dataTable.addColumn('number', 'Chat Streak'); //col11 + dataTable.addColumn('number', 'Popularity'); //col12 + dataTable.addColumn('number', 'Bot Use'); //col13 + dataTable.addColumn('number', 'Avg response time'); //col14 dataTable.addRows(data); + dayFormatter.format(dataTable, 3); + dayFormatter.format(dataTable, 4); + wordFormatter.format(dataTable, 8); + charFormatter.format(dataTable, 10); + streakFormatter.format(dataTable, 11); + mentionsFormatter.format(dataTable, 12); + minFormatter.format(dataTable, 14); var table = new google.visualization.Table(document.getElementById('statTable')); - table.draw(dataTable, {showRowNumber: false, width:'80%', height: '60%', sortColumn:2, sortAscending:false}); + table.draw(dataTable, {showRowNumber: false, width:'95%', height: '60%', sortColumn:2, sortAscending:false}); }