PtokaX forum

Archive => Archived 5.1 boards => Request for scripts => Topic started by: TS-SkyNet on 03 November, 2006, 18:35:15

Title: UserCleaner
Post by: TS-SkyNet on 03 November, 2006, 18:35:15
Hi all wondering if someone could give me some help been out of scripting for a while now  i need plops cool script to clean all profiles script  and profiles i need below would be greatfull if someone could help thx
-- 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? :)
-- Pothead changed to allow different profiles to have a different cleaning time and updated to lua 5.1
-- Mod by Mutor, check for & create logs folder if non-existent, added process time for nightshadow
-- Corrected a few ancient spelling errors.

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

--------------------------------------------------------------------- the needed tables // pls dont edit anything here..
cl = {}
cl.sets = {}
cl.levels = {}
cl.user = {}
cl.no = {}
cl.funcs = {}
--------------------------------------------------------------------- config
cl.sets.bot = frmHub:GetHubBotName() -- the bot Name...
cl.sets.auto = 1 -- 0:disables / 1:enables , automatic mode ( if disabled use !cleanusers to clean )
cl.files = { no = "logs/NoClean.lst", user = "logs/CleanUser.lst" } -- these are the files..

cl.levels = { [3]=2, [2]=26} -- levels it needs 2 clean 3=reg 2=vip , then = the amount of weeks to clean them in

--------------------------------------------------------------------- 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 pairs(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 <Profile_name>"); return 1; end
tbl = GetUsersByProfile(Profile);
txt = "registered users with Profile ("..Profile..")"
else
local function to_array(t) local r={}; for i , v in pairs(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 pairs(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()
local start = os.clock()
local juliannow = cl.funcs.jdate(tonumber(os.date("%d")), tonumber(os.date("%m")), tonumber(os.date("%Y")))
local chkd, clnd, totalchecked = 0,0,0
local msg = "\r\nThe Cleaner has just ran.\r\n"
for prof, v in pairs(cl.levels) do
msg = msg.."\r\nEvery "..GetProfileName(prof).." user who hasn't been in the hub for "..cl.levels[prof].." weeks will be deleted."
local oldest = cl.levels[prof] * 7
for a, b in pairs(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
msg = msg.." "..chkd.." users were processed, "..clnd.." of them were deleted."
totalchecked = totalchecked + chkd
chkd = 0
clnd = 0
end
msg = msg.. "\r\n\r\nThis cleanup took: "..string.format("%8.6f seconds",os.difftime(os.clock(),start))..
"\r\n\r\n(Please contact the OP's if your going to be away for a period longer than the one mentioned)"
SendToAll(cl.sets.bot , msg)
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 already 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.files.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 <user_name> <add/remove>")
end
else
user:SendData(cl.sets.bot , who.." isn't a registered user.")
end
else
user:SendData(cl.sets.bot , "Syntax Error, Use: !noclean <nick> <add or remove>")
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 <nick>")
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)
elseif (cmd == "!seen") then cl.funcs.seen(user, data)
elseif (cmd == "!showusers") then cl.funcs.showusers( user, data )
elseif (cmd == "!shownoclean") then cl.funcs.showusers( user, cl.no )
elseif (cmd =="!cleanusers") then cl.funcs.clean()
end
return 1
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] ~= nil) 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()
local f,e = io.open(cl.files.user)
if f == nil then
if os.execute("dir logs") ~= 0 then
os.execute("md logs")
cl.funcs.clean()
Main()
end
else
f:close()
cl.funcs.load(cl.files.no)
cl.funcs.load(cl.files.user)
cl.day = os.date("%x")
end
end
Title: Re: UserCleaner
Post by: TS-SkyNet on 03 November, 2006, 18:35:46
my profiles are

<Profiles>
    <Profile>
        <Name>Master</Name>
        <Permissions>1111111111110111111011111110111101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Permissions>
    </Profile>
    <Profile>
        <Name>Operator</Name>
        <Permissions>1111111110110111111011000010111101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Permissions>
    </Profile>
    <Profile>
        <Name>VIP</Name>
        <Permissions>0111110000100011111000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Permissions>
    </Profile>
    <Profile>
        <Name>Reg</Name>
        <Permissions>0000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Permissions>
    </Profile>
    <Profile>
        <Name>Moderator</Name>
        <Permissions>1111111110110111111011100110111101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Permissions>
    </Profile>
    <Profile>
        <Name>NetFounder</Name>
        <Permissions>1111111111111111111011111110111111011000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Permissions>
    </Profile>
</Profiles>
Title: Re: UserCleaner
Post by: jiten on 07 November, 2006, 19:22:41
If you want to check and clean every profile, have a look at this:

cl.levels = { [3]=2, [2]=26} -- levels it needs 2 clean 3=reg 2=vip , then = the amount of weeks to clean them in

As you can see, you must add the profile number as the index, and the amount of weeks as the value in the above pasted table.

Note that you have the following profiles:

- Reg [3];
- VIP [2];
- Operator [1];
- Moderator [4];
- Master [0];
- NetFounder [5].


Oh, I'm not sure if you've checked the RegCleaner thread but, I've released a rewritten version of this bot :P
Title: Re: UserCleaner
Post by: TS-SkyNet on 09 November, 2006, 18:19:32
thx jiten :)