mirror of
https://github.com/RussellChamp/tilde-projects.git
synced 2026-10-28 00:22:34 +00:00
Chatstats work
This commit is contained in:
1 parent
86916fb5fa
commit
b54b79feae
5 files changed
+107
-18
No files matched your search
@@ -1,4 +1,5 @@
|
|||||||
endorphant&^%68
|
endorphant&^%68
|
||||||
krowbar&^%119
|
krowbar&^%142
|
||||||
karlen&^%2
|
karlen&^%2
|
||||||
jumblesal&^%37
|
jumblesal&^%37
|
||||||
|
marcus&^%28
|
||||||
+9
-2
@@ -3,13 +3,14 @@ import random
|
|||||||
import inflect
|
import inflect
|
||||||
|
|
||||||
p = inflect.engine()
|
p = inflect.engine()
|
||||||
|
primes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]
|
||||||
|
|
||||||
def make_puzzle():
|
def make_puzzle():
|
||||||
answer = 0
|
answer = 0
|
||||||
puzzle = random.choice(["Prove you're not a robot: ", "Are you a robot?: ", "Anti-bot check: ", "Counter-cndorphant measures: "])
|
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 += 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 += " "
|
puzzle += " "
|
||||||
roll = random.randrange(0,4)
|
roll = random.randrange(0,6)
|
||||||
var1 = random.randrange(1,10)
|
var1 = random.randrange(1,10)
|
||||||
var2 = random.randrange(1,10)
|
var2 = random.randrange(1,10)
|
||||||
|
|
||||||
@@ -31,8 +32,14 @@ def make_puzzle():
|
|||||||
answer = var1 * 2 / var2
|
answer = var1 * 2 / var2
|
||||||
puzzle += p.number_to_words(var1*2) + " " + random.choice(["divided by", "over"]) + " " + p.number_to_words(var2) + " (no remainder)"
|
puzzle += p.number_to_words(var1*2) + " " + random.choice(["divided by", "over"]) + " " + p.number_to_words(var2) + " (no remainder)"
|
||||||
elif roll == 4:
|
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"
|
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)"
|
puzzle += "? (Answer with numbers)"
|
||||||
return [answer, puzzle]
|
return [answer, puzzle]
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
krowbar&^%292&^%1452094972
|
krowbar&^%336&^%1452540446
|
||||||
karlen&^%272&^%1449500011
|
karlen&^%272&^%1449500011
|
||||||
endorphant&^%682&^%1444775660
|
endorphant&^%682&^%1444775660
|
||||||
jumblesale&^%24&^%1426171214
|
jumblesale&^%24&^%1426171214
|
||||||
marcus&^%826&^%1452092376
|
marcus&^%834&^%1452521269
|
||||||
papa&^%179&^%1438878499
|
papa&^%179&^%1438878499
|
||||||
epicmorphism&^%5&^%1421937744
|
epicmorphism&^%5&^%1421937744
|
||||||
audy&^%78&^%1442345315
|
audy&^%78&^%1442345315
|
||||||
@@ -14,7 +14,7 @@ cndorphant&^%788&^%1424094192
|
|||||||
rain&^%17&^%1422310975
|
rain&^%17&^%1422310975
|
||||||
sl2c&^%91&^%1424847521
|
sl2c&^%91&^%1424847521
|
||||||
selfsame&^%1&^%1422230012
|
selfsame&^%1&^%1422230012
|
||||||
bear&^%220&^%1452096373
|
bear&^%223&^%1452518640
|
||||||
coaxial&^%8&^%1422325983
|
coaxial&^%8&^%1422325983
|
||||||
joe&^%8&^%1422325983
|
joe&^%8&^%1422325983
|
||||||
hardmath123&^%4&^%1422325983
|
hardmath123&^%4&^%1422325983
|
||||||
@@ -33,3 +33,6 @@ cndorphbo&^%2&^%1447862524
|
|||||||
santi&^%3&^%1447873216
|
santi&^%3&^%1447873216
|
||||||
insom&^%1&^%1450346059
|
insom&^%1&^%1450346059
|
||||||
tahnok&^%3&^%1450457276
|
tahnok&^%3&^%1450457276
|
||||||
|
nilsding&^%8&^%1452449452
|
||||||
|
vypr&^%3&^%1452470872
|
||||||
|
synergian&^%1&^%1452541847
|
||||||
@@ -8,17 +8,46 @@ import shutil
|
|||||||
logfile = "/home/jumblesale/Code/irc/log"
|
logfile = "/home/jumblesale/Code/irc/log"
|
||||||
outfile = "/home/krowbar/logs/chatStats.json"
|
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
|
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:
|
with open(logfile, "r") as log:
|
||||||
|
lastUser = "";
|
||||||
|
currentStreak = 1
|
||||||
for line in log:
|
for line in log:
|
||||||
try:
|
try:
|
||||||
time, user, message = line.split("\t", 3)
|
time, user, message = line.split("\t", 3)
|
||||||
time = int(time)
|
time = int(time)
|
||||||
|
if nameFix.has_key(user):
|
||||||
|
user = nameFix[user]
|
||||||
|
else:
|
||||||
|
user = user.lower()
|
||||||
except ValueError:
|
except ValueError:
|
||||||
continue #There are some bad lines in the log file that we'll ignore if we can't parse
|
continue #There are some bad lines in the log file that we'll ignore if we can't parse
|
||||||
if user in userData:
|
if user in userData:
|
||||||
|
day = time / 86400 #seconds in a day
|
||||||
if userData[user]['startTime'] == 0:
|
if userData[user]['startTime'] == 0:
|
||||||
userData[user]['startTime'] = time
|
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]['endTime'] = time
|
||||||
#userData[user]['lastSaid'] = message
|
#userData[user]['lastSaid'] = message
|
||||||
userData[user]['lineCount'] += 1
|
userData[user]['lineCount'] += 1
|
||||||
@@ -32,6 +61,28 @@ with open(logfile, "r") as log:
|
|||||||
userData[user]['lineCount'] = 1
|
userData[user]['lineCount'] = 1
|
||||||
userData[user]['wordCount'] = len(message.split())
|
userData[user]['wordCount'] = len(message.split())
|
||||||
userData[user]['charCount'] = len(message)
|
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:
|
with open(outfile + ".tmp", "w") as tmpFile:
|
||||||
|
|||||||
@@ -13,11 +13,19 @@ charset="utf-8"></script>-->
|
|||||||
|
|
||||||
data = [];
|
data = [];
|
||||||
jQuery.getJSON("/~krowbar/data/chatStats.json", function(json) {
|
jQuery.getJSON("/~krowbar/data/chatStats.json", function(json) {
|
||||||
|
now = new Date();
|
||||||
|
nowSec = Math.round(now.getTime()/1000)
|
||||||
_.forEach(json, function(userData, user) {
|
_.forEach(json, function(userData, user) {
|
||||||
data.push([user, new Date(userData.startTime*1000), new Date(userData.endTime*1000),
|
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.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);
|
google.setOnLoadCallback(drawTable);
|
||||||
});
|
});
|
||||||
@@ -25,22 +33,41 @@ charset="utf-8"></script>-->
|
|||||||
function drawTable() {
|
function drawTable() {
|
||||||
|
|
||||||
var dataTable = new google.visualization.DataTable();
|
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('string', 'User'); //col0
|
||||||
dataTable.addColumn('datetime', 'Start');
|
dataTable.addColumn('datetime', 'First Spoke'); //col1
|
||||||
dataTable.addColumn('datetime', 'End');
|
dataTable.addColumn('datetime', 'Last Spoke'); //col2
|
||||||
dataTable.addColumn('number', 'Days Active');
|
dataTable.addColumn('number', 'Total Time'); //col3
|
||||||
dataTable.addColumn('number', 'Lines');
|
dataTable.addColumn('number', 'Active on'); //col4
|
||||||
dataTable.addColumn('number', 'Words');
|
dataTable.addColumn('number', 'Active Ratio');//col5
|
||||||
dataTable.addColumn('number', 'per Line');
|
dataTable.addColumn('number', 'Lines'); //col6
|
||||||
dataTable.addColumn('number', 'Characters');
|
dataTable.addColumn('number', 'Words'); //col7
|
||||||
dataTable.addColumn('number', 'per Line');
|
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);
|
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'));
|
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});
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
Reference in new issue
Block a user