Don't Go
 

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

Don't Go

Started by Casanova82, 15 April, 2005, 03:13:48

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Casanova82

-- ChatStats v3 Made By Optimus
-- Based on Tezlo chats
-- Added Send Commands By TiMeTrAVelleR
-- Madman fixed some in commands
-- Converted to lua5 by Madman with very little help by Jelf
-- with some help by ?

sBot = "????hÆ??Æ?????"      -- Name of Bot
SendComm = 1          -- Send UserCommands 1 = On  0 = Off
pMenu = "????hÆ??Æ?????"    -- Name of Menu

Chatstats = {}

Sortstats = 2   -- 1=words / 2=posts

ChatStatsFile = "chatstats.tbl"

EnableChatStats = {
   [0] = 1, -- Master
   [1] = 1, -- Operators
   [2] = 1, -- Vips
   [3] = 1, -- Regs
   [4] = 1, -- Moderators
   [5] = 1, -- NetFounders
   [-1] = 1, -- Users (UnRegged)
}

AllowedProfiles = {
[0] = 1,   -- Masters
[1] = 0,   -- Operators
[4] = 0,   -- Moderator
[5] = 0,   -- NetFounder
}

function Main()
   frmHub:RegBot(sBot)
   loadTableFromFile(ChatStatsFile)
   SetTimer(30*60000)
   StartTimer()
end

function NewUserConnected(user)
   if SendComm == 1 and EnableChatStats[user.iProfile] == 1 then
      if Chatstats[user.sName] then
         user:SendData(sBot, "??? Le tue statistiche di Chat:  Hai scritto "..Chatstats[user.sName]["post"].." frasi in main usando "..Chatstats[user.sName]["chars"].."  parole,e "..Chatstats[user.sName]["words"].." lettere ???")
      end
      user:SendData("$UserCommand 1 3 "..pMenu.."\\TopChatters$<%[mynick]> !topchatters||")
      user:SendData("$UserCommand 1 3 "..pMenu.."\\My Chat Stat$<%[mynick]> !mychatstat||")
      if AllowedProfiles[user.iProfile] == 1 then
         user:SendData("$UserCommand 1 3 "..pMenu.."\\Del Chatter$<%[mynick]> !delchatter %[line:Nick]||")
         user:SendData("$UserCommand 1 3 "..pMenu.."\\Clear Chat Stats$<%[mynick]> !clearchatstats||")
      end
   end
end

OpConnected = NewUserConnected

function OnExit()
   saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
end

function OnTimer()
   for i,v in Chatstats do
      table.insert(TCopy,{i,v.post,v.chars,v.words})
   end
   table.sort(TCopy,function(a,b) return (a[Sortstats] > b[Sortstats]) end)
   local chat = "Current Top Chatters:\r\n\r\n"
   chat = chat.."\t ------------------------------------------------------------------------\r\n"
   chat = chat.."\t Nr.\tPosts:\tChars:\tWords:\tName:\r\n"
   chat = chat.."\t ------------------------------------------------------------------------\r\n"
   for i = 1,25 do
      if TCopy then
         chat = chat.."\t "..i..".\t "..TCopy[2].."\t "..TCopy[3].."\t "..TCopy[4].."\t"..TCopy[1].."\r\n"
      end
   end
   SendToAll(sBot, chat)
   TCopy={}
end

function ChatArrival(user, data)
   if (string.sub(data, 1, 1) == "<" ) then
      if EnableChatStats[user.iProfile] == 1 then
         local s,e,str = string.find(data, "^%b<> (.*)%|$")
         updStats(user.sName, str)
      end
      data=string.sub(data,1,string.len(data)-1)
      s,e,cmd=string.find(data, "%b<>%s+(%S+)")
      if (cmd == "!mychatstat") then
         if Chatstats[user.sName] then
            user:SendData(sBot, "??? Le tue statistiche di Chat:  Hai scritto "..Chatstats[user.sName]["post"].." frasi in main usando "..Chatstats[user.sName]["chars"].."  parole,e "..Chatstats[user.sName]["words"].." lettere ???")
            return 1
         else
            user:SendData(sBot, "*** No chat statics found!")
            return 1
         end
      elseif (cmd=="!topchatters") then
         TCopy={}
         if Chatstats then
            for i,v in Chatstats do
               table.insert(TCopy,{i,v.post,v.chars,v.words})
            end
            table.sort(TCopy,function(a,b) return (a[Sortstats] > b[Sortstats]) end)
            local chat = "Current Top Chatters:\r\n\r\n"
            chat = chat.."\t ------------------------------------------------------------------------\r\n"
            chat = chat.."\t Nr.\tPosts:\tChars:\tWords:\tName:\r\n"
            chat = chat.."\t ------------------------------------------------------------------------\r\n"
            for i = 1,25 do
               if TCopy then
--                                 Nr:         Posts:            Chars:            Words:            Name:
                  chat = chat.."\t "..i..".\t "..TCopy[2].."\t "..TCopy[3].."\t "..TCopy[4].."\t"..TCopy[1].."\r\n"
               end
            end
            user:SendData(sBot, chat)
            TCopy={}
         end
         return 1
      elseif (cmd == "!delchatter") and AllowedProfiles[user.iProfile] == 1 then
         local s,e,cmd,name = string.find( data, "%b<>%s+(%S+)%s+(%S+)" )
         if name then
            if Chatstats[name] then
               Chatstats[name] = nil
               user:SendData(sBot, "Chatstats from user "..name.." are now removed!")
               saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
            else
               user:SendData(sBot, "*** Chatstats from user "..name.." not found!")
            end
         else
            user:SendData(sBot, "*** Usage: !delchatter ")
         end
         return 1
      elseif (cmd == "!clearchatstats") and AllowedProfiles[user.iProfile] == 1 then
         Chatstats = {}
         saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
         user:SendData(sBot, "Chatstats are cleared by "..user.sName)
         return 1
      end
   end
end

function updStats(nick, str)
   local tmp = Chatstats[nick] or {["post"]=0, ["chars"]=0, ["words"]=0, ["time"]=os.date("%x")}
   tmp["post"], tmp["chars"], tmp["words"], tmp["time"] = tmp["post"]+1, tmp["chars"]+string.len(str), tmp["words"]+cntargs(str,"(%a+)"), os.date("%x")
   Chatstats[nick] = tmp
--   saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
end

function cntargs(str, rule)
   local s,n = string.gsub(str, rule, "")
   return n
end

----------------------------------------------
-- load & save Tables
----------------------------------------------
function Serialize(tTable, sTableName, sTab)
        assert(tTable, "tTable equals nil");
        assert(sTableName, "sTableName equals nil");

        assert(type(tTable) == "table", "tTable must be a table!");
        assert(type(sTableName) == "string", "sTableName must be a string!");

        sTab = sTab or "";
        sTmp = ""

        sTmp = sTmp..sTab..sTableName.." = {\n"

        for key, value in tTable do
                local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);

                if(type(value) == "table") then
                        sTmp = sTmp..Serialize(value, sKey, sTab.."\t");
                else
                        local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
                        sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
                end

                sTmp = sTmp..",\n"
        end

        sTmp = sTmp..sTab.."}"
        return sTmp
end

-----------------------------------------------------------
function saveTableToFile(file, table, tablename)
   local handle = io.open(file,"w+")
   handle:write(Serialize(table, tablename))
   handle:flush()
   handle:close()
end
-----------------------------------------------------------
function loadTableFromFile(file)
   local handle = io.open(file,"r")
   if (handle ~= nil) then
      loadstring(handle:read("*all"))
      handle:flush()
      handle:close()
   end
end




>> Syntax ...e --0.3.3.0.b16.09.nt.rls\scripts\chatstats lua5.lua:64: bad argument #1 to `insert' (table expected, got nil)


Help Me  ?(

Casanova82

And how can save stastic?When i restart hub,restart it too...

 ?(

Madman

try this one <-- this one i know work..
or
this one <-- havent tested it yet.. ;p
We suffer in silence, we lurk in the shadows, we kill in the night
Site currently down, ETA of returning online is 2099 ;p

Casanova82

Ok but i want that Topchatters go in main every 30min... ?(

Madman

#4
okey... well use one of the script i linked to...
becuse the one you are using, dont save the stats on script restart...
then add this to the script
This is for the script on the first link
function OnTimer()
	TCopy={}
	if Chatstats then
		for i,v in Chatstats do
			table.insert(TCopy,{i,v.post,v.chars,v.words})
		end
		table.sort(TCopy,function(a,b) return (a[Sortstats] > b[Sortstats]) end)
		local chat = "Current Top Chatters:\r\n\r\n"
		chat = chat.."\t ------------------------------------------------------------------------\r\n"
		chat = chat.."\t Nr.\tPosts:\tChars:\tWords:\tName:\r\n"
		chat = chat.."\t ------------------------------------------------------------------------\r\n"
		for i = 1,25 do 
			if TCopy[i] then
				chat = chat.."\t "..i..".\t "..TCopy[i][2].."\t "..TCopy[i][3].."\t "..TCopy[i][4].."\t"..TCopy[i][1].."\r\n"
			end
		end
		SendToAll(sBot, chat)
		TCopy={}
	end
end

And this is for the second one
function OnTimer()
	TCopy={}
	if Chatstats then
		for i,v in Chatstats do
			table.insert(TCopy,{i,v.post,v.chars,v.words})
		end
		table.sort(TCopy,function(a,b) return (a[Sortstats] > b[Sortstats]) end)
		local chat = "Current Top Chatters:\r\n\r\n"
		chat = chat.."\t ------------------------------------------------------------------------\r\n"
		chat = chat.."\t Nr.\tPosts:\tChars:\tWords:\tName:\r\n"
		chat = chat.."\t ------------------------------------------------------------------------\r\n"
		for i = 1,25 do 
			if TCopy[i] then
				chat = chat.."\t "..i..".\t "..tCopy[i][2].."\t "..tCopy[i][3].."\t "..tCopy[i][4].."\t "..tCopy[i][5].happy.."\t "..tCopy[i][5].sad.."\t"..tCopy[i][1].."\r\n"
			end
		end
		SendToAll(sBot, chat)
		TCopy={}
	end
end

Both script of course require that you add
SetTimer(30*60000) 
StartTimer()

to the Main() function

*Edit*

Btw... i found out the reason for your error
you missed the
TCopy={}
that needed to be places under OnTimer...
We suffer in silence, we lurk in the shadows, we kill in the night
Site currently down, ETA of returning online is 2099 ;p

jiten

Well, I came a little late to help :D

Casanova82

function Main()
   frmHub:RegBot(sBot)
   local file = io.open(ChatStatsFile, "r")
                SetTimer(30*60000)
                StartTimer()
   if file then
      file:close()
   else
      local file = io.open(ChatStatsFile, "w+")
      file:write()
      file:close()
   end
   dofile(ChatStatsFile)
end


Is it right??

jiten

#7
Well, i just used madman's hints and did this (so, the credit is his)  :D

Script 1:

-- ChatStats v3 Made By Optimus
-- Based on Tezlo chats
-- Added Send Commands By TiMeTrAVelleR
-- Madman fixed some in commands
-- Converted to lua5 by Madman with very little help by Jelf
-- with some help by ?
-- fixed stats saving on exit by jiten
-- Added TopChatters list sending every 30 minutes

sBot = "Chatstats"		-- Name of Bot
SendComm = 1 			-- Send UserCommands 1 = On  0 = Off
pMenu = "-=( ChatStats )=-" 	-- Name of Menu

Chatstats = {}

Sortstats = 2	-- 1=words / 2=posts

ChatStatsFile = "chatstats.tbl"

EnableChatStats = {
	[0] = 1, -- Master
	[1] = 1, -- Operators
	[2] = 1, -- Vips
	[3] = 1, -- Regs
	[4] = 1, -- Moderators
	[5] = 1, -- NetFounders
	[-1] = 1, -- Users (UnRegged)
}

AllowedProfiles = { 
[0] = 1,   -- Masters
[1] = 0,   -- Operators
[4] = 0,   -- Moderator
[5] = 0,   -- NetFounder
}

function Main()
	frmHub:RegBot(sBot)
	dofile(ChatStatsFile)
	SetTimer(30*60000) 
	StartTimer()
end

function NewUserConnected(user)
	if SendComm == 1 and EnableChatStats[user.iProfile] == 1 then
		if Chatstats[user.sName] then
			user:SendData(sBot, "---===[ Your Chat Stats:  You Made "..Chatstats[user.sName]["post"].." Posts In Main Used "..Chatstats[user.sName]["chars"].."  Characters, And "..Chatstats[user.sName]["words"].." Words ]===---")
		end
		user:SendData("$UserCommand 1 3 "..pMenu.."\\TopChatters$<%[mynick]> !topchatters||")
		user:SendData("$UserCommand 1 3 "..pMenu.."\\My Chat Stat$<%[mynick]> !mychatstat||")
		if AllowedProfiles[user.iProfile] == 1 then
			user:SendData("$UserCommand 1 3 "..pMenu.."\\Del Chatter$<%[mynick]> !delchatter %[line:Nick]||")
			user:SendData("$UserCommand 1 3 "..pMenu.."\\Clear Chat Stats$<%[mynick]> !clearchatstats||")
		end
	end
end

OpConnected = NewUserConnected

function OnExit()
	if isEmpty(Chatstats) then
	else
		saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
	end
end

function ChatArrival(user, data)
	if (string.sub(data, 1, 1) == "<" ) then
		if EnableChatStats[user.iProfile] == 1 then
			local s,e,str = string.find(data, "^%b<> (.*)%|$")
			updStats(user.sName, str)
		end
		data=string.sub(data,1,string.len(data)-1) 
		s,e,cmd=string.find(data, "%b<>%s+(%S+)")
		if (cmd == "!mychatstat") then
			if Chatstats[user.sName] then
				user:SendData(sBot, "---===[ Your Chat Stats:  You Made "..Chatstats[user.sName]["post"].." Posts In Main Used "..Chatstats[user.sName]["chars"].."  Characters, And "..Chatstats[user.sName]["words"].." Words ]===---")
				return 1
			else
				user:SendData(sBot, "*** No chat statics found!") 
				return 1
			end
		elseif (cmd=="!topchatters") then
			TCopy={}
			if Chatstats then
				for i,v in Chatstats do
					table.insert(TCopy,{i,v.post,v.chars,v.words})
				end
				table.sort(TCopy,function(a,b) return (a[Sortstats] > b[Sortstats]) end)
				local chat = "Current Top Chatters:\r\n\r\n"
				chat = chat.."\t ------------------------------------------------------------------------\r\n"
				chat = chat.."\t Nr.\tPosts:\tChars:\tWords:\tName:\r\n"
				chat = chat.."\t ------------------------------------------------------------------------\r\n"
				for i = 1,25 do 
					if TCopy[i] then
--											Nr:			Posts:				Chars:				Words:				Name:
						chat = chat.."\t "..i..".\t "..TCopy[i][2].."\t "..TCopy[i][3].."\t "..TCopy[i][4].."\t"..TCopy[i][1].."\r\n"
					end
				end
				user:SendData(sBot, chat)
				TCopy={}
			end
			return 1
		elseif (cmd == "!delchatter") and AllowedProfiles[user.iProfile] == 1 then
			local s,e,cmd,name = string.find( data, "%b<>%s+(%S+)%s+(%S+)" )
			if name then
				if Chatstats[name] then
					Chatstats[name] = nil
					user:SendData(sBot, "Chatstats from user "..name.." are now removed!")
					saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
				else
					user:SendData(sBot, "*** Chatstats from user "..name.." not found!")
				end
			else
				user:SendData(sBot, "*** Usage: !delchatter ")
			end
			return 1
		elseif (cmd == "!clearchatstats") and AllowedProfiles[user.iProfile] == 1 then
			Chatstats = {}
			saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
			user:SendData(sBot, "Chatstats are cleared by "..user.sName)
			return 1
		end
	end
end

function updStats(nick, str)
	local tmp = Chatstats[nick] or {["post"]=0, ["chars"]=0, ["words"]=0, ["time"]=os.date("%x")}
	tmp["post"], tmp["chars"], tmp["words"], tmp["time"] = tmp["post"]+1, tmp["chars"]+string.len(str), tmp["words"]+cntargs(str,"(%a+)"), os.date("%x")
	Chatstats[nick] = tmp
--	saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
end

function cntargs(str, rule)
	local s,n = string.gsub(str, rule, "")
	return n
end

----------------------------------------------
-- load & save Tables
----------------------------------------------
function Serialize(tTable, sTableName, sTab)
        assert(tTable, "tTable equals nil");
        assert(sTableName, "sTableName equals nil");

        assert(type(tTable) == "table", "tTable must be a table!");
        assert(type(sTableName) == "string", "sTableName must be a string!");

        sTab = sTab or "";
        sTmp = ""

        sTmp = sTmp..sTab..sTableName.." = {\n"

        for key, value in tTable do
                local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);

                if(type(value) == "table") then
                        sTmp = sTmp..Serialize(value, sKey, sTab.."\t");
                else
                        local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
                        sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
                end

                sTmp = sTmp..",\n"
        end

        sTmp = sTmp..sTab.."}"
        return sTmp
end

-----------------------------------------------------------
function saveTableToFile(file, table, tablename)
	local handle = io.open(file,"w+")
	handle:write(Serialize(table, tablename))
	handle:flush()
	handle:close()
end
-----------------------------------------------------------
function loadTableFromFile(file)
	local handle = io.open(file,"r")
	if (handle ~= nil) then
		loadstring(handle:read("*all"))
		handle:flush()
		handle:close()
	end
end

-------------table checker by herodes
--- for an associative table, like ["smth"] = "smth else",
function isEmpty(t)
	for i,v in t do
		return false;
	end
	return true;
end;

function OnTimer()
	TCopy={}
	if Chatstats then
		for i,v in Chatstats do
			table.insert(TCopy,{i,v.post,v.chars,v.words})
		end
		table.sort(TCopy,function(a,b) return (a[Sortstats] > b[Sortstats]) end)
		local chat = "Current Top Chatters:\r\n\r\n"
		chat = chat.."\t ------------------------------------------------------------------------\r\n"
		chat = chat.."\t Nr.\tPosts:\tChars:\tWords:\tName:\r\n"
		chat = chat.."\t ------------------------------------------------------------------------\r\n"
		for i = 1,25 do 
			if TCopy[i] then
				chat = chat.."\t "..i..".\t "..TCopy[i][2].."\t "..TCopy[i][3].."\t "..TCopy[i][4].."\t"..TCopy[i][1].."\r\n"
			end
		end
		SendToAll(sBot, chat)
		TCopy={}
	end
end

Cheers

jiten

Script 2:

-- ChatStats v3 Made By Optimus
-- Based on Tezlo chats
-- Added Send Commands By TiMeTrAVelleR
-- Madman fixed some in commands
-- Converted to lua5 by Madman with very little help by Jelf
-- with some help by ?
-- fixed stats saving on exit by jiten
---- Modded by Madman
-- Added so it's creates ChatStatsFile, if it's missing
-- Fixed so it dont counts commands
-- Added a IgnoreTable, users in that wont be counted
----
-- Added TopChatters list sending every 30 minutes

sBot = "Chatstats"		-- Name of Bot
SendComm = 1 			-- Send UserCommands 1 = On  0 = Off
pMenu = "-=( ChatStats )=-" 	-- Name of Menu
ChatStatsTo = "user" -- Send TopChatters to? user or all

Chatstats = {}

Sortstats = 2	-- 1=words / 2=posts

ChatStatsFile = "chatstats.tbl"

IgnoreTable = {
-- 0=dont ignore/1=ignore
	["Madman"] = 0,
	["-=FakeKiller=-"] = 1,
}

EnableChatStats = {
	[0] = 1, -- Master
	[1] = 1, -- Operators
	[2] = 1, -- Vips
	[3] = 1, -- Regs
	[4] = 1, -- Moderators
	[5] = 1, -- NetFounders
	[-1] = 1, -- Users (UnRegged)
}

AllowedProfiles = { 
	[0] = 1,   -- Masters
	[1] = 0,   -- Operators
	[4] = 0,   -- Moderator
	[5] = 0,   -- NetFounder
}

function Main()
	SetTimer(30*60000) 
	StartTimer()
	frmHub:RegBot(sBot)
	local file = io.open(ChatStatsFile, "r")
	if file then
		file:close()
	else
		local file = io.open(ChatStatsFile, "w+")
		file:write()
		file:close()
	end
	dofile(ChatStatsFile)
end

function NewUserConnected(user)
	if SendComm == 1 and EnableChatStats[user.iProfile] == 1 then
		if Chatstats[user.sName] then
			user:SendData(sBot, "---===[ Your Chat Stats:  You Made "..Chatstats[user.sName]["post"].." Posts In Main Used "..Chatstats[user.sName]["chars"].."  Characters, And "..Chatstats[user.sName]["words"].." Words ]===---")
		end
		user:SendData("$UserCommand 1 3 "..pMenu.."\\TopChatters$<%[mynick]> !topchatters||")
		user:SendData("$UserCommand 1 3 "..pMenu.."\\My Chat Stat$<%[mynick]> !mychatstat||")
		if AllowedProfiles[user.iProfile] == 1 then
			user:SendData("$UserCommand 1 3 "..pMenu.."\\Del Chatter$<%[mynick]> !delchatter %[line:Nick]||")
			user:SendData("$UserCommand 1 3 "..pMenu.."\\Clear Chat Stats$<%[mynick]> !clearchatstats||")
		end
	end
end

OpConnected = NewUserConnected

function OnExit()
	if isEmpty(Chatstats) then
	else
		saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
	end
end

function IsCmd(str)
	return string.sub(str, 1, 1) == "!" or string.sub(str, 1, 1) == "?" or string.sub(str, 1, 1) == "+" or string.sub(str, 1, 1) == "#"
end

function ChatArrival(user, data)
	if EnableChatStats[user.iProfile] == 1 then
		local s,e,cmd = string.find(data,"%b<>%s+(%S+)")
		if IsCmd(cmd) then
		elseif IgnoreTable[user.sName] == 1 then
		else
			local s,e,str = string.find(data, "^%b<> (.*)%|$")
			updStats(user.sName, str)
		end
	end
	data=string.sub(data,1,string.len(data)-1)
	s,e,cmd=string.find(data, "%b<>%s+(%S+)")
	if (cmd == "!mychatstat") then
		if Chatstats[user.sName] then
			user:SendData(sBot, "---===[ Your Chat Stats:  You Made "..Chatstats[user.sName]["post"].." Posts In Main Used "..Chatstats[user.sName]["chars"].."  Characters, And "..Chatstats[user.sName]["words"].." Words ]===---")
			return 1
		else
			user:SendData(sBot, "*** No chat statics found!") 
			return 1
		end
	elseif (cmd=="!topchatters") then
		TCopy={}
		if Chatstats then
			for i,v in Chatstats do
				table.insert(TCopy,{i,v.post,v.chars,v.words})
			end
			table.sort(TCopy,function(a,b) return (a[Sortstats] > b[Sortstats]) end)
			local chat = "Current Top Chatters:\r\n\r\n"
			chat = chat.."\t ------------------------------------------------------------------------\r\n"
			chat = chat.."\t Nr.\tPosts:\tChars:\tWords:\tName:\r\n"
			chat = chat.."\t ------------------------------------------------------------------------\r\n"
			for i = 1,25 do 
				if TCopy[i] then
--										Nr:			Posts:				Chars:				Words:				Name:
					chat = chat.."\t "..i..".\t "..TCopy[i][2].."\t "..TCopy[i][3].."\t "..TCopy[i][4].."\t"..TCopy[i][1].."\r\n"
				end
			end
			if ChatStatsTo == "user" then
				user:SendData(sBot, chat)
			elseif ChatStatsTo == "all" then
				SendToAll(sBot, chat)
			end
			TCopy={}
		end
		return 1
	elseif (cmd == "!delchatter") and AllowedProfiles[user.iProfile] == 1 then
		local s,e,cmd,name = string.find( data, "%b<>%s+(%S+)%s+(%S+)" )
		if name then
			if Chatstats[name] then
				Chatstats[name] = nil
				user:SendData(sBot, "Chatstats from user "..name.." are now removed!")
				saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
			else
				user:SendData(sBot, "*** Chatstats from user "..name.." not found!")
			end
		else
			user:SendData(sBot, "*** Usage: !delchatter ")
		end
		return 1
	elseif (cmd == "!clearchatstats") and AllowedProfiles[user.iProfile] == 1 then
		Chatstats = {}
		saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
		user:SendData(sBot, "Chatstats are cleared by "..user.sName)
		return 1
	end
end

function updStats(nick, str)
	local tmp = Chatstats[nick] or {["post"]=0, ["chars"]=0, ["words"]=0, ["time"]=os.date("%x")}
	tmp["post"], tmp["chars"], tmp["words"], tmp["time"] = tmp["post"]+1, tmp["chars"]+string.len(str), tmp["words"]+cntargs(str,"(%a+)"), os.date("%x")
	Chatstats[nick] = tmp
	saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
end

function cntargs(str, rule)
	local s,n = string.gsub(str, rule, "")
	return n
end

----------------------------------------------
-- load & save Tables
----------------------------------------------
function Serialize(tTable, sTableName, sTab)
	assert(tTable, "tTable equals nil");
	assert(sTableName, "sTableName equals nil");

	assert(type(tTable) == "table", "tTable must be a table!");
	assert(type(sTableName) == "string", "sTableName must be a string!");

	sTab = sTab or "";
	sTmp = ""

	sTmp = sTmp..sTab..sTableName.." = {\n"

	for key, value in tTable do
		local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);

		if(type(value) == "table") then
			sTmp = sTmp..Serialize(value, sKey, sTab.."\t");
		else
			local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
			sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
		end

		sTmp = sTmp..",\n"
	end

	sTmp = sTmp..sTab.."}"
	return sTmp
end

-----------------------------------------------------------
function saveTableToFile(file, table, tablename)
	local handle = io.open(file,"w+")
	handle:write(Serialize(table, tablename))
	handle:flush()
	handle:close()
end
-----------------------------------------------------------
function loadTableFromFile(file)
	local handle = io.open(file,"r")
	if (handle ~= nil) then
		loadstring(handle:read("*all"))
		handle:flush()
		handle:close()
	end
end

-------------table checker by herodes
--- for an associative table, like ["smth"] = "smth else",
function isEmpty(t)
	for i,v in t do
		return false;
	end
	return true;
end;

function OnTimer()
	TCopy={}
	if Chatstats then
		for i,v in Chatstats do
			table.insert(TCopy,{i,v.post,v.chars,v.words})
		end
		table.sort(TCopy,function(a,b) return (a[Sortstats] > b[Sortstats]) end)
		local chat = "Current Top Chatters:\r\n\r\n"
		chat = chat.."\t ------------------------------------------------------------------------\r\n"
		chat = chat.."\t Nr.\tPosts:\tChars:\tWords:\tName:\r\n"
		chat = chat.."\t ------------------------------------------------------------------------\r\n"
		for i = 1,25 do 
			if TCopy[i] then
				chat = chat.."\t "..i..".\t "..tCopy[i][2].."\t "..tCopy[i][3].."\t "..tCopy[i][4].."\t "..tCopy[i][5].happy.."\t "..tCopy[i][5].sad.."\t"..tCopy[i][1].."\r\n"
			end
		end
		SendToAll(sBot, chat)
		TCopy={}
	end
end


Cheers

Casanova82


jiten


SMF spam blocked by CleanTalk