Chatstats v3 Lua 5.1
 

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

Chatstats v3 Lua 5.1

Started by TiMeTrAVelleR, 29 March, 2006, 20:47:00

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

TiMeTrAVelleR

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

BrotherBear

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 :( ?
Regards,

BrotherBear

Madman

#2
Script to long to post...

This should do... !chatmonth YY-MM
The !chatmonth get's sent to pm to the user, just as !chatstats
We suffer in silence, we lurk in the shadows, we kill in the night
Site currently down, ETA of returning online is 2099 ;p

bastya_elvtars

#3
Quote from: Madman on 08 February, 2007, 23:38:49
Script to long to post...

Then upload. You can post the 3rd party link for the download by ticking the empty item checkbox.
Everything could have been anything else and it would have just as much meaning.

Madman

We suffer in silence, we lurk in the shadows, we kill in the night
Site currently down, ETA of returning online is 2099 ;p

Yahoo

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
"BoRN FIGhTEr"

Madman

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...
We suffer in silence, we lurk in the shadows, we kill in the night
Site currently down, ETA of returning online is 2099 ;p

bastya_elvtars

Done, and deleted the previous one, since case sensitivity is a bug.
Everything could have been anything else and it would have just as much meaning.

BrotherBear

Regards,

BrotherBear

-SkA-

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.
???:::??x??em?-N????:::??? ?wN??

BrianzaLand Blog" style="border:0

Madman

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
We suffer in silence, we lurk in the shadows, we kill in the night
Site currently down, ETA of returning online is 2099 ;p

-SkA-

#11
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
???:::??x??em?-N????:::??? ?wN??

BrianzaLand Blog" style="border:0

SMF spam blocked by CleanTalk