can this script be converted??
 

can this script be converted??

Started by ?StIfFLEr??, 30 October, 2008, 14:10:37

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

?StIfFLEr??

-- 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
-- Added: chatter of Month, Madman, requested by BrotherBear
-- Added: not case senastive, all nicks will be loged in lower case, Madman, requested by Yahoo

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

Chatstats = {}
ChatstatsMonth = {}

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
}


---------- Warning! Do Not Edit! -----------
ChatStatsFileMonth = "chatstats - " ..os.date("%y-%m").. ".tbl"
---------- Warning! Do Not Edit! -----------

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)
	local file = io.open(ChatStatsFileMonth, "r")
	if file then
		file:close()
	else
		local file = io.open(ChatStatsFileMonth, "w+")
		file:write()
		file:close()
	end
	dofile(ChatStatsFileMonth)
end

function NewUserConnected(user)
	if SendComm == 1 and EnableChatStats[user.iProfile] == 1 then
		if Chatstats[string.lower(user.sName)] then
			user:SendData(sBot, "---===[ Your Chat Stats:  You Made "..Chatstats[string.lower(user.sName)]["post"].." Posts In Main Used "..Chatstats[string.lower(user.sName)]["chars"].." Characters, And "..Chatstats[string.lower(user.sName)]["words"].." Words ]===---")
		end
		user:SendData("$UserCommand 1 3 "..pMenu.."\\Chat stats$<%[mynick]> !chatstats&#124;")
		user:SendData("$UserCommand 1 3 "..pMenu.."\\Chat stats Year-Month$<%[mynick]> !chatmonth %[line:YY-MM]&#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")
		saveTableToFile(ChatStatsFileMonth, ChatstatsMonth, "ChatstatsMonth")
	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[string.lower(user.sName)] == 1 then
		else
			local s,e,str = string.find(data, "%b<>%s+(.*)%|")
			updStats(string.lower(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[string.lower(user.sName)] then
				user:SendData(sBot, "---===[ Your Chat Stats:  You Made "..Chatstats[string.lower(user.sName)]["post"].." Posts In Main Used "..Chatstats[string.lower(user.sName)]["chars"].." Characters, And "..Chatstats[string.lower(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,
		["chatmonth"] = function(user,data)
			local _,_,Y,M = string.find(data,"%b<>%s+%S+%s+(%d%d)%-(%d%d)")
			if Y or M then
				if loadfile("chatstats - " ..Y.. "-" ..M.. ".tbl") then
					loadTableFromFile("chatstats - " ..Y.. "-" ..M.. ".tbl")
					TCopy={}
					for i,v in pairs(ChatstatsMonth) 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 of Month:\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={}
					loadTableFromFile(ChatStatsFileMonth)
				else
					user:SendData(sBot,"That month has not been loged")
				end
			else
				user:SendData(sBot, "Syntax: !chatmonth YY-MM i.e 07-02 for feb, 07")
			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 " ..string.lower(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")}
	local tmpM = ChatstatsMonth[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")
	tmpM["post"], tmpM["chars"], tmpM["words"], tmpM["time"] = tmpM["post"]+1, tmpM["chars"]+string.len(str), tmpM["words"]+cntargs(str,"(%a+)"), os.date("%x")
	Chatstats[nick] = tmp
	ChatstatsMonth[nick] = tmpM
	saveTableToFile(ChatStatsFile, Chatstats, "Chatstats")
	saveTableToFile(ChatStatsFileMonth,ChatstatsMonth,"ChatstatsMonth")
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 f = io.open(file)
	if f then
		local r = f:read("*a")
		f:flush()
		f:close()
		local func,err = loadstring(r)
		if func then x,err = pcall(func) end
	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;

SMF spam blocked by CleanTalk