--- BirthdayMan v 2.6 --- by Herodes -- Update 22/9/2004 --- --- --- --- --- --- -- v2.5 --- When Users are connected if there is a birthday it informs --- When a Birhtday-User connect it plays surprise and informs the Hub -- v2.6 --- Fix from Skyhawk comment for the display age --- --- --- --- --- --- ----- do not edit these four lines sec = 1000 minutes = 1000*60 hours = 1000*(60^2) TxtSend = nil ----- Edit at will bBot = "Surprise" timecheck = 12*hours --- how much time before checking for birthdays ... tProfiles = { ---- profile rights to commands, 0 cant use the bot at all, 1 can use listcmd and addcmd, 2 can also use delcmd and addbircmd... ["-1"] = 0, --- Unregs ["0"] = 2, --- Masters ["1"] = 2, --- Operators ["2"] = 1, --- VIPs ["3"] = 1, --- Regs ["4"] = 0, --- CustomProf1 ["5"] = 0, --- CustomProf2 } --- ( carry on typing your profiles in the right format : ["profile_number"] = value (0/1/2) addcmd = "!mybirthday" --- !mybirthday dd/mm/yyyy dd = day , mm = month , yyyy = year .... Sets your birthday! delcmd = "!delbirthday" --- !delbirthday is needed ... deletes 's birthday from the list listcmd = "!birthdays" --- !birthdays Lists the birthdays stored addbircmd = "!addbirth" --- !addbirth same as addcmd findcmd = "!bornon" --- !bornon Shows a nice list of the ppl you share dates with ;) birthdayfile = "cake.txt" --- The file that will be displayed on Birthday oldestyear = 1900 --- !mybirthday 0/0/0000 situations are avoided ( lol ) allowedage = 6 --- !mybirthday situations are avoided (in years) birthlog = "birthdays.tbl" --- The file where we'll be storing the birthdays ... << has to be in your scripts folder --- // --- Script-Starts tBirthdays = {} tCalendar = { [1] = { 31, "January", }, [2] = { 28, "February", }, [3] = { 31, "March", }, [4] = { 30, "April", }, [5] = { 31, "May", }, [6] = { 30, "June", }, [7] = { 31, "July", }, [8] = { 31, "August", }, [9] = { 30, "September", }, [10] = { 31, "October", }, [11] = { 30, "November", }, [12] = { 31, "December", }, } function Main() LoadFile(birthlog) tCalendar[2][1] = FixFebruary(tonumber(date("%Y"))) local hr = tonumber(date("%H"))*60*60*1000 local mins = 0 if tonumber(date("%M")) == 0 then mins = 1 else mins = tonumber(date("%M"))*60*1000 end fixTime(hr+mins) end function OnTimer() CheckBirthdays() TxtSend = nil end function NewUserConnected(user) for i, v in tBirthdays do if tBirthdays[i][2] == tonumber(date("%m")) and tBirthdays[i][1] == tonumber(date("%d")) then if user.sName ~= i then local msg = "Its "..i.."'s birhtday today .. ;D Turning "..(tonumber(date("%Y"))-tBirthdays[i][3] ).." today,... give a wish :)" if GetItemByName(i) then user:SendData(bBot, msg) else user:SendData(bBot, msg.." when he comes online") end else user:SendData(bBot, "Hey I know !!! YOU HAVE YOUR BIRTHDAY TODAY !!! HAPPIEST OF BIRTHDAYS !!!! ") SendToAll(bBot, "Guys !! "..user.sName.." is here! What do we say ?? : )") end end end end OpConnected = NewUserConnected function CheckBirthdays() for i, v in tBirthdays do if tBirthdays[i][2] == tonumber(date("%m")) then if tBirthdays[i][1] == tonumber(date("%d")) then if GetItemByName(i) then happy = GetItemByName(i) DoHappyBirthday(happy) end end end end end function FixFebruary(y) local value = 0 if (tonumber(y)/4) - (floor(tonumber(y)/4)) == 0 then value = 29 else value = 28 end return value end function fixTime(now) if now < timecheck then now = timecheck-now elseif now > timecheck then now = now-timecheck else now = timecheck end SetTimer(now) StartTimer() end function DataArrival(user, data) if tProfiles[""..user.iProfile..""] ~= 0 then if strsub(data, 1,1) == "<" then data = strsub(data, 1, strlen(data)-1) local s,e,cmd,args = strfind(data, "%b<>%s+(%S+)%s*(.*)") if cmd == addcmd or cmd == addbircmd and tProfiles[""..user.iProfile..""] >= 1 then CheckBirthdays() AddBirthDay(user, args) return 1 elseif cmd == delcmd and tProfiles[""..user.iProfile..""] == 2 then if args ~= nil then if tBirthdays[args] then if GetItemByName(args) then nick = GetItemByName(args) nick:SendPM(bBot, user.sName.." has deleted your birthday from my list .. ;(") end tBirthdays[args] = nil user:SendData(bBot, "You deleted "..args.." bithday ...") SaveFile(tBirthdays , "tBirthdays", birthlog) else user:SendData(bBot, args.." is not in my birthday list ...") end else user:SendData(bBot , "You need to give me a name ...") end return 1 elseif cmd == listcmd and tProfiles[""..user.iProfile..""] >= 1 then local str = "The Birthday List of the users of "..frmHub:GetHubName() local msg = "\r\n ..-*'~ "..str.." ~'*-..\r\n"..strrep("^", strlen(str)).."\r\n\t" local c = 0 local status = "" for i, v in tBirthdays do if GetItemByName(i) then status = "online" else status = "offline" end c = c + 1 msg = msg..c..". - "..tBirthdays[i][1].."/"..tBirthdays[i][2].."/"..tBirthdays[i][3].." - \t"..i.."\t ( "..status.." )\r\n\t" end user:SendData(bBot , msg) return 1 elseif cmd == findcmd then if tBirthdays[user.sName] then local msg = " These are the people that are born the same number-day as you\r\n" msg = msg..FindSame(tBirthdays, tBirthdays[user.sName][1] , "day", user.sName).."\r\n" msg = msg.." These are the people that are born the same month as you\r\n" msg = msg..FindSame(tBirthdays, tBirthdays[user.sName][2] , "month", user.sName).."\r\n" msg = msg.." These are the people that are born the same year as you\r\n" msg = msg..FindSame(tBirthdays, tBirthdays[user.sName][3] , "year", user.sName).."\r\n" msg = msg.." These are the people that are born the same month and day with you \r\n" msg = msg..FindSame(tBirthdays, tBirthdays[user.sName][1].."/"..tBirthdays[user.sName][2] , "monthday", user.sName).."\r\n" msg = msg.." These are the people that have the same birthday as yours\r\n" msg = msg..FindSame(tBirthdays, tBirthdays[user.sName][1].."/"..tBirthdays[user.sName][2].." - "..tBirthdays[user.sName][3] , "all", user.sName).."\r\n" user:SendData(bBot, msg) end end end end end function AddBirthDay(user, args) local pers = "" if args ~= nil then local s,e,name,day,month,year = strfind(args, "(%S+)%s+(%d+)/(%d+)/(%d+)") if name == nil then name = user.sName pers = "you" s,e,day,month,year = strfind(args, "(%d+)/(%d+)/(%d+)") else pers = name end if month ~= nil and day ~= nil and year ~= nil and (tonumber(month) >= 1) and (tonumber(month) <= 12) then day = tonumber(day) month = tonumber(month) year = tonumber(year) if year > oldestyear then if year < (tonumber(date("%Y")) - allowedage) then if month == 2 then daylimit = FixFebruary(year) else daylimit = tCalendar[month][1] end if day <= daylimit and day >= 1 then if tBirthdays[name] then month = tBirthdays[name][2] if user.sName == name then user:SendData(bBot, "I have your birthday already ... its on the "..tBirthdays[name][1].." of "..tCalendar[month][2]) else user:SendData(bBot, "I have "..name.."'s birthday already ... its on the "..tBirthdays[name][1].." of "..tCalendar[month][2]) end local profstr = "" for i,v in tProfiles do if tProfiles[i] == 2 then profstr = GetProfileName(tonumber(i)).."s" break end end user:SendData(bBot, "If you dont think this is correct ... then talk to one of our "..profstr) else tBirthdays[name] = {} tBirthdays[name][1] = day tBirthdays[name][2] = month tBirthdays[name][3] = year SaveFile(tBirthdays , "tBirthdays", birthlog) if user.sName == name then user:SendData(bBot, "Your birthday is on the "..tBirthdays[name][1].." of "..tCalendar[month][2]) user:SendData(bBot, "I didnt know you are "..FindCorrectAge(tBirthdays[name])..". I'll keep that in mind ;)") else user:SendData(bBot, name.."'s birthday is on the "..tBirthdays[name][1].." of "..tCalendar[month][2]) user:SendData(bBot, "I didnt know "..name.." is "..FindCorrectAge(tBirthdays[name])..". I'll keep that in mind ;)") end if user.sName == name then SendToAll(bBot, "New birthday added by "..user.sName.." his is on the "..tBirthdays[name][1].." of "..tCalendar[month][2]) else SendToAll(bBot, user.sName.." added "..name.."'s birthday, which is on the "..tBirthdays[name][1].." of "..tCalendar[month][2]) end end end else user:SendData(bBot, "Come ON! "..pers.." cant be less than "..allowedage.." years old !!! LIAR >:(") end else user:SendData(bBot, "Come ON! "..pers.." cant be more than "..(year-oldestyear).." years old !!! LIAR >:(") end else user:SendData(bBot, "The date you provided was not valid ... ( syntax example : 14/5/1981 )") end else user:SendData(bBot , "Please enter your birthday after the command ...") end end function FindCorrectAge(table) if table[2] > tonumber(date("%m")) then if table[1] >= tonumber(date("%d")) then return tonumber(date("%Y"))-table[3] else return (tonumber(date("%Y"))-table[3])-1 end elseif table[2] <= tonumber(date("%Y")) then if table[1] >= tonumber(date("%d")) then return tonumber(date("%Y"))-table[3] else return (tonumber(date("%Y"))-table[3])-1 end end end function FindSame(tTab, val , var, name) local tTmp = {} local msg = "" if var == "day" then for i, v in tTab do if val == v[1] and i ~= name then tTmp[i] = v[1].."/"..v[2].." - "..v[3] end end elseif var == "month" then for i, v in tTab do if val == v[2] and i ~= name then tTmp[i] = v[1].."/"..v[2].." - "..v[3] end end elseif var == "year" then for i, v in tTab do if val == v[3] and i ~= name then tTmp[i] = v[1].."/"..v[2].." - "..v[3] end end elseif var == "monthday" then for i, v in tTab do if val == v[1].."/"..v[2] and i ~= name then tTmp[i] = v[1].."/"..v[2].." - "..v[3] end end elseif var == "all" then for i, v in tTab do if val == v[1].."/"..v[2].." - "..v[3] and i ~= name then tTmp[i] = v[1].."/"..v[2].." - "..v[3] end end end for i,v in tTmp do msg = msg.."\t - "..i.."\r\n" end if msg == "" then msg = "\t - noone\r\n" end return msg end function DoHappyBirthday(nick) if TxtSend == nil then SendToAll(ReadTextFile(birthdayfile)) TxtSend = 1 end local age = tonumber(date("%Y")) - tBirthdays[nick.sName][3] local tSurpises = { nick.sName.." is gonna have a PAAARTY, today he is turning "..age.." Happy Birthday !!!!", "All of you spam "..nick.sName.." with Birthday messages ;), ...turning "..age.." today !!!", "Who's turning "..age.." today ?? :D... The day AND the night belongs to "..nick.sName, "Happy Birthday to you, Happy Birthday dear "..nick.sName..", we all wish you your "..age.." will be better than your "..(age-1).." !! :)", " I think Mr"..nick.sName.." has his birthday today ... he should be turning "..age.." today ;D", }; SendToAll( bBot , tSurpises[random(1, getn(tSurpises)) ] ) end --- // --- Table Serialization --- Thanks NL function Serialize(savTable, sTableName, hFile, sTab) assert(savTable, "savTable equals nil"); assert(sTableName, "sTableName equals nil"); assert(hFile, "hFile equals nil"); assert(type(savTable) == "table", "savTable must be a table!"); assert(type(sTableName) == "string", "sTableName must be a string!"); sTab = sTab or ""; write(hFile, sTab..sTableName.." = {\n" ); for key, value in savTable do local sKey = (type(key) == "string") and format("[%q]",key) or format("[%d]",key); if(type(value) == "table") then Serialize(value, sKey, hFile, sTab.."\t"); else local sValue = (type(value) == "string") and format("%q",value) or tostring(value); write(hFile, sTab.."\t"..sKey.." = "..sValue); end write(hFile, ",\n"); end write(hFile, sTab.."}"); end function LoadFile(file) assert(readfrom(file),file.." is not found.") dostring(read("*all")) readfrom() end function SaveFile(table , tablename, file) local hFile = openfile(file, "w"); Serialize(table, tablename, hFile); closefile(hFile); end function ReadTextFile(file) local message = "\r\n" readfrom(file, "r") while 1 do local line = read() if ( line == nil ) then break else message = message.."\t"..line.."\r\n" end end readfrom() return message end