PtokaX forum

Archive => Archived 5.1 boards => Finished Scripts => Topic started by: TiMeTrAVelleR on 29 March, 2006, 20:47:00

Title: Chatstats v3 Lua 5.1
Post by: TiMeTrAVelleR on 29 March, 2006, 20:47:00


-- 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
---- Madman Return's
-- Changed: New ChatArrival
-- Changed: Some Commands
-- Changed: Some small code...
-- Changed: Modded 4 my hub
---- Madman strikes again
-- Added: a lowerchatter cmd, use it to lower someones chatstats post
-- Changed to lua 5.1 by TT

sBot = frmHub:GetHubBotName() -- 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"

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

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

AllowedProfiles = {
[0] = 1,? ?-- Masters
[1] = 0,? ?-- Operators
}

function Main()
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.."\\Chat stats$<%[mynick]> !chatstats&#124;")
user:SendData("$UserCommand 1 3 "..pMenu.."\\My Chat Stat$<%[mynick]> !mystats&#124;")
if AllowedProfiles[user.iProfile] == 1 then
user:SendData("$UserCommand 1 3 "..pMenu.."\\Op menu\\Del Chatter$<%[mynick]> !delchatter %[line:Nick]&#124;")
user:SendData("$UserCommand 1 3 "..pMenu.."\\Op Menu\\Lower Chatter$<%[mynick]> !lowerchatter %[line:Nick] %[line:New posts]&#124;")
user:SendData("$UserCommand 1 3 "..pMenu.."\\Op Menu\\Clear Chat Stats$<%[mynick]> !clearstats&#124;")
end
if user.bOperator then
user:SendData("$UserCommand 1 3 "..pMenu.."\\Op Menu\\TopChatters in Main$<%[mynick]> !topchat&#124;")
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<>%s+(.*)%|")
updStats(user.sName, str)
end
end
local data = string.sub(data,1, -2)
local s,e,cmd = string.find(data, "%b<>%s+[%!%+%?](%S+)")
if cmd then
cmd = string.lower(cmd)
local tCmds = {
["mystats"] = function(user, data)
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 ]===---")
else
user:SendData(sBot, "*** No chat statics found!")
end
return 1
end,
["chatstats"] = function(user, data)
TCopy={}
if Chatstats then
for i,v in pairs(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
user:SendPM(sBot, chat)
TCopy={}
end
return 1
end,
["topchat"] = function(user, data)
if user.bOperator then
TCopy={}
if Chatstats then
for i,v in pairs(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
return 1
end
end,
["lowerchatter"] = function(user, data)
if AllowedProfiles[user.iProfile] == 1 then
local s,e,name,chat = string.find(data, "%b<>%s+%S+%s+(%S+)%s+(%d+)")
if name and chat then
if Chatstats[name] then
chat = tonumber(chat)
if Chatstats[name]["post"] <= chat then
user:SendData(sBot, "*** You can not raise the stats!")
else
local OldChat = Chatstats[name]["post"]
Chatstats[name]["post"] = chat
SendToOps(sBot, "*** Chatstats posts for " ..name.. " has been lowered to " ..chat.. " from " ..OldChat.. " by " ..user.sName)
saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
end
else
user:SendData(sBot, "*** " ..name.. " is not in chatstats")
end
else
user:SendData(sBot, "*** Usage: !lowerchatter <name> <new posts>")
end
return 1
end
end,
["delchatter"] = function(user, data)
if AllowedProfiles[user.iProfile] == 1 then
local s,e,name = string.find(data, "%b<>%s+%S+%s+(%S+)" )
if name then
if Chatstats[name] then
Chatstats[name] = nil
SendToOps(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 <name>")
end
return 1
end
end,
["clearstats"] = function(user, data)
if AllowedProfiles[user.iProfile] == 1 then
Chatstats = {}
saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
SendToAll(sBot, "Chatstats are cleared by "..user.sName)
return 1
end
end,
}
if tCmds[cmd] then
return tCmds[cmd](user, data)
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 pairs(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 pairs(t) do
return false;
end
return true;
end;


greetzz TT
Title: Re: Chatstats v3 Lua 5.1
Post by: BrotherBear on 03 February, 2007, 18:09:43
Hi!

Is it any chance to have 2 of this script?

I want to have one stats for alltimers and one where we reset it every month ( Chatter of the month :D )

Thanks in advance

No one :( ?
Title: Re: Chatstats v3 Lua 5.1
Post by: Madman on 08 February, 2007, 23:38:49
Script to long to post... (http://forum.ptokax.org/index.php?action=tpmod;dl=item43)

This should do... !chatmonth YY-MM
The !chatmonth get's sent to pm to the user, just as !chatstats
Title: Re: Chatstats v3 Lua 5.1
Post by: bastya_elvtars on 08 February, 2007, 23:39:25
Quote from: Madman on 08 February, 2007, 23:38:49
Script to long to post... (http://www.thedestruction.org/lua/lua5/ChatStatsV3.lua)

Then upload. You can post the 3rd party link for the download by ticking the empty item checkbox.
Title: Re: Chatstats v3 Lua 5.1
Post by: Madman on 08 February, 2007, 23:44:27
Done, link edited...
Title: Re: Chatstats v3 Lua 5.1
Post by: Yahoo on 09 February, 2007, 03:48:00
This script is not case sensitive ??
Current Top Chatters:

    ------------------------------------------------------------------------
    Nr.   Posts:   Chars:   Words:   Name:
    ------------------------------------------------------------------------
    1.    20    2075    351   bastya_elvtars
    2.    12    349     41    Madman
    3.    9     87      20     mutor
    4.    8     64      16     MuToR

The nick mutor has ranked 3rd and 4th even though he is a single user..
can somebody solve this
Title: Re: Chatstats v3 Lua 5.1
Post by: Madman on 09 February, 2007, 11:30:57
Fixed...

http://forum.ptokax.org/index.php?action=tpmod;dl=item44


And again i forgot to change to chatscripts cat when i uploaded... so someone has to move it there...
Title: Re: Chatstats v3 Lua 5.1
Post by: bastya_elvtars on 09 February, 2007, 12:07:35
Done, and deleted the previous one, since case sensitivity is a bug.
Title: Re: Chatstats v3 Lua 5.1
Post by: BrotherBear on 09 February, 2007, 17:00:15

Thank You Very Much Madman :)
Title: Re: Chatstats v3 Lua 5.1
Post by: -SkA- on 13 May, 2007, 10:39:31
I've tried to download this script but:

An Error Has Occurred!
The DL Manager module is not active. 

:o

EDIT: downloaded from scriptdb
A request:   

Is it possible to modify this script in order to add an additional column called "Total" that would be the sum of the previous 3 and then sort the stats with this new value?   (total = chars + words + posts)

Thank you.
Title: Re: Chatstats v3 Lua 5.1
Post by: Madman on 13 May, 2007, 13:44:22
Done, Script can be found on my site under Lua 5 link

-- Madman does it again
-- Added: Total (char+words+post), request by -SkA-
-- Adedd: Option for Total
-- Changed: Cleaned up code, chatstats,chatmonth and topchat now use same function
-- Added: Sorting by Total, request by -SkA-
-- Changed: Shortstats Option
Title: Re: Chatstats v3 Lua 5.1
Post by: -SkA- on 13 May, 2007, 13:58:32
Thank you Madman but I got this error:

chatstats.lua:239: attempt to compare two nil values

EDIT: I had to remove old stats, now it works :P