Regcleaner by plop, :: PtokaX[16.09]
 

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

Regcleaner by plop, :: PtokaX[16.09]

Started by Herodes, 30 March, 2005, 17:51:29

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Herodes

okie .. this is it, core stuff done by [_XStaTiC_] ... optimisations by me ..
-- auto/manual registered user cleaner if user hasn't been in the hub for x weeks
-- made by plop
-- julian day function made by the guru tezlo
-- code stripped from artificial insanety bot
-- updated to LUA 5 by Pothead
-- updated to PtokaX 16.09 by [_XStaTiC_]  Removed the seen part sorry :) i don't use it :)
--- touched by Herodes (optimisation tsunami, and added !seen again)
--- thx to god for giving TimeTraveler the ability to discover those bugs.. notice the plural? :)

-- !noclean  add/remove  - adds/removes users from/to the list which aren't cleaned
-- !showusers - shows all registered users
-- !seen  - shows the last time the user left the hub
-- !shownoclean - shows all names wich are on the noclean list
-- !cleanusers - manualy start the usercleaner

cl = {}
cl.sets = {}
--------------------------------------------------------------------- config
cl.sets.weeks = 2 -- every1 older then x weeks is deleted
cl.sets.bot = "plop" -- the bot Name...
cl.sets.auto = 1 -- 0:disables / 1:enables , automatic mode ( if disabled use !cleanusers to clean )
cl.levels = { [3]=1, [2]=1} -- levels it needs 2 clean 3=reg 2=vip
cl.files = { no = "logs/NoClean.lst", user = "logs/CleanUser.lst" } -- these are the files..
--------------------------------------------------------------------- the needed tables // pls dont edit anything here..
cl.user = {}
cl.no = {}
cl.funcs = {}

--------------------------------------------------------------------- julian day function 2 calcute the time users spend in the hub
function cl.funcs.jdate(d, m, y)
	local a, b, c = 0, 0, 0
	if m <= 2 then y = y - 1; m = m + 12; end
	if (y*10000 + m*100 + d) >= 15821015 then
		a = math.floor(y/100); b = 2 - a + math.floor(a/4)
	end
	if y <= 0 then c = 0.75 end
	return math.floor(365.25*y - c) + math.floor(30.6001*(m+1) + d + 1720994 + b)
end

--------------------------------------------------------------------- Load a file
function cl.funcs.load(file)
	local f = io.open(file, "r")
	if f then
		for line in f:lines() do
			local s,e,name,date = string.find(line, "(.+)$(.+)")
			if name then cl.user[name] = date; end
		end
		f:close()
	end
end

--------------------------------------------------------------------- Save to file
function cl.funcs.save(file, tbl)
	local f = io.open(file, "w+")
	for a,b in tbl do
		f:write(a.."$"..b.."\n")
	end
	f:close()
end

--------------------------------------------------------------------- call the garbage man
function cl.funcs.cls()
	collectgarbage()
	io.flush()
end

--------------------------------------------------------------------- Display some table
function cl.funcs.showusers( user, data )
	local tbl, txt;
	if (type(data) == "string") then
		local s,e,Profile = string.find(data, "%b<>%s+%S+%s+(%S+)")
		if not Profile then user:SendData(cl.sets.bot , "RTFM ;). It's !showusers "); return 1; end
		tbl = GetUsersByProfile(Profile);
		txt = "registered users with Profile ("..Profile..")"
	else
		local function to_array(t) local r; for i , v in t do table.insert(r, i); end; return r; end
		tbl = to_array(data)
		txt = "users who aren't cleaned"
	end
	local info = "\n Here are the "..txt.."\n"
	info = info.."=====================================\n"
	for i,nick in tbl do info = info.."  "..nick.."\n"; end
	info = info.."=====================================\n"
	user:SendData( "$To: "..user.sName.." From: "..user.sName.." $<"..cl.sets.bot.."> "..info)
	cl.funcs.cls()
end


--------------------------------------------------------------------- cleanup old users
function cl.funcs.clean()
	SendToAll(cl.sets.bot , "The_Cleaner has been called. Every registered user who hasn't been in the hub for "..cl.sets.weeks.." weeks will be deleted. ")
	SendToAll(cl.sets.bot , "(contact the OP's if your gone be away for a period longer then that)")
	local juliannow = cl.funcs.jdate(tonumber(os.date("%d")), tonumber(os.date("%m")), tonumber(os.date("%Y")))
	local oldest = cl.sets.weeks*7
	local chkd, clnd = 0,0
	for prof, v in cl.levels do
		for a, b in GetUsersByProfile(GetProfileName(prof)) do
			chkd = chkd + 1
			if cl.user[b] then
					if not cl.no[b] then
						local s, e, month, day, year = string.find(cl.user[b], "(%d+)%/(%d+)%/(%d+)");
						year = "20"..year
						local julian = cl.funcs.jdate( tonumber(day), tonumber(month), tonumber(year) )
						if ((juliannow - julian) > oldest) then
							cl.user[b] = nil;
							DelRegUser(b);
							clnd = clnd + 1;
						end
					end
			else
				cl.user[b] = os.date("%x")
			end
		end
	end
	if chkd ~= 0 then
		SendToAll(cl.sets.bot , chkd.." users were procest, "..clnd.." of them were deleted.")
	else
		SendToAll(cl.sets.bot ,"Nobody to clean :(")
	end
	cl.funcs.save(cl.files.user, cl.user);
end

--------------------------------------------------------------------- don't clean this users adding/removing
function cl.funcs.addnocl( user, data )
	local s,e,who, addrem = string.find(data, "%b<>%s+%S+%s+(%S+)%s+(%S+)%s*")
	if who and addrem then
		if frmHub:isNickRegged(who) then
			if (addrem == "add") then
				if cl.no[who] then
					user:SendData(cl.sets.bot , who.." is allready on the imune list.")
				else
					cl.no[who] = 1
					user:SendData(cl.sets.bot , who.." is added to the imune list and won't be cleaned.")
					cl.funcs.save(cl.files.no, cl.no)
				end
			elseif addrem == "remove" then
				if cl.no[who] then
					cl.no[who] = nil
					user:SendData(cl.sets.bot , who.." is removed from the imune list.")
					cl.funcs.save(cl.file.no, cl.no)
				else
					user:SendData(cl.sets.bot , who.." was not on the imune list.")
				end
			else
				user:SendData(cl.sets.bot , "RTFM ;). it's !noclean  ")
			end
		else
			user:SendData(cl.sets.bot , who.." isn't a registered user.")
		end
	else
		user:SendData(cl.sets.bot , "Syntax Error, Use: !noclean  ")
	end
end
--------------------------------------------------------------------- Respond to a !seen
function cl.funcs.seen( user, data )
	local s,e,who = string.find( data, "%b<>%s+%S+%s+(%S+)" )
	if who then
		if who ~= user.sName then
			if not GetItemByName(who) then
				if cl.user[who] then
					user:SendData( cl.sets.bot, who.." was last seen on the "..cl.user[who])
				else
					user:SendData( cl.sets.bot, "How should I know when "..who.." was last seen ?")
				end
			else
				user:SendData( cl.sets.bot, who.." is online ... open those eyes of yours..")
			end
		else
			user:SendData( cl.sets.bot, "aren't you that guy ?")
		end
	else
		user:SendData( cl.sets.bot, "Syntax Error, Use: !seen ")
	end
end
--------------------------------------------------------------------- do i need 2 explain this ?????
function ChatArrival(user, data)
	if (cl.sets.auto == 1) then
		if cl.day ~= os.date("%x") then -- user cleaning trigger, works as a timer without a timer
			cl.day = os.date("%x")
			cl.funcs.clean()
		end
	end
	if (user.bOperator) then
		data = string.sub(data,1,-2)
		local s,e,cmd = string.find(data,"%b<>%s+(%S+)")
		if cmd then
			if (cmd == "!noclean") then cl.funcs.addnocl(user, data); return 1;
			elseif (cmd == "!seen") then cl.funcs.seen(user, data); return 1;
			elseif (cmd == "!showusers") then cl.funcs.showusers( user, data ); return 1;
			elseif (cmd == "!shownoclean") then cl.funcs.showusers( user, cl.no ); return 1;
			elseif (cmd =="!cleanusers") then cl.funcs.clean(); return 1;
			end
		end
	end
end

--------------------------------------------------------------------- stuff done when a user/vip leaves or come
function NewUserConnected(user)
	if cl.user[user.sName] then
		cl.user[user.sName] = nil;
		cl.funcs.save(cl.files.user, cl.user);
	end
end
OpConnected = NewUserConnected

function UserDisconnected(user)
	if (cl.levels[user.iProfile] == 1) then
		cl.user[user.sName] = os.date("%x");
		cl.funcs.save(cl.files.user, cl.user);
	end
end
OpDisconnected = UserDisconnected

--------------------------------------------------------------------- stuff done on bot startup
function Main()
	cl.funcs.load(cl.files.no)
	cl.funcs.load(cl.files.user)
	cl.day = os.date("%x")
end

TiMeTrAVelleR

2 thing   i used command !cleanusers

got a error
Syntax ...eaublad\-=(TrAnCe)=- Hub\scripts\New UserCleaner.lua:100: attempt to index global `CleanUser' (a nil value)

and  i see command  in main
18:48:52] The_Cleaner has been called. Every registered user who hasn't been in the hub for 2 weeks will be deleted.
[18:48:52] (contact the OP's if your gone be away for a period longer then that)
[18:48:52] <-T??--T?M??r?V?ll?R> !cleanusers


Greetzz TT

Anna

#2
I'm pretty sure it actually does clean the users, but there's a couple things I'd like to tell..

when doin a !noclean or !cleanusers command its visible to all, I would prefere if it wasnt, can this be fixed? (the respons from bot aint seen when doin a no clean though)

When doin !shownoclean or !showreg, the sender of the pm with the info is my own nick, would prefer the bot to be sender... (botnick is shown in the pm, my nick is shown on the tab) theese dont show all what the command for it was so no users can tell I did this...

the !seen command however dont show command in main and sends back info in main from bot

edit after seeing post above: I've had thoose syntax errors as well, but not every attempt to do a !cleanusers

[_XStaTiC_]

#3
btw Herodes thanks for optimisation tsunami  hehehe LoL

TiMeTrAVelleR

Thanks [_XStaTiC_]  that did it      works  fine now

0:18:51] The_Cleaner has been called. Every registered user who hasn't been in the hub for 2 weeks will be deleted.
[20:18:51] (contact the OP's if your gone be away for a period longer then that)
[20:18:51] 1352 users were procest, 0 of them were deleted.


Greetzzz TT

TiMeTrAVelleR

New error found  
Syntax ...eaublad\-=(TrAnCe)=- Hub\scripts\New UserCleaner.lua:134: attempt to index field `file' (a nil value)

Greetzz TT

Herodes

oki.. sry about the above errors.. and sincere thx for reporting them.. My first post has now been edited ..

TiMeTrAVelleR

Oki running  this version  i added a user  to imune list   used commands  show noclean     got this

21:29:29]
 Here are the who aren't cleaned
=====================================
  1
=====================================
number there   but no username  

Greetz  TT

Herodes

wow tt! ,... that ability of yours we have to take advantage ;)
its sorted I believe .. ( post edited once more ;)

TiMeTrAVelleR

Used command
21:58:53] <-T??--T?M??r?V?ll?R> !shownoclean

Got this now  

Syntax ...eaublad\-=(TrAnCe)=- Hub\scripts\New UserCleaner.lua:84: attempt to call local `info' (a nil value)


Greetzz TT

Herodes

sry for being a pain .. it should be ok now .. re-edited my post again

Psycho_Chihuahua

Message working fine but  when i checked the hub i got this after using "!cleanusers"

Syntax ...\scripts\regcleaner.lua:56: attempt to index local `f' (a nil value)

PtokaX Build 16.09
PtokaxWiki ?PtokaX Mirror + latest Libs

01100001011011000111001101101111001000000110101101101110011011110111011101101110001000000110000101110011001000000101010001101111011010110110111101101100011011110111001101101000

Nada@WTB

Thanks guys, it works great :D
Welcome Thieving Bastards
PtokaX 0.4.1.1
Leviathan v.4.1
ApexDC++ 1.2.1
Windows 7 Ultimate

Herodes

QuoteOriginally posted by Psycho_Chihuahua
Message working fine but  when i checked the hub i got this after using "!cleanusers"

Syntax ...\scripts\regcleaner.lua:56: attempt to index local `f' (a nil value)

PtokaX Build 16.09
be sure that you have a folder named 'logs' in the scripts folder ...

Psycho_Chihuahua

that was it ^^ thnx m8 running fine now
PtokaxWiki ?PtokaX Mirror + latest Libs

01100001011011000111001101101111001000000110101101101110011011110111011101101110001000000110000101110011001000000101010001101111011010110110111101101100011011110111001101101000

TiMeTrAVelleR

Sorry to be a pain whit using command !shownoclean   i got this

Syntax ...eaublad\-=(TrAnCe)=- Hub\scripts\New UserCleaner.lua:76: bad argument #1 to `insert' (table expected, got nil)


Greetzz TT

Cid

maybe some cosmetic changes to the messages would be nice too so that I dont have to change them myself everytime the script gets updated :P

procest... that should be "processed"
imune... that's "immune"

Except for those little typos this script is very nice and useful.

Thanks a lot to you people who make it possible to have such nice things :)

jiten

QuoteOriginally posted by Cid
maybe some cosmetic changes to the messages would be nice too so that I dont have to change them myself everytime the script gets updated :P

procest... that should be "processed"
imune... that's "immune"

Except for those little typos this script is very nice and useful.

Thanks a lot to you people who make it possible to have such nice things :)

That's would be quite simple for u just by using the Replace function in notepad...  ;)

Cid

sure. but doing it everytime when it only has to be done here once. and if you change it here... everybody will have a corrected version.

jiten

That's a point too  :]

UwV

#20
QuoteSyntax ...eaublad\-=(TrAnCe)=- Hub\scripts\New UserCleaner.lua:76: bad argument #1 to `insert' (table expected, got nil)
i get this error too what to do ? ..


and spelling imo (if it count as any .. ;0)
.. it is a thing to keep in mind for our children....
but dont we all use our own lines anyway ? .. i know do.
Quotefrom my old version..
   info = info.."  Here are the dirty old "..CleanProfiles.."'s who aren't cleaned\r\n"
 :D

more important is the "real" bugs.. the ones that spell "syntax error" .. ;)
\NL   The knowledge and skills you have achieved are meant to be forgotten so you can float comfortably in emptiness, without obstruction.
" Holly loves me,...  . "      ;o)

& don't forget, the motto is :
  -- SUPPORT YOUR LOCAL DJ'S --

imby

[pedant on]

(contact the OP's if your gone be away for a period longer then that

Here's the correct grammar:

contact an Op if you're going to be away for a longer period than that

[/pedant off]

Herodes

I'll check on the error about the nil l8r today. Sry to keep you waiting ..

As far as the other 'bugs' being discussed in here, I will not change the strings in any later realeases. This is because 'its plop's words',... that meands 'holy' Looool

Herodes

This one should be the final ;) the chances for bugs are minimal now .. if someone finds a bug he wins a custom script ;P,..
and for those that are interested, the typos are fixed too..
there you go ppl ;)
-- auto/manual registered user cleaner if user hasn't been in the hub for x weeks
-- made by plop
-- julian day function made by the guru tezlo
-- code stripped from artificial insanety bot
-- updated to LUA 5 by Pothead
-- updated to PtokaX 16.09 by [_XStaTiC_]  Removed the seen part sorry :) i don't use it :)
--- touched by Herodes (optimisation tsunami, and added !seen again)
--- thx to god for giving TimeTraveler the ability to discover those bugs.. notice the plural? :)
--- should be working flawlessly now. 15:18 - 31/3/2005
--- ( before you doubt the above line be sure that you have a 'logs' folder in 'scripts' folder)

-- !noclean  add/remove  - adds/removes users from/to the list which aren't cleaned
-- !showusers - shows all registered users
-- !seen  - shows the last time the user left the hub
-- !shownoclean - shows all names wich are on the noclean list
-- !cleanusers - manualy start the usercleaner

cl = {}
cl.sets = {}
--------------------------------------------------------------------- config
cl.sets.weeks = 2 -- every1 older then x weeks is deleted
cl.sets.bot = "plop" -- the bot Name...
cl.sets.auto = 1 -- 0:disables / 1:enables , automatic mode ( if disabled use !cleanusers to clean )
cl.levels = { [3]=1, [2]=1} -- levels it needs 2 clean 3=reg 2=vip
cl.files = { no = "logs/NoClean.lst", user = "logs/CleanUser.lst" } -- these are the files..
--------------------------------------------------------------------- the needed tables // pls dont edit anything here..
cl.user = {}
cl.no = {}
cl.funcs = {}

--------------------------------------------------------------------- julian day function 2 calcute the time users spend in the hub
function cl.funcs.jdate(d, m, y)
	local a, b, c = 0, 0, 0
	if m <= 2 then y = y - 1; m = m + 12; end
	if (y*10000 + m*100 + d) >= 15821015 then
		a = math.floor(y/100); b = 2 - a + math.floor(a/4)
	end
	if y <= 0 then c = 0.75 end
	return math.floor(365.25*y - c) + math.floor(30.6001*(m+1) + d + 1720994 + b)
end

--------------------------------------------------------------------- Load a file
function cl.funcs.load(file, tbl)
	local f = io.open(file, "r")
	if f then
		for line in f:lines() do
			local s,e,name,date = string.find(line, "(.+)$(.+)")
			if name then tbl[name] = date; end
		end; f:close();
	end
end

--------------------------------------------------------------------- Save to file
function cl.funcs.save(file, tbl)
	local f = io.open(file, "w+")
	for a,b in tbl do f:write(a.."$"..b.."\n"); end; f:close()
end

--------------------------------------------------------------------- call the garbage man
function cl.funcs.cls()
	collectgarbage();io.flush();
end

--------------------------------------------------------------------- Display some table
function cl.funcs.showusers( user, data )
	local tbl, txt, sep = {}, "users who aren't cleaned", string.rep("=", 40);
	if (type(data) == "string") then
		local s,e,Profile = string.find(data, "%b<>%s+%S+%s+(%S+)")
		if not Profile then user:SendData(cl.sets.bot , "Syntax Error, Use: !showusers "); return 1; end
		tbl = GetUsersByProfile(Profile); txt = "registered users with Profile ("..Profile..")";
	else
		local c=1; for i,v in data do tbl[c] = i; c=c+1;end;
	end
	local c = table.getn(tbl);
	if (c > 0) then
		local info = "\r\n Here are the "..txt.."\r\n "..sep.."\r\n"
		for i=1,c do info = info.."   ? "..tbl[i].."\r\n "; end
		user:SendData( "$To: "..user.sName.." From: "..user.sName.." $<"..cl.sets.bot.."> "..info..sep.."\r\n");
		cl.funcs.cls();return 1;
	end
	user:SendData( cl.sets.bot, "There are no "..txt);cl.funcs.cls();return 1;
end


--------------------------------------------------------------------- cleanup old users
function cl.funcs.clean()
	SendToAll(cl.sets.bot , "The Cleaner has been called. Every registered user who hasn't been in the hub for "..cl.sets.weeks.." weeks will be deleted. ")
	SendToAll(cl.sets.bot , "(contact an Operator if you are going to be away for a longer period than that)")
	local juliannow = cl.funcs.jdate(tonumber(os.date("%d")), tonumber(os.date("%m")), tonumber(os.date("%Y")))
	local oldest, chkd, clnd,x = (cl.sets.weeks*7),0,0,os.clock()
	for prof, v in cl.levels do
		for a, b in GetUsersByProfile(GetProfileName(prof)) do
			chkd = chkd + 1
			if cl.user[b] then
					if not cl.no[b] then
						local s, e, month, day, year = string.find(cl.user[b], "(%d+)%/(%d+)%/(%d+)");
						local julian = cl.funcs.jdate( tonumber(day), tonumber(month), tonumber("20"..year) )
						if ((juliannow - julian) > oldest) then cl.user[b] = nil; DelRegUser(b); clnd = clnd + 1; end;
					end
			else cl.user[b] = os.date("%x");
			end
		end
	end
	cl.funcs.save(cl.files.user, cl.user);
	if (chkd > 0) then SendToAll(cl.sets.bot , chkd.." users were processed, "..clnd.." were deleted ( "..string.format("%0.2f",((clnd*100)/chkd)).."% ) in: "..string.format("%0.4f", os.clock()-x ).." seconds.");return 1; end;
	SendToAll(cl.sets.bot ,"Nobody to clean :(");return 1;
end

--------------------------------------------------------------------- don't clean this users adding/removing
function cl.funcs.addnocl( user, data )
	local s,e,who, addrem = string.find(data, "%b<>%s+%S+%s+(%S+)%s+(%S+)%s*")
	if who and addrem then
		if frmHub:isNickRegged(who) then
			if (addrem == "add") then
				if cl.no[who] then user:SendData(cl.sets.bot , who.." is already on the immune list.");return 1; end;
				cl.no[who] = 1; cl.funcs.save(cl.files.no, cl.no);
				user:SendData(cl.sets.bot , who.." is added to the immune list and won't be cleaned.");return 1;
			elseif addrem == "remove" then
				if not cl.no[who] then user:SendData(cl.sets.bot , who.." was not on the immune list.");return 1; end
				cl.no[who] = nil; cl.funcs.save(cl.files.no, cl.no);
				user:SendData(cl.sets.bot , who.." is removed from the immune list.");return 1;
			end; user:SendData(cl.sets.bot , "Syntax Error, Use: !noclean  ");return 1;
		end; user:SendData(cl.sets.bot , who.." isn't a registered user.");return 1;
	end; user:SendData(cl.sets.bot , "Syntax Error, Use: !noclean  ");return 1;
end
--------------------------------------------------------------------- Respond to a !seen
function cl.funcs.seen( user, data )
	local s,e,who = string.find( data, "%b<>%s+%S+%s+(%S+)" )
	if who then
		if (who ~= user.sName) then
			if not GetItemByName(who) then
				if cl.user[who] then user:SendData( cl.sets.bot, who.." was last seen on the "..cl.user[who]);return 1; end
				user:SendData( cl.sets.bot, "How should I know when "..who.." was last seen ?");return 1;
			end; user:SendData( cl.sets.bot, who.." is online... open those eyes of yours..");return 1;
		end; user:SendData( cl.sets.bot, "aren't you that guy?");return 1;
	end; user:SendData( cl.sets.bot, "Syntax Error, Use: !seen ");return 1;
end
--------------------------------------------------------------------- do i need 2 explain this ?????
function ChatArrival(user, data)
	if ( (cl.sets.auto == 1) and (cl.day ~= os.date("%x")) ) then -- user cleaning trigger, works as a timer without a timer
		cl.day = os.date("%x"); cl.funcs.clean();
	end
	if (user.bOperator) then
		data = string.sub(data,1,-2)
		local s,e,cmd = string.find(data,"%b<>%s+(%S+)")
		if cmd then
			if (cmd == "!noclean") then return cl.funcs.addnocl(user, data);
			elseif (cmd == "!seen") then return cl.funcs.seen(user, data);
			elseif (cmd == "!showusers") then return cl.funcs.showusers( user, data );
			elseif (cmd == "!shownoclean") then return cl.funcs.showusers( user, cl.no );
			elseif (cmd =="!cleanusers") then return cl.funcs.clean();
			end
		end
	end
end

--------------------------------------------------------------------- stuff done when a user/vip leaves or come
function NewUserConnected(user)
	if cl.user[user.sName] then
		cl.user[user.sName] = nil; cl.funcs.save(cl.files.user, cl.user);
	end
end
OpConnected = NewUserConnected

function UserDisconnected(user)
	if (cl.levels[user.iProfile] == 1) then
		cl.user[user.sName] = os.date("%x"); cl.funcs.save(cl.files.user, cl.user);
	end
end
OpDisconnected = UserDisconnected

--------------------------------------------------------------------- stuff done on bot startup
function Main()
	cl.funcs.load(cl.files.no, cl.no);
	cl.funcs.load(cl.files.user, cl.user);
	cl.day = os.date("%x")
end

Pothead

Probably makes no difference, but wouldn't it be better to have :
io.flush() before collectgarbage() instead of after it ?

SMF spam blocked by CleanTalk