-- chatstats v2 -- by tezlo -- modified by tezlo and Optimus --everybody can.. --?mystats --?userstats --?topstats [category] (there are 4 categories.. posts chars --words smilies) --OPs also can.. --!savestats and !loadstats (obsolete.. stats get saved --automatically) --!clearstats eyes = ":;8B" nose = "-o" mouth = "%[%)%(%]D" -- modify the above to fit your needs! stats = {} names = { posts = 1, chars = 2, words = 3, smilies = 4 } -- can you think of something else to count? post up function Main() loadStats() end function OnExit() saveStats() end function DataArrival(user, data) if strsub(data, 1, 1) == "<" then local s, e, str = strfind(data, "^%b<> (.*)%|$") local s, e, cmd, args = strfind(str, "^([%!%?]%a+)%s*(.*)$") if s then cmd = strlower(cmd) if cmd == "?mystats" then cmdStats(user, user.sName) elseif cmd == "?userstats" then cmdStats(user, args) elseif cmd == "?topstats" then cmdTopStats(user, args) elseif cmd == "!savestats" and user.bOperator then saveStats(user) elseif cmd == "!loadstats" and user.bOperator then loadStats(user) elseif cmd == "!clearstats" and user.bOperator then clearStats(user) else return end return 1 else updStats(user.sName, str) end end end function cmdStats(user, target) local tmp = stats[target] if tmp then user:SendData(">> chatstats for "..target..": "..tmp[1].." posts "..tmp[2].." characters "..tmp[3].." words "..tmp[4].." smilies") else user:SendData(">> no record for "..target) end end function cmdTopStats(user, args) local id = names[args] or 1 local index = sortStats(id) local chat = "" chat = chat.."\r\n\r\n\t------------------------ ¤ Current Top Chatstats: ¤ ------------------------\r\n" chat = chat.."\tNr:\tPosts:\tChartrs:\tWords:\tSmilies:\tNick:\r\n" local n = getn(index) if n > 10 then n = 10 end for i = 1, n do local nick = index[i] local tmp = stats[nick] chat = chat.."\t"..i..".\t "..tmp[id].."\t "..tmp[2].."\t "..tmp[3].."\t "..tmp[4].."\t"..nick.."\r\n" end user:SendData(chat) end function loadStats(user) stats = dofile("chatstats.dat") or {} if user then user:SendData(">> done") end end function saveStats(user) local f = openfile("chatstats.dat", "w+") assert(f, "chatstats.dat") write(f, "return {\n") for nick, table in stats do write(f, "\t"..format("[%q]", nick).." = { "..table[1], ", "..table[2]..", "..table[3]..", "..table[4].." },\n") end write(f, "}") closefile(f) if user then user:SendData(">> done") end end function clearStats(user) stats = {} if user then user:SendData(">> done") end end function sortStats(id) local index = {n=0} foreach(stats, function(nick, tmp) tinsert(%index, nick) end) local f = function(x, y) return stats[x][%id] > stats[y][%id] end sort(index, f) return index end function updStats(nick, str) local tmp = stats[nick] or {0,0,0,0} tmp[1], tmp[2], tmp[3], tmp[4] = tmp[1]+1, tmp[2]+strlen(str), tmp[3]+cntargs(str, "(%a+)"), tmp[4]+cntsmilies(str) stats[nick] = tmp end function cntargs(str, rule) local s, n = gsub(str, rule, "") return n end function cntsmilies(str) return cntargs(str, "(["..eyes.."]["..nose.."]?["..mouth.."])") + cntargs(str, "(["..mouth.."]["..nose.."]?["..eyes.."])") end