PtokaX forum

Lua 5.3/5.2/5.1 Scripts (for PtokaX 0.4.0.0 and newer) => Finished Scripts => Topic started by: Dessamator on 13 June, 2010, 22:37:35

Title: Reminders v1.6 API2
Post by: Dessamator on 13 June, 2010, 22:37:35

-- Reminder v1.6 API2
-- By Dessamator
-- Ideas from Post Bot by Nerbos(and some functions aswell),
-- (Mutor, Plop thx for the hints/help, jiten(thnx for the debugging/help))
-- added dates, for reminders in diferent days.
-- Small bugfix in adding reminders reported by xeonfx
-- Fixed some small bugs (Getitembyname & checking time), thnx bastya and Mutor
--## Most recent changes & fixes on : 13/06/2010

fAlarm = "fAlarm.dat"
tAlarm =
{ ["tReminders"]={},
  ["Cfg"]=
{     -- Cfg Table
--## Configuration ##--
["sBot"] = "PtokaX",-- change bot name here
},
}
    --## END ##--
tCmds = {
["time"] =  {function (sBot,sUser)
Core.SendToNick(sUser.sNick,"<"..sBot.."> "..os.date("Today is the %dth %B %Y & The time is %X" ))
end,"$UserCommand 1 3 Reminder\\Time$<%[mynick]> !time&#124;"},
["alarm"]  = {function(sBot,sUser,sTime,sReminder,sDate)
if not(tAlarm["tReminders"][sUser.sNick]) then tAlarm["tReminders"][sUser.sNick] = {} end
if next(tAlarm) and tAlarm["tReminders"][sUser.sNick] then
for i=1,table.getn(tAlarm["tReminders"][sUser.sNick]) do
if tAlarm["tReminders"][sUser.sNick][i] and (tAlarm["tReminders"][sUser.sNick][i]["sReminder"] == sReminders) then
Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."The Reminder already exists")
return 1
end
end
end
if sTime~="" and sReminder~="" and string.find(sTime,"%d+%d+:%d+%d+") then
local _,_,sDate= string.find(sDate,"(%d%d/%d%d/%d%d)" )
if sDate and (sDate<=os.date("%m/%d/%y")) then Core.SendToNick(sUser.sNick,"<"..sBot..">".."Incorrect Time. Try Again!") return 1 end
sDate=sDate or os.date("%d/%m/%y")
local tStore ={
["sReminder"] = sReminder,
["sCtime"]=  os.date("%H:%M"),
["sAtime"] = sTime,
["sCdate"] = os.date("%d/%m/%y"),
["sAdate"] = sDate
--["alerts"] = 0
}
table.insert(tAlarm["tReminders"][sUser.sNick], tStore)
Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."Your Reminder has been set.")
else

Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."Syntax Error, !alarm time reminder date(DD/MM/YY) eg.:!alarm 19:19 wakeup 22/11/10 (date is optional)")
end 
OnExit()
end,"$UserCommand 1 3 Reminder\\Set Reminder$<%[mynick]> !alarm %[line:time ex.:"..os.date("%H:%M").."] %[line:Reminder] %[line:Date (DD MM YY)]&#124;",},
["aread"] ={ function(sBot,sUser)
if not(SendReminder(sBot,sUser.sNick,1)) then
Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."Sorry, There are no reminders set for today !")
end
end,"$UserCommand 1 3 Reminder\\View Reminder$<%[mynick]> !aread&#124;"},
["delalarm"] = {function (sBot,sUser,iID)
if iID == nil or tonumber(iID)==nil then
Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."Syntax Error, !delalarm <ID> , the ID must be specified!")
elseif (tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] == nil) then
Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."That reminder doesn't exist!")
elseif  tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] then
table.remove(tAlarm["tReminders"][sUser.sNick],tonumber(iID))
Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."The reminder has been deleted!" )
         SaveToFile(fAlarm , tAlarm , "tAlarm")
else
Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."You are not authorized to delete the reminder !")
end
OnExit()
end,"$UserCommand 1 3 Reminder\\Remove Reminder$<%[mynick]> !delalarm %[line:Reminder <id> ex.: 1]&#124;",},
}

function OnStartup()
Core.RegBot(tAlarm["Cfg"]["sBot"],"","",true)
if loadfile(fAlarm) then dofile(fAlarm) end
TmrMan.AddTimer(60*1000);
end

-- right clicks command
UserConnected = function(sUser)
for sCmd,iID in pairs(tCmds) do
Core.SendToNick(sUser.sNick,tCmds[sCmd][2])
end
end
OpConnected = UserConnected
--

function ChatArrival(sUser, data)
local s,e,sCmd,sArg1,sArg2,sArg3 = data:find("%b<>%s+!(%S*)%s*(%S*)%s*(%S*)%s*(.*)|")
if sCmd and tCmds[sCmd] then
return tCmds[sCmd][1](tAlarm["Cfg"]["sBot"],sUser,sArg1,sArg2,sArg3),true
end
end

ToArrival=ChatArrival

function OnTimer()
for sUser,iID in pairs(tAlarm["tReminders"]) do
if tAlarm["tReminders"][sUser] and next(tAlarm["tReminders"][sUser]) then
SendReminder(tAlarm["Cfg"]["sBot"],sUser)
if tAlarm["tReminders"][sUser] and table.getn(tAlarm["tReminders"][sUser])==0 then
tAlarm["tReminders"][sUser] =nil OnExit()
end
end
end
end

function SendReminder(sBot,sUser,status)
local sTmp,tRemind,bFound,iATime,iADate = "\r\n\Your reminder(s) :\r\n\ID\t\Created on:\t\Scheduled for\t\t\Reminder\r\n"..string.rep("==",30).."\r\n"
if tAlarm["tReminders"][sUser] and next(tAlarm["tReminders"][sUser]) then
for i=1,table.getn(tAlarm["tReminders"][sUser]) do
tRemind =tAlarm["tReminders"][sUser][i]
if tRemind then
iATime = (string.gsub(tRemind.sAtime,"%:",""))
iADate = (string.gsub(tRemind.sAdate,"/",""))
if status or  tonumber(os.date("%H%M"))==tonumber(iATime) and tonumber(os.date("%d%m%y"))==tonumber(iADate) then
sTmp = sTmp
..i.."\t"..tRemind.sCtime.." "..tRemind["sCdate"].."\t"
..tRemind.sAtime.." "..tRemind["sAdate"].."\t"
.."\t"..tRemind["sReminder"].."\r\n"
if Core.GetUser(sUser) then
Core.SendPmToNick(sUser,sBot, sTmp)
end
end
if tonumber(os.date("%H%M"))>tonumber(iATime)  and tonumber(os.date("%d%m%y"))>=tonumber(iADate)then
table.remove(tAlarm["tReminders"][sUser],i)
end
end
end
return tRemind
end
end


Serialize = function(tTable,sTableName,hFile,sTab)
sTab = sTab or "";
hFile:write(sTab..sTableName.." = {\n");
for key,value in pairs(tTable) do
if (type(value) ~= "function") then
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then
Serialize(value,sKey,hFile,sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
hFile:write(sTab.."\t"..sKey.." = "..sValue);
end
hFile:write(",\n");
end
end
hFile:write(sTab.."}");
end

SaveToFile = function(file,table,tablename)
local hFile = io.open(file,"w+") Serialize(table,tablename,hFile); hFile:close() 
end

function OnExit()
SaveToFile(fAlarm , tAlarm , "tAlarm")
end
Title: Re: Reminders v1.6 API2
Post by: DeAn on 15 June, 2010, 19:03:35
The script is working great. Thanks a lot Dessamator for very persuant reply and the script.  :)
Title: Re: Reminders v2 API2
Post by: Dessamator on 22 February, 2012, 09:13:01
-- Reminder v2.1 API2
-- By Dessamator
-- Ideas from Post Bot by Nerbos(and some functions aswell),
-- (Mutor, Plop thanks for the hints/help, jiten(thnx for the debugging/help))
-- added dates, for reminders in diferent days.
-- Small bugfix in adding reminders reported by xeonfx
-- Fixed some small bugs (Getitembyname & checking time), thanks bastya and Mutor
-- Added multiple !alerts for alarm 19/02/2012
-- Added offline report 19/02/2012
-- added !help 19/02/2012
-- added precise check for date and time
-- added chgalarm 21/02/2012

--## Most recent changes & fixes on : 21/02/2012


fAlarm = Core.GetPtokaXPath().."scripts/fAlarm.dat"
tMonths = {31,29,31,30,31,30,31,31,30,31,30,31}
tAlarm =
{ ["tReminders"]={},
  ["Cfg"]=
{     -- Cfg Table
--## Configuration ##--
["sBot"] = "PtokaX",-- change bot name here
["iInterval"] = 1,  --remind the user every x minutes, 3 reminders maximum
["bExtraAlert"] =true ,
},
}
    --## END ##--
tCmds = {
["time"] =  {function (sBot,sUser)
SendUsr(sUser.sNick,os.date("Today is the %dth of %B %Y & The time is %X" ))
end,"Time$<%[myNI]> !time", "!time \t\t\t\t\t-- shows the time"},
["ahelp"] =  {function (sBot,sUser) 
local sTmp = "\r\n\t\t\tReminders V2 \t\t Help\r\n"..string.rep("===",20).."\r\n"
for sCmd,iID in pairs(tCmds) do
sTmp = sTmp .."\t".. tCmds[sCmd][3].."\r\n"
end
Core.SendToNick(sUser.sNick,sTmp)
end,"help$<%[myNI]> !ahelp","!ahelp \t\t\t\t\t-- shows this help"},
["chgalarm"]  = {function(sBot,sUser,sArg1,sArg2,sArg3)
tCmds["alarm"][1](sBot,sUser,sArg1,sArg2,sArg3, true)
end,"Change Reminder$<%[myNI]> !chgalarm %[line:Reminder] %[line:time ex.: 19:10]",
"!chgalarm reminder time date\t\-- changes the alarm/reminder  eg.:!chgalarm wakeup 19:19  12/11/22(YY/MM/DD) (date is optional)"},
["alarm"]  = {function(sBot,sUser,sReminder,sTime,aDate, bChange)
local sADate=""
if not(tAlarm["tReminders"][sUser.sNick]) then tAlarm["tReminders"][sUser.sNick] = {} end
if next(tAlarm) and tAlarm["tReminders"][sUser.sNick]  then
for i=1,table.getn(tAlarm["tReminders"][sUser.sNick]) do
if tAlarm["tReminders"][sUser.sNick][i] and (tAlarm["tReminders"][sUser.sNick][i]["sReminder"] == sReminder) then
if (not(bChange)) then
SendUsr(sUser.sNick,"The Reminder already exists")
return 1
else
sADate=tAlarm["tReminders"][sUser.sNick][i].sAdate
end

end
end
end
if sTime~="" and sReminder~="" and sTime:find("^%d%d:%d%d$") then   
if aDate:find("^(%d)%d%/%d%d%/%d%d$" ) then
aDate = string.sub(os.date("%Y"),1,2)..aDate
elseif (tostring(aDate)=="")   then
if not(bChange) then
aDate =os.date("%Y/%m/%d") 
else
aDate = sADate
end
else
if not(bChange) then
SendUsr(sUser.sNick,"Syntax Error, !alarm reminder time date(YY/MM/DD) eg.:!alarm wakeup 19:19 12/11/22 (date is optional)")
else
SendUsr(sUser.sNick,"Syntax Error, !chgalarm reminder time date(YY/MM/DD) eg.:!chgalarm wakeup 19:19 12/11/22 (date is optional)")
end
return 1
end
local sFDate =string.gsub(aDate,"%/","")
local aFTime =string.gsub(sTime,"%:","")
if  tonumber(aFTime) < 0 or tonumber(aFTime)>= 2400 or (tonumber(string.sub(os.date("%Y"),1,2)..sFDate)<tonumber(os.date("%Y%m%d"))) then
     Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."Incorrect date/time . Try Again or check your pc's date")
     return 1
end
iHour = tonumber(string.sub(sTime,1,2))
iMin = tonumber(string.sub(sTime,4,5))
iYr=tonumber(string.sub(aDate,1,4))
iMon =tonumber(string.sub(aDate,6,7))
iDay =tonumber(string.sub(aDate,9,10))
local bLeapYr = false
if ((math.mod(iYr,4)==0) and ((math.mod(iYr,100)~=0) or (math.mod(iYr,400)==0))) then
bLeapYr = true
end

if ( (iDay >tMonths[iMon]) or ( (iMon ==2) and (iDay >28) and not(bLeapYr)) 
or (iMon> 12) or (iMon < 1) or (iDay < 1) or ( tonumber(string.sub(aDate,3,4))> 99)
or (tonumber(string.sub(aDate,3,4))< 0) or iHour <0 or iHour > 23 or iMin < 0 or iMin > 59 ) then
SendUsr(sUser.sNick,"Incorrect date/time . Try Again.")
return 1 
end
local iTDate =tonumber(os.time(os.date("*t"))) 
local iFDate =tonumber(os.time({year =(iYr), month =iMon,day=iDay,hour=iHour,min=iMin,sec=0})) 
if (iFDate - iTDate) > (3600 * 24 * 365) then
SendUsr(sUser.sNick,"Warning. That reminder is more than a year from now.")
end
local tStore ={
["sReminder"] = sReminder,
["sCtime"]=  os.date("%H:%M"),
["sAtime"] = sTime,
["sCdate"] = os.date("%Y/%m/%d"),
["sAdate"] = aDate,
["iAlerts"] = 0,
["sNextAlert"] = tonumber(os.time({year =iYr, month =iMon,day=iDay,hour=iHour,min=iMin,sec=0,isdst=false}))  ,
["iMaxalerts"] = 3,
["bOffline"]= false,}
if not(bChange) then
table.insert(tAlarm["tReminders"][sUser.sNick], tStore)
SendUsr(sUser.sNick,"Your Reminder '"..sReminder .. "' has been set.")
else
if (tAlarm["tReminders"][sUser.sNick]) then
for i=1,table.getn(tAlarm["tReminders"][sUser.sNick]) do
if tAlarm["tReminders"][sUser.sNick][i].sReminder ==sReminder then
if (tAlarm["tReminders"][sUser.sNick][i].sAtime ~=sTime) or (tAlarm["tReminders"][sUser.sNick][i].sAdate ~=aDate) then
table.remove(tAlarm["tReminders"][sUser.sNick],i)
table.insert(tAlarm["tReminders"][sUser.sNick],i, tStore)
SendUsr(sUser.sNick,"Your Reminder '"..sReminder .. "' has been changed.")
else
SendUsr(sUser.sNick,"The time and date are the same. No changes have been made")
end
return 1
end
end
SendUsr(sUser.sNick,"The reminder "..sReminder.." does not exist")
else
SendUsr(sUser.sNick,"Error. You do not have any reminders to change.")
end
end


else
if not(bChange) then
SendUsr(sUser.sNick,"Syntax Error, !alarm time reminder date(YY/MM/DD) eg.:!alarm wakeup 19:19  12/11/22 (date is optional)")
else
SendUsr(sUser.sNick,"Syntax Error, !chgalarm reminder time date(YY/MM/DD) eg.:!chgalarm wakeup 19:19 12/11/22 (date is optional)")
end
end 
OnExit()
end,"Set Reminder$<%[myNI]> !alarm %[line:Reminder] %[line:time ex.: 19:10] ",
"!alarm time reminder date \t\-- sets the alarm/reminder  eg.:!alarm  wakeup 19:19 12/11/22(YY/MM/DD) (date is optional)"},
["aread"] ={ function(sBot,sUser)
if not(SendReminder(sBot,sUser.sNick,1)) then
SendUsr(sUser.sNick,"You have no reminders for today !")
end
end,"View Reminder$<%[myNI]> !aread","!aread \t\t\t\t\t-- shows all your reminders"},
["alerts"] ={ function(sBot,sUser,iID,iAlerts)
if iID == nil or tonumber(iID)==nil or iAlerts ==nil or tonumber(iAlerts)==nil then
SendUsr(sUser.sNick,"Syntax Error, !alerts <ID> <number of alerts> , the reminder ID and alerts must be specified!")
elseif (table.getn(tAlarm["tReminders"])==0 or table.getn(tAlarm["tReminders"][(sUser.sNick)])==0 or tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] == nil) then
SendUsr(sUser.sNick,"That reminder doesn't exist!")
elseif  tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] then
tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)].iMaxalerts = tonumber(iAlerts)
SendUsr(sUser.sNick,"Total number of alerts for your reminder '"
.. tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)].sReminder .. "'  has been changed to " .. iAlerts)
        SaveToFile(fAlarm , tAlarm , "tAlarm")
else
SendUsr(sUser.sNick,"Syntax Error, !alerts <ID> <number of alerts> , the reminder ID and alerts must be specified!")
end
end,"Set alerts$<%[myNI]> !alerts %[line:Reminder ID ] %[line:Alerts]",
    "!alerts <ID> <no>  \t\t\t\-- sets alerts for each reminder . e.g. !alerts 1 5 "},
["delalarm"] = {function (sBot,sUser,iID)
if iID == "all" then
tAlarm["tReminders"][sUser.sNick] ={}
SendUsr(sUser.sNick,"All your reminders have been purged")
elseif iID == nil or tonumber(iID)==nil then
SendUsr(sUser.sNick,"Syntax Error, !delalarm <ID> , the ID must be specified, or '!delalarm all' to delete everything")
elseif (table.getn(tAlarm["tReminders"])==0 or table.getn(tAlarm["tReminders"][(sUser.sNick)])==0 or tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] == nil) then
SendUsr(sUser.sNick,"That reminder doesn't exist!")
elseif  tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] then
table.remove(tAlarm["tReminders"][sUser.sNick],tonumber(iID))
SendUsr(sUser.sNick,"Your reminder '"
..tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)].sReminder .. "' has been deleted!" )
        SaveToFile(fAlarm , tAlarm , "tAlarm")
else
SendUsr(sUser.sNick,"Syntax Error, !delalarm <ID> , the ID must be specified, or '!delalarm all' to delete everything")
end
OnExit()
end,"Remove Reminder$<%[myNI]> !delalarm %[line:Reminder id]",
"!delalarm <ID>/all  \t\t\t-- delete alarm with ID, '!delalarm all' deletes all reminders. e.g !delalarm 1",},
}

function SendUsr (usr,txt)
      Core.SendToNick(usr,"<"..tAlarm["Cfg"]["sBot"].."> "..tostring(txt))
end
 
function SendPM(usr,txt)
      Core.SendPmToNick(usr,tAlarm["Cfg"]["sBot"], tostring(txt))
end

function STA (txt)
      Core.SendToAll(tostring(txt))
end

function OnStartup()
STA("<"..tAlarm["Cfg"]["sBot"].."> Reminders v2 script started successfully.")
Core.RegBot(tAlarm["Cfg"]["sBot"],"","",true)
if loadfile(fAlarm) then dofile(fAlarm) end
TmrMan.AddTimer(1000);
end

-- right clicks command
UserConnected = function(oUser)
sUser = oUser.sNick
for sCmd,iID in pairs(tCmds) do
Core.SendToNick(oUser.sNick,"$UserCommand 1 3 Reminder\\"..tCmds[sCmd][2].."&#124;")
end
      if tAlarm["tReminders"][sUser] then
for i=1,table.getn(tAlarm["tReminders"][sUser]) do
if tAlarm["tReminders"][sUser][i].bOffline then
SendReminder(tAlarm["Cfg"]["sBot"],sUser,1)
tAlarm["tReminders"][sUser][i].bOffline =false
end
end
end
end
OpConnected = UserConnected
--
function OnError(sErrorMsg)
  Core.SendToOps(sErrorMsg)
end

function ChatArrival(sUser, data)
local s,e,sCmd,sArg1,sArg2,sArg3 = data:find("%b<>%s+!(%S*)%s*(%S*)%s*(%S*)%s*(.*)|")
if sCmd and tCmds[sCmd] then
--local bool,err = pcall(tCmds[sCmd][1],tAlarm["Cfg"]["sBot"],sUser,sArg1,sArg2,sArg3)
--if not(bool) then
-- Core.SendPmToOps(tAlarm["Cfg"]["sBot"],err)
-- SendUsr(sUser.sNick,"There seems to be a script error. The Operators have been informed, meanwhile you may try changing the syntax.")
--end
--return true
return tCmds[sCmd][1](tAlarm["Cfg"]["sBot"],sUser,sArg1,sArg2,sArg3),true
end
end

ToArrival=ChatArrival

function OnTimer()
for sUser,iID in pairs(tAlarm["tReminders"]) do
if tAlarm["tReminders"][sUser] and next(tAlarm["tReminders"][sUser]) then
SendReminder(tAlarm["Cfg"]["sBot"],sUser)
if tAlarm["tReminders"][sUser] and table.getn(tAlarm["tReminders"][sUser])==0 then
tAlarm["tReminders"][sUser] =nil OnExit()
end
end
end
end

function SendReminder(sBot,sUser,bRead)
local sTmp,tRemind,bFound,iATime,iADate = "\r\n\t\t\t\t\t\t\tYour reminder(s) :\r\n\ID\t\Created on:\t\t\tScheduled for\t\t\t\tReminder\r\n"..string.rep("==",30)
if tAlarm["tReminders"][sUser] and next(tAlarm["tReminders"][sUser]) then
for i=1,table.getn(tAlarm["tReminders"][sUser]) do
tRemind =tAlarm["tReminders"][sUser][i]
if tRemind then
iATime = (string.gsub(tRemind.sAtime,"%:",""))
iADate = (string.gsub(tRemind.sAdate,"/",""))
--iNextAlert = tonumber((string.gsub((os.date("%H%M",tRemind.sNextAlert)),"%:","")))
iAlerts =0
if tAlarm["Cfg"]["bExtraAlert"] then
  iAlerts = tAlarm["tReminders"][sUser][i].iMaxalerts 
end
if bRead or ((os.time(os.date("*t"))== tRemind.sNextAlert)  and (tRemind.iAlerts < iAlerts+1))  then
        if bRead then
    sTmp = sTmp.."\r\n"..i
else
    sTmp = sTmp.."("..(tRemind.iAlerts+1)..")\r\n"..i
end
sTmp = sTmp.."\t"..tRemind.sCtime.." "..tRemind["sCdate"].."\t"
..tRemind.sAtime.." "..tRemind["sAdate"].."\t"
.."\t\t"..tRemind["sReminder"]
if Core.GetUser(sUser) then
SendPM(sUser, sTmp)
else
        tAlarm["tReminders"][sUser][i].bOffline= true
end
if not(bRead) and  tAlarm["Cfg"]["bExtraAlert"] then
  tAlarm["tReminders"][sUser][i].iAlerts = tAlarm["tReminders"][sUser][i].iAlerts + 1
  tAlarm["tReminders"][sUser][i].sNextAlert= tAlarm["tReminders"][sUser][i].sNextAlert +(tAlarm["Cfg"]["iInterval"] * 60)
end
end
if  (tRemind.iAlerts >= iAlerts and not(tRemind.bOffline) )or (tRemind.sNextAlert >= tRemind.sNextAlert +24 * 3600)   then
table.remove(tAlarm["tReminders"][sUser],i)
end
end
end
return tRemind
end
end

Serialize = function(tTable,sTableName,hFile,sTab)
sTab = sTab or "";
hFile:write(sTab..sTableName.." = {\n");
for key,value in pairs(tTable) do
if (type(value) ~= "function") then
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then
Serialize(value,sKey,hFile,sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
hFile:write(sTab.."\t"..sKey.." = "..sValue);
end
hFile:write(",\n");
end
end
hFile:write(sTab.."}");
end

SaveToFile = function(file,table,tablename)
local hFile = io.open(file,"w+") Serialize(table,tablename,hFile); hFile:close() 
end

function OnExit()
SaveToFile(fAlarm , tAlarm , "tAlarm")
end



Added !ChgAlarm.
Title: Re: Reminders v1.6 API2
Post by: Cariga on 01 April, 2012, 10:21:26
It is possbile to change the name of the right click metu from Reminder to ? Reminder ? ?
Title: Re: Reminders v1.6 API2
Post by: Dessamator on 02 April, 2012, 12:13:23
Quote from: Cariga on 01 April, 2012, 10:21:26
It is possbile to change the name of the right click metu from Reminder to ? Reminder ? ?

Indeed it is. For ex. Change this: Core.SendToNick(oUser.sNick,"$UserCommand 1 3 Reminder\\"..tCmds[sCmd][2].."&#124;")   
to this : Core.SendToNick(oUser.sNick,"$UserCommand 1 3 bubuga\\"..tCmds[sCmd][2].."&#124;")   
Title: Re: Reminders v2 API2
Post by: Popeye on 30 May, 2012, 22:45:56
We have 12 number of total Profiles on our Hub

Owner
Master
SuperBot
Operator
Admin
pOwer
VVIP
VIP
WoW
Star
Reg+
Reg

and we want to give access of Reminder v2.1 API2 only to

Owner
Admin
pOwer
VVIP
VIP

what exactly changes do we need to do in script ? please help

Quote from: Dessamator on 22 February, 2012, 09:13:01
-- Reminder v2.1 API2
-- By Dessamator
-- Ideas from Post Bot by Nerbos(and some functions aswell),
-- (Mutor, Plop thanks for the hints/help, jiten(thnx for the debugging/help))
-- added dates, for reminders in diferent days.
-- Small bugfix in adding reminders reported by xeonfx
-- Fixed some small bugs (Getitembyname & checking time), thanks bastya and Mutor
-- Added multiple !alerts for alarm 19/02/2012
-- Added offline report 19/02/2012
-- added !help 19/02/2012
-- added precise check for date and time
-- added chgalarm 21/02/2012

--## Most recent changes & fixes on : 21/02/2012


fAlarm = Core.GetPtokaXPath().."scripts/fAlarm.dat"
tMonths = {31,29,31,30,31,30,31,31,30,31,30,31}
tAlarm =
{ ["tReminders"]={},
  ["Cfg"]=
{     -- Cfg Table
--## Configuration ##--
["sBot"] = "PtokaX",-- change bot name here
["iInterval"] = 1,  --remind the user every x minutes, 3 reminders maximum
["bExtraAlert"] =true ,
},
}
    --## END ##--
tCmds = {
["time"] =  {function (sBot,sUser)
SendUsr(sUser.sNick,os.date("Today is the %dth of %B %Y & The time is %X" ))
end,"Time$<%[myNI]> !time", "!time \t\t\t\t\t-- shows the time"},
["ahelp"] =  {function (sBot,sUser) 
local sTmp = "\r\n\t\t\tReminders V2 \t\t Help\r\n"..string.rep("===",20).."\r\n"
for sCmd,iID in pairs(tCmds) do
sTmp = sTmp .."\t".. tCmds[sCmd][3].."\r\n"
end
Core.SendToNick(sUser.sNick,sTmp)
end,"help$<%[myNI]> !ahelp","!ahelp \t\t\t\t\t-- shows this help"},
["chgalarm"]  = {function(sBot,sUser,sArg1,sArg2,sArg3)
tCmds["alarm"][1](sBot,sUser,sArg1,sArg2,sArg3, true)
end,"Change Reminder$<%[myNI]> !chgalarm %[line:Reminder] %[line:time ex.: 19:10]",
"!chgalarm reminder time date\t\-- changes the alarm/reminder  eg.:!chgalarm wakeup 19:19  12/11/22(YY/MM/DD) (date is optional)"},
["alarm"]  = {function(sBot,sUser,sReminder,sTime,aDate, bChange)
local sADate=""
if not(tAlarm["tReminders"][sUser.sNick]) then tAlarm["tReminders"][sUser.sNick] = {} end
if next(tAlarm) and tAlarm["tReminders"][sUser.sNick]  then
for i=1,table.getn(tAlarm["tReminders"][sUser.sNick]) do
if tAlarm["tReminders"][sUser.sNick][i] and (tAlarm["tReminders"][sUser.sNick][i]["sReminder"] == sReminder) then
if (not(bChange)) then
SendUsr(sUser.sNick,"The Reminder already exists")
return 1
else
sADate=tAlarm["tReminders"][sUser.sNick][i].sAdate
end

end
end
end
if sTime~="" and sReminder~="" and sTime:find("^%d%d:%d%d$") then   
if aDate:find("^(%d)%d%/%d%d%/%d%d$" ) then
aDate = string.sub(os.date("%Y"),1,2)..aDate
elseif (tostring(aDate)=="")   then
if not(bChange) then
aDate =os.date("%Y/%m/%d") 
else
aDate = sADate
end
else
if not(bChange) then
SendUsr(sUser.sNick,"Syntax Error, !alarm reminder time date(YY/MM/DD) eg.:!alarm wakeup 19:19 12/11/22 (date is optional)")
else
SendUsr(sUser.sNick,"Syntax Error, !chgalarm reminder time date(YY/MM/DD) eg.:!chgalarm wakeup 19:19 12/11/22 (date is optional)")
end
return 1
end
local sFDate =string.gsub(aDate,"%/","")
local aFTime =string.gsub(sTime,"%:","")
if  tonumber(aFTime) < 0 or tonumber(aFTime)>= 2400 or (tonumber(string.sub(os.date("%Y"),1,2)..sFDate)<tonumber(os.date("%Y%m%d"))) then
     Core.SendToNick(sUser.sNick,"<"..sBot.."> ".."Incorrect date/time . Try Again or check your pc's date")
     return 1
end
iHour = tonumber(string.sub(sTime,1,2))
iMin = tonumber(string.sub(sTime,4,5))
iYr=tonumber(string.sub(aDate,1,4))
iMon =tonumber(string.sub(aDate,6,7))
iDay =tonumber(string.sub(aDate,9,10))
local bLeapYr = false
if ((math.mod(iYr,4)==0) and ((math.mod(iYr,100)~=0) or (math.mod(iYr,400)==0))) then
bLeapYr = true
end

if ( (iDay >tMonths[iMon]) or ( (iMon ==2) and (iDay >28) and not(bLeapYr)) 
or (iMon> 12) or (iMon < 1) or (iDay < 1) or ( tonumber(string.sub(aDate,3,4))> 99)
or (tonumber(string.sub(aDate,3,4))< 0) or iHour <0 or iHour > 23 or iMin < 0 or iMin > 59 ) then
SendUsr(sUser.sNick,"Incorrect date/time . Try Again.")
return 1 
end
local iTDate =tonumber(os.time(os.date("*t"))) 
local iFDate =tonumber(os.time({year =(iYr), month =iMon,day=iDay,hour=iHour,min=iMin,sec=0})) 
if (iFDate - iTDate) > (3600 * 24 * 365) then
SendUsr(sUser.sNick,"Warning. That reminder is more than a year from now.")
end
local tStore ={
["sReminder"] = sReminder,
["sCtime"]=  os.date("%H:%M"),
["sAtime"] = sTime,
["sCdate"] = os.date("%Y/%m/%d"),
["sAdate"] = aDate,
["iAlerts"] = 0,
["sNextAlert"] = tonumber(os.time({year =iYr, month =iMon,day=iDay,hour=iHour,min=iMin,sec=0,isdst=false}))  ,
["iMaxalerts"] = 3,
["bOffline"]= false,}
if not(bChange) then
table.insert(tAlarm["tReminders"][sUser.sNick], tStore)
SendUsr(sUser.sNick,"Your Reminder '"..sReminder .. "' has been set.")
else
if (tAlarm["tReminders"][sUser.sNick]) then
for i=1,table.getn(tAlarm["tReminders"][sUser.sNick]) do
if tAlarm["tReminders"][sUser.sNick][i].sReminder ==sReminder then
if (tAlarm["tReminders"][sUser.sNick][i].sAtime ~=sTime) or (tAlarm["tReminders"][sUser.sNick][i].sAdate ~=aDate) then
table.remove(tAlarm["tReminders"][sUser.sNick],i)
table.insert(tAlarm["tReminders"][sUser.sNick],i, tStore)
SendUsr(sUser.sNick,"Your Reminder '"..sReminder .. "' has been changed.")
else
SendUsr(sUser.sNick,"The time and date are the same. No changes have been made")
end
return 1
end
end
SendUsr(sUser.sNick,"The reminder "..sReminder.." does not exist")
else
SendUsr(sUser.sNick,"Error. You do not have any reminders to change.")
end
end


else
if not(bChange) then
SendUsr(sUser.sNick,"Syntax Error, !alarm time reminder date(YY/MM/DD) eg.:!alarm wakeup 19:19  12/11/22 (date is optional)")
else
SendUsr(sUser.sNick,"Syntax Error, !chgalarm reminder time date(YY/MM/DD) eg.:!chgalarm wakeup 19:19 12/11/22 (date is optional)")
end
end 
OnExit()
end,"Set Reminder$<%[myNI]> !alarm %[line:Reminder] %[line:time ex.: 19:10] ",
"!alarm time reminder date \t\-- sets the alarm/reminder  eg.:!alarm  wakeup 19:19 12/11/22(YY/MM/DD) (date is optional)"},
["aread"] ={ function(sBot,sUser)
if not(SendReminder(sBot,sUser.sNick,1)) then
SendUsr(sUser.sNick,"You have no reminders for today !")
end
end,"View Reminder$<%[myNI]> !aread","!aread \t\t\t\t\t-- shows all your reminders"},
["alerts"] ={ function(sBot,sUser,iID,iAlerts)
if iID == nil or tonumber(iID)==nil or iAlerts ==nil or tonumber(iAlerts)==nil then
SendUsr(sUser.sNick,"Syntax Error, !alerts <ID> <number of alerts> , the reminder ID and alerts must be specified!")
elseif (table.getn(tAlarm["tReminders"])==0 or table.getn(tAlarm["tReminders"][(sUser.sNick)])==0 or tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] == nil) then
SendUsr(sUser.sNick,"That reminder doesn't exist!")
elseif  tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] then
tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)].iMaxalerts = tonumber(iAlerts)
SendUsr(sUser.sNick,"Total number of alerts for your reminder '"
.. tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)].sReminder .. "'  has been changed to " .. iAlerts)
        SaveToFile(fAlarm , tAlarm , "tAlarm")
else
SendUsr(sUser.sNick,"Syntax Error, !alerts <ID> <number of alerts> , the reminder ID and alerts must be specified!")
end
end,"Set alerts$<%[myNI]> !alerts %[line:Reminder ID ] %[line:Alerts]",
    "!alerts <ID> <no>  \t\t\t\-- sets alerts for each reminder . e.g. !alerts 1 5 "},
["delalarm"] = {function (sBot,sUser,iID)
if iID == "all" then
tAlarm["tReminders"][sUser.sNick] ={}
SendUsr(sUser.sNick,"All your reminders have been purged")
elseif iID == nil or tonumber(iID)==nil then
SendUsr(sUser.sNick,"Syntax Error, !delalarm <ID> , the ID must be specified, or '!delalarm all' to delete everything")
elseif (table.getn(tAlarm["tReminders"])==0 or table.getn(tAlarm["tReminders"][(sUser.sNick)])==0 or tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] == nil) then
SendUsr(sUser.sNick,"That reminder doesn't exist!")
elseif  tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)] then
table.remove(tAlarm["tReminders"][sUser.sNick],tonumber(iID))
SendUsr(sUser.sNick,"Your reminder '"
..tAlarm["tReminders"][(sUser.sNick)][tonumber(iID)].sReminder .. "' has been deleted!" )
        SaveToFile(fAlarm , tAlarm , "tAlarm")
else
SendUsr(sUser.sNick,"Syntax Error, !delalarm <ID> , the ID must be specified, or '!delalarm all' to delete everything")
end
OnExit()
end,"Remove Reminder$<%[myNI]> !delalarm %[line:Reminder id]",
"!delalarm <ID>/all  \t\t\t-- delete alarm with ID, '!delalarm all' deletes all reminders. e.g !delalarm 1",},
}

function SendUsr (usr,txt)
      Core.SendToNick(usr,"<"..tAlarm["Cfg"]["sBot"].."> "..tostring(txt))
end
 
function SendPM(usr,txt)
      Core.SendPmToNick(usr,tAlarm["Cfg"]["sBot"], tostring(txt))
end

function STA (txt)
      Core.SendToAll(tostring(txt))
end

function OnStartup()
STA("<"..tAlarm["Cfg"]["sBot"].."> Reminders v2 script started successfully.")
Core.RegBot(tAlarm["Cfg"]["sBot"],"","",true)
if loadfile(fAlarm) then dofile(fAlarm) end
TmrMan.AddTimer(1000);
end

-- right clicks command
UserConnected = function(oUser)
sUser = oUser.sNick
for sCmd,iID in pairs(tCmds) do
Core.SendToNick(oUser.sNick,"$UserCommand 1 3 Reminder\\"..tCmds[sCmd][2].."&#124;")
end
      if tAlarm["tReminders"][sUser] then
for i=1,table.getn(tAlarm["tReminders"][sUser]) do
if tAlarm["tReminders"][sUser][i].bOffline then
SendReminder(tAlarm["Cfg"]["sBot"],sUser,1)
tAlarm["tReminders"][sUser][i].bOffline =false
end
end
end
end
OpConnected = UserConnected
--
function OnError(sErrorMsg)
  Core.SendToOps(sErrorMsg)
end

function ChatArrival(sUser, data)
local s,e,sCmd,sArg1,sArg2,sArg3 = data:find("%b<>%s+!(%S*)%s*(%S*)%s*(%S*)%s*(.*)|")
if sCmd and tCmds[sCmd] then
--local bool,err = pcall(tCmds[sCmd][1],tAlarm["Cfg"]["sBot"],sUser,sArg1,sArg2,sArg3)
--if not(bool) then
-- Core.SendPmToOps(tAlarm["Cfg"]["sBot"],err)
-- SendUsr(sUser.sNick,"There seems to be a script error. The Operators have been informed, meanwhile you may try changing the syntax.")
--end
--return true
return tCmds[sCmd][1](tAlarm["Cfg"]["sBot"],sUser,sArg1,sArg2,sArg3),true
end
end

ToArrival=ChatArrival

function OnTimer()
for sUser,iID in pairs(tAlarm["tReminders"]) do
if tAlarm["tReminders"][sUser] and next(tAlarm["tReminders"][sUser]) then
SendReminder(tAlarm["Cfg"]["sBot"],sUser)
if tAlarm["tReminders"][sUser] and table.getn(tAlarm["tReminders"][sUser])==0 then
tAlarm["tReminders"][sUser] =nil OnExit()
end
end
end
end

function SendReminder(sBot,sUser,bRead)
local sTmp,tRemind,bFound,iATime,iADate = "\r\n\t\t\t\t\t\t\tYour reminder(s) :\r\n\ID\t\Created on:\t\t\tScheduled for\t\t\t\tReminder\r\n"..string.rep("==",30)
if tAlarm["tReminders"][sUser] and next(tAlarm["tReminders"][sUser]) then
for i=1,table.getn(tAlarm["tReminders"][sUser]) do
tRemind =tAlarm["tReminders"][sUser][i]
if tRemind then
iATime = (string.gsub(tRemind.sAtime,"%:",""))
iADate = (string.gsub(tRemind.sAdate,"/",""))
--iNextAlert = tonumber((string.gsub((os.date("%H%M",tRemind.sNextAlert)),"%:","")))
iAlerts =0
if tAlarm["Cfg"]["bExtraAlert"] then
  iAlerts = tAlarm["tReminders"][sUser][i].iMaxalerts 
end
if bRead or ((os.time(os.date("*t"))== tRemind.sNextAlert)  and (tRemind.iAlerts < iAlerts+1))  then
        if bRead then
    sTmp = sTmp.."\r\n"..i
else
    sTmp = sTmp.."("..(tRemind.iAlerts+1)..")\r\n"..i
end
sTmp = sTmp.."\t"..tRemind.sCtime.." "..tRemind["sCdate"].."\t"
..tRemind.sAtime.." "..tRemind["sAdate"].."\t"
.."\t\t"..tRemind["sReminder"]
if Core.GetUser(sUser) then
SendPM(sUser, sTmp)
else
        tAlarm["tReminders"][sUser][i].bOffline= true
end
if not(bRead) and  tAlarm["Cfg"]["bExtraAlert"] then
  tAlarm["tReminders"][sUser][i].iAlerts = tAlarm["tReminders"][sUser][i].iAlerts + 1
  tAlarm["tReminders"][sUser][i].sNextAlert= tAlarm["tReminders"][sUser][i].sNextAlert +(tAlarm["Cfg"]["iInterval"] * 60)
end
end
if  (tRemind.iAlerts >= iAlerts and not(tRemind.bOffline) )or (tRemind.sNextAlert >= tRemind.sNextAlert +24 * 3600)   then
table.remove(tAlarm["tReminders"][sUser],i)
end
end
end
return tRemind
end
end

Serialize = function(tTable,sTableName,hFile,sTab)
sTab = sTab or "";
hFile:write(sTab..sTableName.." = {\n");
for key,value in pairs(tTable) do
if (type(value) ~= "function") then
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then
Serialize(value,sKey,hFile,sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
hFile:write(sTab.."\t"..sKey.." = "..sValue);
end
hFile:write(",\n");
end
end
hFile:write(sTab.."}");
end

SaveToFile = function(file,table,tablename)
local hFile = io.open(file,"w+") Serialize(table,tablename,hFile); hFile:close() 
end

function OnExit()
SaveToFile(fAlarm , tAlarm , "tAlarm")
end



Added !ChgAlarm.
Title: Re: Reminders v1.6 API2
Post by: Dessamator on 24 June, 2012, 09:56:11
Hi,


Sorry for the late reply. The script was never meant for only specific profiles.
I cant really test the code right now as I don't have PX installed, but it should be something like this:

Add this to the top of the script, e.g. after "tMonths" :


tMonths = {31,29,31,30,31,30,31,31,30,31,30,31}
local tProfiles ={
-- [Profile level] = "(Description)"
[1]="Master",
[2]="operator",
}


You may change the above values to the ones that apply in your hub.

Secondly, change SendUsr and SendPM, respectively:

function SendUsr (usr,txt)
if tProfiles[Core.GetUser(usr).iProfile] then
Core.SendToNick(usr,"<"..tAlarm["Cfg"]["sBot"].."> "..tostring(txt))
end
end


function SendPM(usr,txt)
      if tProfiles[Core.GetUser(usr).iProfile] then
Core.SendToNick(usr,"<"..tAlarm["Cfg"]["sBot"].."> "..tostring(txt))
end
end