-- auto/manual user cleaner if user hasn't been in the hub for x weeks -- cleans all levels but master level -- made by plop -- julian day function made by the guru tezlo -- code stripped from artificial insanety bot -- !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 -- a folder named userinfo is needed for this bot 2 work --------------------------------------------------------------------- config WEEKS = 4 -- every1 older then x weeks is deleted Bot = "The_Cleaner" AUTO = 1 -- use 1 for automode, 0 for manual --------------------------------------------------------------------- the needed tables UsersTable = {} Seen = {} NoClean = {} --------------------------------------------------------------------- julian day function 2 calcute the time users spend in the hub function 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 = floor(y/100) b = 2 - a + floor(a/4) end if y <= 0 then c = 0.75 end return floor(365.25*y - c) + floor(30.6001*(m+1) + d + 1720994 + b) end --------------------------------------------------------------------- loading the last seen database function LoadLastSeen() readfrom("userinfo/lastseen.lst") while 1 do local line = read() if line == nil then break end local s,e,name,date = strfind(line, "(.+)$(.+)") if name ~= nil then Seen[name]=date end end readfrom() end --------------------------------------------------------------------- saving last seen date function SaveSeen() writeto("userinfo/lastseen.lst") for a,b in Seen do Seen[a]=b write(a.."$"..b.."\n") end writeto() end --------------------------------------------------------------------- call the garbage man function Clear() collectgarbage() flush() end --------------------------------------------------------------------- opening the registered users file from ptokax and inserting the users into the table function OpenRegisterdUsersFile() readfrom("../RegisteredUsers.dat") UsersTable = nil Clear() UsersTable = {} while 1 do local line = read() local name, level if line == nil then readfrom() break end s,e,name,level = strfind(line,"(.+)|.+|(.+)") if tonumber(level) ~= 0 then UsersTable[name] = 1 end end end --------------------------------------------------------------------- extracting the time/date when a user was last seen from the database function SeenUser(user, data) s,e,who = strfind(data, "%b<>%s%S+%s(.+)") if who == nil then user:SendPM(Bot, "Syntax error, can't read your mind, pls tell me wich user you wanne check|") elseif Seen[who] then user:SendPM(Bot, who.." was last seen on: "..Seen[who].."|") else user:SendPM(Bot, who.." is a unknown user|") end end --------------------------------------------------------------------- shows all the nicks of all registered users function NewShowUsers(user) local lines = {} local info = "\r\n\r\n" info = info.." Here are the registered users\r\n" info = info.."=====================================\r\n" for a,b in UsersTable do tinsert(lines, a) end sort(lines) for i=1,getn(lines) do info = info.." "..lines[i].."\r\n" end info = info.."=====================================\r\n" user:SendPM(Bot, info.." |") Clear() end --------------------------------------------------------------------- shows all the nicks on the no clean list function ShowNoClean(user) local lines = {} local info = "\r\n\r\n" info = info.." Here are the users who aren't cleaned\r\n" info = info.."=====================================\r\n" for a,b in NoClean do tinsert(lines, a) end sort(lines) for i=1,getn(lines) do info = info.." "..lines[i].."\r\n" end info = info.."=====================================\r\n" user:SendPM(Bot, info.." |") Clear() end --------------------------------------------------------------------- cleanup old users function CleanUsers() SendToAll(Bot, "The cleaner has been called. Every registered user who hasn't been in the hub for "..WEEKS.." weeks will be deleted. (contact the OP's if your gone be away for a period longer then that)|") OpenRegisterdUsersFile() local s,e,month,day,year = strfind(date("%x"), "(%d+)%/(%d+)%/(%d+)") year = "20"..year local juliannow = jdate(tonumber(day), tonumber(month), tonumber(year)) local oldest = WEEKS*7 for a,b in UsersTable do if Seen[a] then local s,e,monthu,dayu,yearu = strfind(Seen[a], "(%d+)%/(%d+)%/(%d+)") yearu = "20"..yearu local julianu = jdate(tonumber(dayu), tonumber(monthu), tonumber(yearu)) if (juliannow - julianu) > oldest then SendToAll(Bot, a.." has been cleaned") Seen[a] = nil DelRegUser(a) end else Seen[a] = date("%x") end end SaveSeen() OpenRegisterdUsersFile() end --------------------------------------------------------------------- don't clean this users adding/removing function NoCleanUser(user, data) local s,e,who, addrem = strfind(data, "%b<>%s+%S+%s+(%S+)%s+(%S+)%s*") if (who or addrem) == nil then user:SendData(Bot, "RTFM ;). it's !noclean |") elseif UsersTable[who] then if addrem == "add" then if NoClean[who] then user:SendData(Bot, who.." is allready on the imune list.|") else NoClean[who] = 1 user:SendData(Bot, who.." is added to the imune list and won't be cleaned.|") SaveNoClean() end elseif addrem == "remove" then if NoClean[who] then NoClean[who] = nil user:SendData(Bot, who.." is removed from the imune list.|") SaveNoClean() else user:SendData(Bot, who.." was not on the imune list.|") end else user:SendData(Bot, "RTFM ;). it's !noclean |") end else user:SendData(Bot, who.." isn't a registered user.|") end end --------------------------------------------------------------------- save no clean users 2 file function SaveNoClean() writeto("userinfo/noclean.lst") for a,b in NoClean do write(a.."\n") end writeto() end --------------------------------------------------------------------- load no clean users from file function LoadNoClean() readfrom("userinfo/noclean.lst") while 1 do local line = read() if line == nil then readfrom() break end NoClean[line] = 1 end end --------------------------------------------------------------------- do i need 2 explain this ????? function DataArrival(user, data) if AUTO == 1 then if CleanDay ~= date("%x") then -- user cleaning trigger, works as a timer without a timer CleanDay = date("%x") CleanUsers() end end if( strsub(data, 1, 1) == "<" ) then if user.bOperator then data=strsub(data,1,strlen(data)-1) s,e,cmd = strfind(data,"%b<>%s+(%S+)") if cmd == "!noclean" then NoCleanUser(user, data) return 1 elseif cmd == "!showusers" then NewShowUsers(user) return 1 elseif cmd == "!shownoclean" then ShowNoClean(user) return 1 elseif cmd == "!seen" then SeenUser(user, data) return 1 elseif cmd =="!cleanusers" then CleanUsers() return 1 end end end end --------------------------------------------------------------------- stuff done when a user/vip leaves function UserDisconnected(user) if UsersTable[user.sName] then Seen[user.sName]=date("%x") SaveSeen() end end function OpDisconnected(user) if UsersTable[user.sName] then Seen[user.sName]=date("%x") SaveSeen() end end --------------------------------------------------------------------- stuff done on bot startup function Main() OpenRegisterdUsersFile() LoadNoClean() LoadLastSeen() CleanDay = date("%x") end