PtokaX forum

Archive => Archived 4.0 boards => Help with Lua 4 scripts => Topic started by: [NL]trucker on 11 November, 2003, 13:40:42

Title: a little bit of challenging perhaps?
Post by: [NL]trucker on 11 November, 2003, 13:40:42
hello scripters :-)


i,m using a script voor keeping chatscores

 Top 15 ChatStats v1 - Created by Guibs Apr-15, 2003    


the problem hereby is it shows the amount of characters typed and not the lines so if you look good at it a user who has posted ones can get higher in the stats then a user who has typed more lines of txt and i think it is not fair.

So my question is :

is it possiblle to make the script so that it shows the amount of lines typed by a user and the number of characters and smilies and based upon that make a stat?


--------------------------------------------------------------------------------------
-- Top 15 ChatStats v1 - Created by Guibs Apr-15, 2003                              --
--------------------------------------------------------------------------------------

---------------------
-- Version History --
---------------------

-- v1 Added Bigstats.ini, OpStats.ini, UserStats.ini, by Guibs Apr-14, 2003

-----------------
-- Description --
-----------------

-- Show the top 5 Ops posters & the top 10 users posters
-- Stats are saved all the 10 minutes
-- Users Commands in main chat: ?stats
-- Ops Commands in pm for the stats: ?stats, ?userstats , ?mystats, !loadstats, !savestats, !clearstats, !helps


-- Helped with the retrobot? v0.99? by tezlo
-- Thks to aMutex for his original ChatStat Script
-- Thks to A.C., [NL]Pur, Dazzler & MatrixX for their helps

------------------------------------
-- Sourcecode is below this point --
------------------------------------

Bot = "![Stats]?"

TimeSpanInMinutes = 10

-------------------
-- Main function --
-------------------

function Main()

ChatOpStat={}
ChatUserStat={}

frmHub:RegBot(Bot)

tabConfig = parseINI("Stats/Bigstats.ini")
tabOpStats = parseINI("Stats/OpStats.ini")
tabUserStats = parseINI("Stats/UserStats.ini")
cfgStats = getsection(tabConfig,"stats")
InitTable ("Stats/OpStats.ini",tabOpStats,ChatOpStat)
InitTable ("Stats/UserStats.ini",tabUserStats,ChatUserStat)
smEyes = getkey(cfgStats, "eyes")
smNose = getkey(cfgStats, "nose")
smMouth = getkey(cfgStats, "mouth")
SetTimer(TimeSpanInMinutes*60000)
StartTimer()

end

function DataArrival(user,data)
local tmp = strsub(data,1,1)
   if tmp == "<" then
      local s, e, str = strfind(data,"%b<> (.*)|")
      if not iscommand(str) then
         if (user.bOperator) then
            DoUpdOpStats(user,str)
         else
            DoUpdUserStats(user,str)
         end
      end
   end

   if (strsub(data,1,1) == "<" ) then
      data=strsub(data,1,strlen(data)-1)
      s,e,cmd = strfind( data,"%b<>%s+(%S+)" )
         if (cmd=="?stats")then
            pm = 0
            ShowTop15(user)

         elseif (cmd=="!helps")then
            if user.bOperator then
               ShowHelpStats(user)
               returndata = 1
            end
         end
   end

   if(strsub(data,1,4) == "$To:") then
      data=strsub(data,1,strlen(data)-1)
      s,e,whoTo = strfind(data,"$To:%s+(%S+)")
      if (whoTo == Bot) then
         s,e,whoTo,from,cmd = strfind(data,"$To:%s+(%S+)%s+From:%s+(%S+)%s+$%b<>%s+(%S+)")
         if (user.bOperator) then
            if (cmd=="!helps")then
               ShowHelpStats(user)

            elseif (cmd=="!savestats") then
               SaveStats(user)

            elseif (cmd=="!loadstats") then
               LoadStats(user)

            elseif (cmd=="!clearstats") then
               Reset(user)

            elseif (cmd=="?mystats") then
               ShowYourStats(user,cmd,args)

            elseif (cmd=="?stats")then
               pm = 1
               ShowTop15(user)

            elseif (cmd=="?userstats") then
               s,e,cmd,userName= strfind(data,"%b<>%s+(%S+)%s+(.+)")
               if not userName then
                  user:SendPM(Bot,"***Wrong synthax: ?userstats ")
               else
                  ShowUserStats(user,cmd,userName)
               end
            end
         end
      end
   end
end

--------- Update Chat Stats ---------

function DoUpdUserStats(user, str)
   local table = getitem(tabUserStats, user.sName)
   if not table then table = mkUserStats(user) end
   local stats = getvalue(table.tItems, "stats")
   local s, e, chars, words, smilies = strfind(stats, "(%d+)|(%d+)|(%d+)")

   chars = tonumber(chars)+strlen(str)
   words = tonumber(words)+cntargs(str, "(%a+)", 2)
   smilies = tonumber(smilies)+cntsmilies(str)

   ChatUserStat[user.sName]=chars

   putvalue(table.tItems, "stats", chars.."|"..words.."|"..smilies)
end

function DoUpdOpStats(user, str)
   local table = getitem(tabOpStats, user.sName)
   if not table then table = mkOpStats(user) end
   local stats = getvalue(table.tItems, "stats")
   local s, e, chars, words, smilies = strfind(stats, "(%d+)|(%d+)|(%d+)")

   chars = tonumber(chars)+strlen(str)
   words = tonumber(words)+cntargs(str, "(%a+)", 2)
   smilies = tonumber(smilies)+cntsmilies(str)

   ChatOpStat[user.sName]=chars

   putvalue(table.tItems, "stats", chars.."|"..words.."|"..smilies)
end

--------- Show Chat Stats Commands ---------

function ShowHelpStats(user)
   user:SendPM(Bot,"\r\n\===============================================\r\nUsers Commands in main chat:\r\n????????????????????????\r\n?stats\t\t- Show the Top 15 Chaters, and the stats user's\r\n\r\nOps Commands in pm for the stats:\r\n????????????????????????????\r\n?stats\t\t- Show the Top 15 Chaters and the stats user's\r\n?userstats \t- Show stats user's\r\n?mystats\t\t- Show ur current stats\r\n!loadstats\t- Load stats\r\n!savestats\t- Saves stats\r\n!clearstats\t- All stats initialized\r\n!helps\t\t- This help again\r\n===============================================")
end

--------- Load Chat Stats ---------

function LoadStats(user)
   tabConfig = parseINI("Stats/Bigstats.ini")
   tabOpStats = parseINI("Stats/OpStats.ini")
   tabUserStats = parseINI("Stats/UserStats.ini")
   cfgStats = getsection(tabConfig,"stats")
   InitTable ("Stats/OpStats.ini",tabOpStats,ChatOpStat)
   InitTable ("Stats/UserStats.ini",tabUserStats,ChatUserStat)
   smEyes = getkey(cfgStats, "eyes")
   smNose = getkey(cfgStats, "nose")
   smMouth = getkey(cfgStats, "mouth")
   user:SendPM(Bot,"Chatstat has been successfully loaded ...")
end

--------- Reset Chat Stats ---------

function Reset(user)
   ChatOpStat={}
   ChatUserStat={}
   remove("Stats/OpStats.ini")
   local handle=openfile("Stats/OpStats.ini","a")
   write(handle,"\n")
   closefile(handle)
   remove("Stats/UserStats.ini")
   local handle=openfile("Stats/UserStats.ini","a")
   write(handle,"\n")
   closefile(handle)
   tabConfig = parseINI("Stats/Bigstats.ini")
   tabOpStats = parseINI("Stats/OpStats.ini")
   tabUserStats = parseINI("Stats/UserStats.ini")
   user:SendPM(Bot,"Chat-Stats initialized!")
end

--------- Save Chat Stats ---------

function SaveStats(user)
   writeINI("Stats/OpStats.ini",tabOpStats)
   writeINI("Stats/UserStats.ini",tabUserStats)
   user:SendPM(Bot,"Chatstat has been successfully saved ...")
end

--------- Your Chat Stats ---------

function ShowYourStats(user, cmd, args)
   local table = getitem(tabOpStats, user.sName)
   if not table then table = mkOpStats(user, "") end
   local stats = getkey(table, "stats")
   local s, e, chars, words, smilies = strfind(stats, "(%d+)|(%d+)|(%d+)", 1)
   user:SendPM(Bot,user.sName.." "..chars.." characters "..words.." words ".. smilies.." smilies")
end

--------- User Chat Stats ---------

function ShowUserStats(user, cmd, userName)
   local table = getitem(tabUserStats, userName)
   UserError=0
   OpError=0
   if not table then
      UserError=1
   else
      local stats = getkey(table, "stats")
      local s, e, chars, words, smilies = strfind(stats, "(%d+)|(%d+)|(%d+)", 1)
      user:SendPM(Bot,userName.." "..chars.." characters "..words.." words ".. smilies.." smilies")
   end
   local table = getitem(tabOpStats, userName)
   if not table then
      OpError=1
   else
      local stats = getkey(table, "stats")
      local s, e, chars, words, smilies = strfind(stats, "(%d+)|(%d+)|(%d+)", 1)
      user:SendPM(Bot,userName.." "..chars.." characters "..words.." words ".. smilies.." smilies")
   end
   if UserError==1 and OpError==1 then
      user:SendPM(Bot,userName.." is not in my stats file...")
   end
end

--------- Show Top 15 Chatters ---------

function ShowTop15(user)

   local user1, userkey1
   local user2, userkey2
   local user3, userkey3
   local user4, userkey4
   local user5, userkey5
   local user6, userkey6
   local user7, userkey7
   local user8, userkey8
   local user9, userkey9
   local user10, userkey10

   local op1, opkey1
   local op2, opkey2
   local op3, opkey3
   local op4, opkey4
   local op5, opkey5

   userkey1=0
   userkey2=0
   userkey3=0
   userkey4=0
   userkey5=0
   userkey6=0
   userkey7=0
   userkey8=0
   userkey9=0
   userkey10=0

   opkey1=0
   opkey2=0
   opkey3=0
   opkey4=0
   opkey5=0

   for a,b in ChatOpStat do
      if (ChatOpStat[a]>opkey1) then
         op5=op4
         opkey5=opkey4
         op4=op3
         opkey4=opkey3
         op3=op2
         opkey3=opkey2
         op2=op1
         opkey2=opkey1
         op1=a
         opkey1=ChatOpStat[a]
      else
         if (ChatOpStat[a]>opkey2) then
            op5=op4
            opkey5=opkey4
            op4=op3
            opkey4=opkey3
            op3=op2
            opkey3=opkey2
            op2=a
            opkey2=ChatOpStat[a]
         else
            if (ChatOpStat[a]>opkey3) then
               op5=op4
               opkey5=opkey4
               op4=op3
               opkey4=opkey3
               op3=a
               opkey3=ChatOpStat[a]
            else
               if (ChatOpStat[a]>opkey4) then
                  op5=op4
                  opkey5=opkey4
                  op4=a
                  opkey4=ChatOpStat[a]
               else
                  if (ChatOpStat[a]>opkey5) then
                     op5=a
                     opkey5=ChatOpStat[a]
                  end
               end
            end
         end
      end
   end
---------------------------------------------------------------------------------
part1 (script was to big) :-)
Title:
Post by: tezlo on 11 November, 2003, 21:16:26
dont use that script!
it will hurt your computer
i rewrote the whole thing :)
-- chatstats v2
-- by tezlo


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)
user:SendData(">> topstats category "..id)
local n = getn(index)
if n > 10 then n = 10 end
for i = 1, n do
local nick = index[i]
local tmp = stats[nick]
user:SendData(">>\t"..i..". "..nick.." ["..tmp[id].."]")
end
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

now it does what you asked for
and more..

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
Title:
Post by: NightLitch on 11 November, 2003, 21:22:04
Nice One Tezlo... Think Am gonna implent it into my Bot... great work...

/NightLitch
Title:
Post by: pHaTTy on 11 November, 2003, 22:09:35
wow, nice one, me implement too, very nice well done
Title:
Post by: [NL]trucker on 11 November, 2003, 22:10:35
Thnx Tezlo i will give it a go



when i type ?topstats i get :

[22:14:47] >> topstats category 1
[22:14:47] >>   1. [NL]trucker [1]


When i type ?chatstat i get :

[22:15:15] >> chatstats for [NL]trucker: 1 posts 10 characters 1 words 1 smilies

there is no listing to compare.

no listing like

Top 5 ops posters in this hub :
nr -- lines---- characters----smileys----- name

no1. -- 15 ---- 225 ---- 4 ---- [NL]trucker
no2. -- 12 ---- 275 ---- 3 ---- [NL]janeb


Top 10  posters in this hub :
nr-----lines----- characters---smileys--name

* 1.    2455    2658                  00    : [NL]janeb
* 2.   13376    1200                         : [NL]trucker
* 3.    5273      800                          : [NL]trucker_2
* 4.    4641       376                         : DoJiN


i would like a listing like this
that way the users can compare it

so i mean a total listing of it perhaps with the command ?stats cause thats the one users are used to use.
Title:
Post by: tezlo on 11 November, 2003, 22:48:39
?topstats does that
Title:
Post by: [NL]trucker on 11 November, 2003, 23:09:30
if i type ?topstats i get this :

[23:03:55] >> topstats category 1
[23:03:55] >>   1. [NL]trucker [3]
[23:03:55] >>   2. charto [1]


it is just for cat1 i want it for all categories

like :

Top 5 ops posters in this hub :
nr -- lines---- characters----smileys----- name

no1. -- 15 ---- 225 ---- 4 ---- [NL]trucker
no2. -- 12 ---- 275 ---- 3 ---- [NL]janeb


Top 10 posters in this hub :
nr-----lines----- characters---smileys--name

* 1. 2455 2658 00 : [NL]janeb
* 2. 13376 1200 : [NL]trucker
* 3. 5273 800 : [NL]trucker_2
* 4. 4641 376 : DoJiN


is this possiblle?
Title:
Post by: tezlo on 12 November, 2003, 11:24:22
you can get topstats in any category..
?topstats [posts/words/chars/smilies]
and yes.. it will only show the relevant values
Title:
Post by: [NL]trucker on 12 November, 2003, 12:06:23
tezlo

i dont think you did understand me completly

i wanted to show all of them together and not seperate

so i want it look like this :


nr -- lines---- characters----smileys----- name

no1. -- 15 ---- 225 ---- 4 ---- [NL]trucker
no2. -- 12 ---- 275 ---- 3 ---- [NL]janeb

and not seperate by category.

please please could you do that?
Title:
Post by: Optimus on 12 November, 2003, 12:58:03
well i'm experimenting abit around with the code, and it's not hard to make those changes. hehe

I got it looking like this right now???

Code:

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
      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


i think that's wath you looking for, just replace the old part with this new part.
Title:
Post by: [NL]trucker on 12 November, 2003, 13:07:46
Optimus

you hit the jackpot m8  

we dutch understand each other :-)))


but indeed a bit restyling wouldnt be bad .

but had a nice talk to tezlo and he is going to put the altered script here.

i love this guy if he would be dutch :-))))
Title:
Post by: Optimus on 12 November, 2003, 13:13:49
Btw, Tezlo i love this 1.
Title:
Post by: tezlo on 12 November, 2003, 13:52:29
ow thx :)
this is what i did with topstats..
pretty much the same thing
function cmdTopStats(user, args)
local id = names[args] or 1
local index = sortStats(id)
user:SendData(">> topstats category "..id)
user:SendData(">>\tid\tposts\tchars\twords\tsmilies\tnick")
local n = getn(index)
if n > 10 then n = 10 end
for i = 1, n do
local nick = index[i]
local tmp = stats[nick]
user:SendData(">>\t"..i..".\t"..tmp[1].."\t"..tmp[2].."\t"..tmp[3].."\t"..tmp[4].."\t"..nick)
end
end
tja.. nederlanders :)
Title:
Post by: Optimus on 12 November, 2003, 13:55:37
maar dat wist ik niet lol. slimme nederlanders haha

Btw, Updated code in some posts before just scroll back^^^^

lol  ;)
Title:
Post by: TiMeTrAVelleR on 12 November, 2003, 14:03:47
Yeps  Looks  nice

TiM? :D
Title:
Post by: tezlo on 12 November, 2003, 14:15:48
ben geen nederlander.. maar ik versta wel ;)
Title:
Post by: [NL]trucker on 13 November, 2003, 00:44:52
thanx tezlo and Optimus it works fine now.

if one way or another i can repay the favor just call me.


great job wel done .

the only thing i could wish for now is that there will be a diffrence between Op,s and users.

like a top 5 for Op,s and a top 10 for users :-))

in one listing ofcours :-)) just to make it a bit more challencing.



oftewel het enige wat ik nog zou kunnen wensen is een top5 voor Op,s en een top 10  voor users in een enkele listing natuurlijk.
alleen om het nog een beetje uitdagender te maken.


dit is wat ik nu heb Op,s en users door mekaar .

   ------------------------ ? Current Top Chatstats: ? ------------------------
   Nr:   Posts:   Chartrs:   Words:   Smilies:   Nick:
   1.    89    2497    490    10   [NL]trucker
   2.    41    1289    272    0   TheWickedRabbit
   3.    4    151    25    0   [NL]janeb
   4.    2    19    3    0   M@non
   5.    1    3    1    0   tezlo
   6.    1    14    2    0   [NL]M@non
   7.    1    17    3    1   charto
   8.    1    110    19    0   coulzee
   9.    1    5    1    0   [INT]masterload


hmm  er staat op de site wel een scheiding tussen de cijfers.
Title:
Post by: [NL]trucker on 13 November, 2003, 17:35:22
is there still someone looking into my last request?
Title:
Post by: [NL]trucker on 16 November, 2003, 15:44:43
the only thing i could wish for now is that there will be a diffrence between Op,s and users.

like a top 5 for Op,s and a top 10 for users :-))

in one listing ofcours :-)) just to make it a bit more challencing.

pleeeeeaaaasseee is there someone who can do this?

i think it is better looking this way [diffrent stats for user and OP,s]
Title: Chatstats_v2
Post by: Dj_OcTaGoN on 17 September, 2004, 17:12:58
Hi,

I just got my hands on CHATSTATS_v2, its really good, BUT im also running Hub-Link so the chatscript will also record the Hub-Link Bots typing (which is in topstats with couple of thousand more carachters than all others..lol). So i would need a exception, a table or whatever to put all nicks i dont want to be recorded. I appreciate all help

-- 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

cheers // Dj_OcTaGoN