Reminders v1.6 API2
 

Reminders v1.6 API2

Started by Dessamator, 13 June, 2010, 22:37:35

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dessamator

-- 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
Ignorance is Bliss.

DeAn

The script is working great. Thanks a lot Dessamator for very persuant reply and the script.  :)
Thanks,

DeAn

Dessamator

#2
-- 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.
Ignorance is Bliss.

Cariga

It is possbile to change the name of the right click metu from Reminder to ? Reminder ? ?
We are captives of our own identities, living in prisons of our own creation

Dessamator

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;")   
Ignorance is Bliss.

Popeye

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.

Dessamator

#6
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
Ignorance is Bliss.

SMF spam blocked by CleanTalk