fusionpbx-ldap/app/scripts/resources/scripts/wakeup.lua

304 lines
12 KiB
Lua

--
-- FusionPBX
-- Version: MPL 1.1
--
-- The contents of this file are subject to the Mozilla Public License Version
-- 1.1 (the "License"); you may not use this file except in compliance with
-- the License. You may obtain a copy of the License at
-- http://www.mozilla.org/MPL/
--
-- Software distributed under the License is distributed on an "AS IS" basis,
-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-- for the specific language governing rights and limitations under the
-- License.
--
-- The Original Code is FusionPBX
--
-- The Initial Developer of the Original Code is
-- Mark J Crane <markjcrane@fusionpbx.com>
-- Copyright (C) 2010
-- the Initial Developer. All Rights Reserved.
--
-- Contributor(s):
-- Mark J Crane <markjcrane@fusionpbx.com>
--get the argv values
script_name = argv[0];
domain_name = argv[1];
wakeup_destination = argv[2];
wakeup_call_sound = argv[3];
--define the trim function
require "resources.functions.trim";
--add is_numeric
function is_numeric(text)
if type(text)~="string" and type(text)~="number" then return false end
return tonumber(text) and true or false
end
--set the default values for the variables
pin_number = "";
max_tries = 3;
digit_timeout = 3000;
--check whether originate the wakeup call or to request details for it
if (wakeup_destination) then
--begin the wakeup call
if ( session:ready() ) then
--prepare the api object
api = freeswitch.API();
--set session settings
session:answer();
session:setAutoHangup(false);
--sleep
session:sleep('500');
--wakeup confirm press 1 to 3
min_digits = 1;
max_digits = 1;
max_tries = 3;
digit_timeout = 20000;
digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", wakeup_call_sound, "", "\\d+");
--get the dialplan variables and set them as local variables
domain_name = session:getVariable("domain_name");
sip_auto_answer = session:getVariable("sip_auto_answer");
snooze_time = session:getVariable("snooze_time");
wakeup_caller_id_name = session:getVariable("wakeup_caller_id_name");
wakeup_caller_id_number = session:getVariable("wakeup_caller_id_number");
--handle auto answer
if (sip_auto_answer == "true") then
auto_answer = "sip_auto_answer=true,sip_h_Alert-Info='Ring Answer'";
else
auto_answer = "sip_auto_answer=false";
end
--reschedule the call for snooze
if (digits == "2") then
freeswitch.consoleLog("NOTICE", "wakeup call: snooze selected - rescheduled the call\n");
api = freeswitch.API();
cmd_string = "sched_api +"..snooze_time.." wakeup-call-"..wakeup_destination.." originate {hangup_after_bridge=false,"..auto_answer..",snooze_time="..snooze_time..",origination_caller_id_name='"..wakeup_caller_id_name.."',origination_caller_id_number="..wakeup_caller_id_number..",wakeup_caller_id_name='".. wakeup_caller_id_name.."',wakeup_caller_id_number=".. wakeup_caller_id_number.."}user/"..wakeup_destination.."@"..domain_name.." &lua('wakeup.lua "..domain_name.." "..wakeup_destination.." "..wakeup_call_sound.."') ";
freeswitch.consoleLog("NOTICE", "wakeup: "..cmd_string.."\n");
reply = api:executeString(cmd_string);
end
end
else
--prompt for the wakeup call information
if (session:ready()) then
--session commands
session:answer();
session:setAutoHangup(false);
--get the dialplan variables and set them as local variables
domain_name = session:getVariable("domain_name");
time_zone_offset = session:getVariable("time_zone_offset");
sip_number_alias = session:getVariable("sip_number_alias");
destination_number = session:getVariable("destination_number");
wakeup_destination = session:getVariable("wakeup_destination");
sip_from_user = session:getVariable("sip_from_user");
sip_auto_answer = session:getVariable("sip_auto_answer");
snooze_time = session:getVariable("snooze_time");
wakeup_caller_id_name = session:getVariable("wakeup_caller_id_name");
wakeup_caller_id_number = session:getVariable("wakeup_caller_id_name");
wakeup_destination_sound = session:getVariable("wakeup_destination_sound");
wakeup_greeting_sound = session:getVariable("wakeup_greeting_sound");
wakeup_call_sound = session:getVariable("wakeup_call_sound");
wakeup_scheduled_sound = session:getVariable("wakeup_scheduled_sound");
wakeup_accept_sound = session:getVariable("wakeup_accept_sound");
wakeup_cancelled_sound = session:getVariable("wakeup_cancelled_sound");
--set the defaults
if (not time_zone_offset) then time_zone_offset = ''; end
if (not sip_number_alias) then sip_number_alias = ''; end
if (not sip_auto_answer) then sip_auto_answer = ''; end
if (not snooze_time) then snooze_time = '600'; end
if (not wakeup_caller_id_name) then wakeup_caller_id_name = 'wakeup call'; end
if (not wakeup_caller_id_number) then wakeup_caller_id_number = destination_number; end
if (not wakeup_destination_sound) then wakeup_destination_sound = 'phrase:wakeup-destination'; end
if (not wakeup_greeting_sound) then wakeup_greeting_sound = 'phrase:wakeup-greeting'; end
if (not wakeup_call_sound) then wakeup_call_sound = 'phrase:wakeup-call'; end
if (not wakeup_scheduled_sound) then wakeup_scheduled_sound = 'phrase:wakeup-scheduled'; end
if (not wakeup_accept_sound) then wakeup_accept_sound = 'phrase:wakeup-accept'; end
if (not wakeup_cancelled_sound) then wakeup_cancelled_sound = 'phrase:wakeup-cancelled'; end
--sleep
session:sleep('500');
end
if (session:ready()) then
--set the wakeup destination
if (wakeup_destination == "prompt") then
min_digits = 1;
max_digits = 11;
--if (wakeup_destination_sound == nil and string.len(wakeup_destination_sound) == 0) then
-- wakeup_destination_sound = "phrase:wakeup-destination";
--end
wakeup_destination = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", wakeup_destination_sound, "", "\\d+");
else
if (is_numeric(wakeup_destination)) then
--use the provided wakeup id
else
if (is_numeric(sip_number_alias)) then
wakeup_destination = sip_number_alias;
else
wakeup_destination = sip_from_user;
end
end
end
--sleep
session:sleep('500');
end
if (session:ready()) then
--play the wakeup greeting
min_digits = 0;
max_digits = 1;
max_tries = 1;
digit_timeout = '1000';
session:streamFile(wakeup_greeting_sound);
--wakeup_greeting = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", wakeup_greeting_sound, "", "\\d+");
end
if (session:ready()) then
--get the wakeup hours
min_digits = 2;
max_digits = 2;
max_tries = 3;
digit_timeout = '3000';
if (wakeup_hours_sound == nil) then
wakeup_hours_sound = "phrase:wakeup-hours";
end
wakeup_hours = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", wakeup_hours_sound, "", "\\d+");
end
if (session:ready()) then
--get the wakeup minutes
min_digits = 2;
max_digits = 2;
max_tries = 3;
if (wakeup_minutes_sound == nil) then
wakeup_minutes_sound = "phrase:wakeup-minutes";
end
wakeup_minutes = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", wakeup_minutes_sound, "", "\\d+");
end
if (session:ready()) then
--send the time to the log
freeswitch.consoleLog("NOTICE", "wakeup time: "..wakeup_hours.."\n");
--get the current time
current_hours = tonumber(os.date("%H"));
current_minutes = tonumber(os.date("%M"));
current_seconds = tonumber(os.date("%S"));
--adjust the time zone offset
if (time_zone_offset) then
current_hours = time_zone_offset + current_hours;
if (current_hours < 0) then
current_hours = current_hours + 24;
end
if (current_hours > 23) then
current_hours = current_hours - 24;
end
end
--show the current hours minutes and seconds to the log
--freeswitch.consoleLog("NOTICE", "Hours: " .. current_hours .. "\n");
--freeswitch.consoleLog("NOTICE", "Mins: " .. current_minutes .. "\n");
--freeswitch.consoleLog("NOTICE", "Seconds: " .. current_seconds .. "\n");
--prepare the current time
current_time = (current_hours * 100) + current_minutes;
--get the wakeup hours and minutes
--wakeup_hours = string.sub(wakeup_time, 1, 2);
--wakeup_minutes = string.sub(wakeup_time, 3);
--show the wakeup time, hours, and minutes to the log
--freeswitch.consoleLog("NOTICE", "wakeup_time "..wakeup_time.."\n");
--freeswitch.consoleLog("NOTICE", "wakeup_hours "..wakeup_hours.."\n");
--freeswitch.consoleLog("NOTICE", "wakeup_minutes "..wakeup_minutes.."\n");
--convert the time, hours and minutes to numbers
wakeup_time = tonumber(tostring(wakeup_hours)..tostring(wakeup_minutes));
--wakeup_hours = tonumber(wakeup_hours);
--wakeup_minutes = tonumber(wakeup_minutes);
--set the time
if (current_time > wakeup_time) then
--get the current_time_in_seconds
current_time_in_seconds = (current_hours * 3600) + (current_minutes * 60);
--freeswitch.consoleLog("NOTICE", "sched_api_time = ("..current_hours.." * 3600) + ("..current_minutes.." * 60)\n");
--get the seconds until midnight
seconds_until_midnight = (24 * 3600) - current_time_in_seconds;
--freeswitch.consoleLog("NOTICE", "sched_api_time = (24 * 3600) - "..current_time_in_seconds.."\n");
--get the wakeup_time_in_seconds
wakeup_time_in_seconds = (wakeup_hours * 3600) + (wakeup_minutes * 60);
--freeswitch.consoleLog("NOTICE", "sched_api_time = ("..wakeup_hours.." * 3600) + ("..wakeup_minutes.." * 60)\n");
--add the seconds_until_midnight to the wakeup_time_in_seconds
sched_api_time = wakeup_time_in_seconds + seconds_until_midnight;
--freeswitch.consoleLog("NOTICE", "sched_api_time = "..wakeup_time_in_seconds.." + "..seconds_until_midnight.."\n");
else
--get the current_time_in_seconds
current_time_in_seconds = (current_hours * 3600) + (current_minutes * 60);
--freeswitch.consoleLog("NOTICE", "current_time_in_seconds = ("..current_hours.." * 3600) + ("..current_minutes.." * 60);\n");
--get the wakeup_time_in_seconds
wakeup_time_in_seconds = (wakeup_hours * 3600) + (wakeup_minutes * 60);
--freeswitch.consoleLog("NOTICE", "wakeup_time_in_seconds = ("..wakeup_hours.." * 3600) + ("..wakeup_minutes.." * 60);\n");
--subtract the current time from wakeup_time_in_seconds
sched_api_time = wakeup_time_in_seconds - current_time_in_seconds;
--freeswitch.consoleLog("NOTICE", "sched_api_time = "..wakeup_time_in_seconds.." - "..current_time_in_seconds.."\n");
end
--freeswitch.consoleLog("NOTICE", "sched_api_time "..sched_api_time.."\n");
end
if (session:ready()) then
--wakeup call has been scheduled
session:streamFile(wakeup_scheduled_sound);
session:say(wakeup_time, "en", "number", "ITERATED");
--handle auto answer
if (sip_auto_answer == "true") then
auto_answer = "sip_auto_answer=true,sip_h_Alert-Info='Ring Answer'";
else
auto_answer = "sip_auto_answer=false";
end
--schedule the wakeup call
cmd_string = "sched_api +"..sched_api_time.." wakeup-call-"..wakeup_destination.." originate {hangup_after_bridge=false,"..auto_answer..",snooze_time="..snooze_time..",origination_caller_id_name='".. wakeup_caller_id_name.."',origination_caller_id_number=".. wakeup_caller_id_number..",wakeup_caller_id_name='".. wakeup_caller_id_name.."',wakeup_caller_id_number=".. wakeup_caller_id_number.."}user/"..wakeup_destination.."@"..domain_name.." &lua('wakeup.lua "..domain_name.." "..wakeup_destination.." "..wakeup_call_sound.."') ";
freeswitch.consoleLog("NOTICE", "wakeup: "..cmd_string.."\n");
api = freeswitch.API();
reply = api:executeString(cmd_string);
--wakeup confirm press 1 to 3
min_digits = 1;
max_digits = 1;
wakeup_accept = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", wakeup_accept_sound, "", "\\d+");
--accept
if (wakeup_accept == "1") then
--send a message to the console
freeswitch.consoleLog("NOTICE", "wakeup: accepted\n");
--hangup
session:hangup();
end
--cancel
if (wakeup_accept == "2") then
--send a message to the console
freeswitch.consoleLog("NOTICE", "wakeup: cancelled\n");
--unschedule the call
cmd_string = "sched_del wakeup-call-"..wakeup_destination;
freeswitch.consoleLog("NOTICE", "wakeup: "..cmd_string.."\n");
api = freeswitch.API();
reply = api:executeString(cmd_string);
--play the cancel message
session:streamFile(wakeup_cancelled_sound);
--hangup
session:hangup();
end
end
end