a little bit of challenging perhaps?
 

News:

29 December 2022 - PtokaX 0.5.3.0 (20th anniversary edition) released...
11 April 2017 - PtokaX 0.5.2.2 released...
8 April 2015 Anti child and anti pedo pr0n scripts are not allowed anymore on this board!
28 September 2015 - PtokaX 0.5.2.1 for Windows 10 IoT released...
3 September 2015 - PtokaX 0.5.2.1 released...
16 August 2015 - PtokaX 0.5.2.0 released...
1 August 2015 - Crowdfunding for ADC protocol support in PtokaX ended. Clearly nobody want ADC support...
30 June 2015 - PtokaX 0.5.1.0 released...
30 April 2015 Crowdfunding for ADC protocol support in PtokaX
26 April 2015 New support hub!
20 February 2015 - PtokaX 0.5.0.3 released...
13 April 2014 - PtokaX 0.5.0.2 released...
23 March 2014 - PtokaX testing version 0.5.0.1 build 454 is available.
04 March 2014 - PtokaX.org sites were temporary down because of DDOS attacks and issues with hosting service provider.

Main Menu

a little bit of challenging perhaps?

Started by [NL]trucker, 11 November, 2003, 13:40:42

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

[NL]trucker

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) :-)
Owner of FunnyHub
 
Funyhub.no-ip.info
       Forum Master of


tezlo

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

NightLitch

Nice One Tezlo... Think Am gonna implent it into my Bot... great work...

/NightLitch
//NL

pHaTTy

wow, nice one, me implement too, very nice well done
Resistance is futile!

[NL]trucker

#4
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.
Owner of FunnyHub
 
Funyhub.no-ip.info
       Forum Master of


tezlo

?topstats does that

[NL]trucker

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?
Owner of FunnyHub
 
Funyhub.no-ip.info
       Forum Master of


tezlo

you can get topstats in any category..
?topstats [posts/words/chars/smilies]
and yes.. it will only show the relevant values

[NL]trucker

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?
Owner of FunnyHub
 
Funyhub.no-ip.info
       Forum Master of


Optimus

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.

[NL]trucker

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 :-))))
Owner of FunnyHub
 
Funyhub.no-ip.info
       Forum Master of


Optimus

Btw, Tezlo i love this 1.

tezlo

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

Optimus

maar dat wist ik niet lol. slimme nederlanders haha

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

lol  ;)

TiMeTrAVelleR

Yeps  Looks  nice

TiM? :D

tezlo

ben geen nederlander.. maar ik versta wel ;)

[NL]trucker

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.
Owner of FunnyHub
 
Funyhub.no-ip.info
       Forum Master of


[NL]trucker

is there still someone looking into my last request?
Owner of FunnyHub
 
Funyhub.no-ip.info
       Forum Master of


[NL]trucker

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]
Owner of FunnyHub
 
Funyhub.no-ip.info
       Forum Master of


Dj_OcTaGoN

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


SMF spam blocked by CleanTalk