diff --git a/app/destinations/destination_edit.php b/app/destinations/destination_edit.php index f2f446510a..d6051689c1 100644 --- a/app/destinations/destination_edit.php +++ b/app/destinations/destination_edit.php @@ -543,7 +543,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) { echo " if (document.getElementById('tr_caller_id_name')) { document.getElementById('tr_caller_id_name').style.display = 'none'; }\n"; echo " if (document.getElementById('tr_caller_id_number')) { document.getElementById('tr_caller_id_number').style.display = 'none'; }\n"; echo " document.getElementById('tr_actions').style.display = 'none';\n"; - echo " document.getElementById('tr_fax_detection').style.display = 'none';\n"; + echo " if (document.getElementById('tr_fax_detection')) { document.getElementById('tr_fax_detection').style.display = 'none'; }\n"; echo " document.getElementById('tr_cid_name_prefix').style.display = 'none';\n"; echo " if (document.getElementById('tr_sell')) { document.getElementById('tr_sell').style.display = 'none'; }\n"; echo " if (document.getElementById('tr_buy')) { document.getElementById('tr_buy').style.display = 'none'; }\n"; @@ -555,7 +555,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) { echo " if (document.getElementById('tr_caller_id_name')) { document.getElementById('tr_caller_id_name').style.display = ''; }\n"; echo " if (document.getElementById('tr_caller_id_number')) { document.getElementById('tr_caller_id_number').style.display = ''; }\n"; echo " document.getElementById('tr_actions').style.display = '';\n"; - echo " document.getElementById('tr_fax_detection').style.display = '';\n"; + echo " if (document.getElementById('tr_fax_detection')) { document.getElementById('tr_fax_detection').style.display = ''; }\n"; echo " document.getElementById('tr_cid_name_prefix').style.display = '';\n"; echo " if (document.getElementById('tr_sell')) { document.getElementById('tr_sell').style.display = ''; }\n"; echo " if (document.getElementById('tr_buy')) { document.getElementById('tr_buy').style.display = ''; }\n"; diff --git a/resources/install/scripts/call_forward.lua b/resources/install/scripts/call_forward.lua index 553a883c20..fc4f693f38 100644 --- a/resources/install/scripts/call_forward.lua +++ b/resources/install/scripts/call_forward.lua @@ -28,250 +28,309 @@ max_tries = "3"; digit_timeout = "3000"; ---debug - debug["sql"] = false; - --define the trim function require "resources.functions.trim" ---define the explode function - require "resources.functions.explode" - --create the api object api = freeswitch.API(); --include config.lua require "resources.functions.config"; +--include config.lua + require "resources.functions.settings"; + + require "resources.functions.channel_utils"; + + local log = require "resources.functions.log".call_forward + local cache = require "resources.functions.cache" + local Database = require "resources.functions.database" + + local function opt(t, ...) + if select('#', ...) == 0 then + return t + end + if type(t) ~= 'table' then + return nil + end + return opt(t[...], select(2, ...)) + end + + local function empty(t) + return (not t) or (#t == 0) + end + --check if the session is ready - if (session:ready()) then - --answer the call - session:answer(); + if not session:ready() then return end - --get the variables - enabled = session:getVariable("enabled"); - pin_number = session:getVariable("pin_number"); - sounds_dir = session:getVariable("sounds_dir"); - domain_uuid = session:getVariable("domain_uuid"); - domain_name = session:getVariable("domain_name"); - extension_uuid = session:getVariable("extension_uuid"); - context = session:getVariable("context"); - if (not context ) then context = 'default'; end - request_id = session:getVariable("request_id"); +--answer the call + session:answer(); - --set the sounds path for the language, dialect and voice - default_language = session:getVariable("default_language"); - default_dialect = session:getVariable("default_dialect"); - default_voice = session:getVariable("default_voice"); - if (not default_language) then default_language = 'en'; end - if (not default_dialect) then default_dialect = 'us'; end - if (not default_voice) then default_voice = 'callie'; end +--get the variables + local enabled = session:getVariable("enabled"); + local pin_number = session:getVariable("pin_number"); + local sounds_dir = session:getVariable("sounds_dir"); + local domain_uuid = session:getVariable("domain_uuid"); + local domain_name = session:getVariable("domain_name"); + local extension_uuid = session:getVariable("extension_uuid"); + local request_id = session:getVariable("request_id"); + local extension, dial_string - --a moment to sleep - session:sleep(1000); +--set the sounds path for the language, dialect and voice + local default_language = session:getVariable("default_language") or 'en'; + local default_dialect = session:getVariable("default_dialect") or 'us'; + local default_voice = session:getVariable("default_voice") or 'callie'; - --connect to the database - require "resources.functions.database_handle"; - dbh = database_handle('system'); +--a moment to sleep + session:sleep(1000); - --request id is true - if (request_id == "true") then - --unset extension uuid - extension_uuid = nil; +--connect to the database + dbh = Database.new('system'); - --get the id - if (session:ready()) then - min_digits = 2; - max_digits = 20; - id = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:voicemail_enter_id:#", "", "\\d+"); - end +--request id is true + if (request_id == "true") then + --unset extension uuid + extension_uuid = nil; - --get the pin number - if (session:ready()) then - min_digits = 3; - max_digits = 20; - caller_pin_number = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:voicemail_enter_pass:#", "", "\\d+"); - end + --get the extension + if not session:ready() then return end + local min_digits = 2; + local max_digits = 20; + extension = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:voicemail_enter_id:#", "", "\\d+"); + if empty(extension) then return end - --check to see if the pin number is correct - if (session:ready()) then - sql = "SELECT * FROM v_voicemails "; - sql = sql .. "WHERE domain_uuid = '" .. domain_uuid .."' "; - sql = sql .. "AND voicemail_id = '" .. id .."' "; - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[call_forward] "..sql .."\n"); - end - dbh:query(sql, function(row) - voicemail_password = row.voicemail_password; - --freeswitch.consoleLog("notice", "[call_forward] "..voicemail_password .."\n"); - end); - if (voicemail_password ~= caller_pin_number) then - --access denied - session:streamFile("phrase:voicemail_fail_auth:#"); - session:hangup("NORMAL_CLEARING"); - end - end + --get the pin number + if not session:ready() then return end + min_digits = 3; + max_digits = 20; + local caller_pin_number = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:voicemail_enter_pass:#", "", "\\d+"); + if empty(caller_pin_number) then return end + + --check to see if the pin number is correct + if not session:ready() then return end + local sql = "SELECT * FROM v_voicemails "; + sql = sql .. "WHERE domain_uuid = '" .. domain_uuid .."' "; + sql = sql .. "AND voicemail_id = '" .. extension .."' "; + if (debug["sql"]) then + log.notice(sql); + end + local voicemail_password = dbh:first_value(sql) + if (voicemail_password ~= caller_pin_number) then + --access denied + session:streamFile("phrase:voicemail_fail_auth:#"); + return session:hangup("NORMAL_CLEARING"); + end + end + +--determine whether to update the dial string + if not session:ready() then return end + + local sql = "select * from v_extensions "; + sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; + if (extension_uuid ~= nil) then + sql = sql .. "and extension_uuid = '"..extension_uuid.."' "; + else + sql = sql .. "and (extension = '"..extension.."' or number_alias = '"..extension.."') "; + end + if (debug["sql"]) then + log.notice(sql); + end + local row = dbh:first_row(sql) + if not row then return end + + extension_uuid = row.extension_uuid; + extension = row.extension; + local number_alias = row.number_alias or ''; + local accountcode = row.accountcode; + local forward_all_enabled = row.forward_all_enabled; + local forward_all_destination = row.forward_all_destination; + local follow_me_uuid = row.follow_me_uuid; + local toll_allow = row.toll_allow or ''; + local forward_caller_id_uuid = row.forward_caller_id_uuid; + +--toggle enabled + if enabled == "toggle" then + enabled = (forward_all_enabled == "true") and "false" or "true"; + end + + if not session:ready() then return end + +--get the forward destination + if enabled == "true" and empty(forward_all_destination) then + forward_all_destination = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-enter_destination_telephone_number.wav", "", "\\d+"); + if empty(forward_all_destination) then return end + end + +--set call forward + if enabled == "true" then + --set forward_all_enabled + forward_all_enabled = "true"; + channel_display(session:get_uuid(), "Activated") + --say the destination number + session:say(forward_all_destination, default_language, "number", "iterated"); + --notify the caller + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-call_forwarding_has_been_set.wav"); + end + +--get the caller_id for outbound call + local forward_caller_id = "" + if enabled == "true" and not empty(forward_caller_id_uuid) then + local sql = "select destination_number, destination_description,".. + "destination_caller_id_number, destination_caller_id_name " .. + "from v_destinations where domain_uuid = '" .. domain_uuid .. "' and " .. + "destination_type = 'inbound' and destination_uuid = '" .. forward_caller_id_uuid .. "'"; + local row = dbh:first_row(sql) + if row then + local caller_id_number = row.destination_caller_id_number + if empty(caller_id_number) then + caller_id_number = row.destination_number end - --determine whether to update the dial string - if (session:ready()) then - sql = "select * from v_extensions "; - sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; - if (extension_uuid ~= nil) then - sql = sql .. "and extension_uuid = '"..extension_uuid.."' "; - else - sql = sql .. "and (extension = '"..id.."' or number_alias = '"..id.."') "; - end - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[call_forward] "..sql.."\n"); - end - status = dbh:query(sql, function(row) - extension_uuid = row.extension_uuid; - extension = row.extension; - number_alias = row.number_alias or ''; - accountcode = row.accountcode; - forward_all_enabled = row.forward_all_enabled; - forward_all_destination = row.forward_all_destination; - follow_me_uuid = row.follow_me_uuid; - toll_allow = row.toll_allow or ''; - --freeswitch.consoleLog("NOTICE", "[call forward] extension "..row.extension.."\n"); - --freeswitch.consoleLog("NOTICE", "[call forward] accountcode "..row.accountcode.."\n"); - end); + local caller_id_name = row.destination_caller_id_name + if empty(caller_id_name) then + caller_id_name = row.destination_description end - --toggle enabled - if (session:ready() and enabled == "toggle") then - if (forward_all_enabled == "true") then - enabled = "false"; - else - enabled = "true"; - end + if not empty(caller_id_number) then + forward_caller_id = forward_caller_id .. + ",outbound_caller_id_number=" .. caller_id_number .. + ",origination_caller_id_number=" .. caller_id_number end - --get the forward destination - if (session:ready() and (enabled == "true" or enabled == "toggle") ) then - if (string.len(forward_all_destination) == 0) then - forward_all_destination = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-enter_destination_telephone_number.wav", "", "\\d+"); - end + if not empty(caller_id_name) then + forward_caller_id = forward_caller_id .. + ",outbound_caller_id_name=" .. caller_id_name .. + ",origination_caller_id_name=" .. caller_id_name end + end + end - --set the dial string - if (session:ready() and enabled == "true") then - --used for number_alias to get the correct user - sql = "select * from v_extensions "; - sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; - sql = sql .. "and number_alias = '"..forward_all_destination.."' "; - status = dbh:query(sql, function(row) - destination_user = row.extension; - end); +--set the dial string + if enabled == "true" then + local destination_extension, destination_number_alias - --set the dial_string - dial_string = "{presence_id="..forward_all_destination.."@"..domain_name; - dial_string = dial_string .. ",instant_ringback=true"; - dial_string = dial_string .. ",domain_uuid="..domain_uuid; - dial_string = dial_string .. ",sip_invite_domain="..domain_name; - dial_string = dial_string .. ",domain_name="..domain_name; - dial_string = dial_string .. ",domain="..domain_name; - dial_string = dial_string .. ",toll_allow='"..toll_allow.."'"; - if (accountcode ~= nil) then - dial_string = dial_string .. ",accountcode="..accountcode; - end - dial_string = dial_string .. "}"; + --used for number_alias to get the correct user + local sql = "select extension, number_alias from v_extensions "; + sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; + sql = sql .. "and number_alias = '"..forward_all_destination.."' "; + dbh:query(sql, function(row) + destination_user = row.extension; + destination_extension = row.extension; + destination_number_alias = row.number_alias or ''; + end); - if (destination_user ~= nil) then - cmd = "user_exists id ".. destination_user .." "..domain_name; - else - cmd = "user_exists id ".. forward_all_destination .." "..domain_name; - end - user_exists = trim(api:executeString(cmd)); - if (user_exists == "true") then - if (destination_user ~= nil) then - dial_string = dial_string .. "user/"..destination_user.."@"..domain_name; - else - dial_string = dial_string .. "user/"..forward_all_destination.."@"..domain_name; - end - else - dial_string = dial_string .. "loopback/"..forward_all_destination; - end - end - - --set call forward - if (session:ready() and enabled == "true") then - --set forward_all_enabled - forward_all_enabled = "true"; - --say the destination number - session:say(forward_all_destination, default_language, "number", "iterated"); - --notify the caller - session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-call_forwarding_has_been_set.wav"); - end - - --unset call forward - if (session:ready() and enabled == "false") then - --set forward_all_enabled - forward_all_enabled = "false"; - --notify the caller - session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-call_forwarding_has_been_cancelled.wav"); - end - - --disable the follow me - if (session:ready() and enabled == "true" and follow_me_uuid ~= nil) then - if (string.len(follow_me_uuid) > 0) then - sql = "update v_follow_me set "; - sql = sql .. "follow_me_enabled = 'false' "; - sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; - sql = sql .. "and follow_me_uuid = '"..follow_me_uuid.."' "; - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[call_forward] "..sql.."\n"); - end - dbh:query(sql); - end - end - - --check the destination - if (forward_all_destination == nil) then - enabled = false; - forward_all_enabled = "false"; + local presence_id + if destination_extension then + if (#destination_number_alias > 0) and (opt(settings(domain_uuid), 'provision', 'number_as_presence_id', 'boolean') == 'true') then + presence_id = destination_number_alias else - if (string.len(forward_all_destination) == 0) then - enabled = false; - forward_all_enabled = "false"; - end + presence_id = destination_extension end - - --update the extension - if (session:ready()) then - sql = "update v_extensions set "; - if (enabled == "true") then - sql = sql .. "forward_all_destination = '"..forward_all_destination.."', "; - sql = sql .. "dial_string = '"..dial_string:gsub("'", "''").."', "; - sql = sql .. "do_not_disturb = 'false', "; - else - sql = sql .. "forward_all_destination = null, "; - sql = sql .. "dial_string = null, "; - end - sql = sql .. "forward_all_enabled = '"..forward_all_enabled.."' "; - sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; - sql = sql .. "and extension_uuid = '"..extension_uuid.."' "; - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[call_forward] "..sql.."\n"); - end - dbh:query(sql); - - --clear the cache - if (extension ~= nil) then - api:execute("memcache", "delete directory:"..extension.."@"..domain_name); - if #number_alias > 0 then - api:execute("memcache", "delete directory:"..number_alias.."@"..domain_name); - end - end + elseif extension then + -- setting here presence_id equal extension not dialed number allows work BLF and intercept. + -- $presence_id = extension_presence_id($this->extension, $this->number_alias); + if (#number_alias > 0) and (opt(settings(domain_uuid), 'provision', 'number_as_presence_id', 'boolean') == 'true') then + presence_id = number_alias + else + presence_id = extension end + else + presence_id = forward_all_destination + end - -- hangup - if (session:ready()) then - --wait for the file to be written before proceeding - session:sleep(100); + --set the dial_string + dial_string = "{presence_id="..presence_id.."@"..domain_name; + dial_string = dial_string .. ",instant_ringback=true"; + dial_string = dial_string .. ",domain_uuid="..domain_uuid; + dial_string = dial_string .. ",sip_invite_domain="..domain_name; + dial_string = dial_string .. ",domain_name="..domain_name; + dial_string = dial_string .. ",domain="..domain_name; + dial_string = dial_string .. ",toll_allow='"..toll_allow.."'"; + if (accountcode ~= nil) then + dial_string = dial_string .. ",accountcode="..accountcode; + end + dial_string = dial_string .. forward_caller_id + dial_string = dial_string .. "}"; - --end the call - session:hangup(); + if (destination_user ~= nil) then + cmd = "user_exists id ".. destination_user .." "..domain_name; + else + cmd = "user_exists id ".. forward_all_destination .." "..domain_name; + end + user_exists = trim(api:executeString(cmd)); + if (user_exists == "true") then + if (destination_user ~= nil) then + dial_string = dial_string .. "user/"..destination_user.."@"..domain_name; + else + dial_string = dial_string .. "user/"..forward_all_destination.."@"..domain_name; end - end \ No newline at end of file + else + dial_string = dial_string .. "loopback/"..forward_all_destination; + end + end + +--unset call forward + if session:ready() and enabled == "false" then + --set forward_all_enabled + forward_all_enabled = "false"; + channel_display(session:get_uuid(), "Cancelled") + --notify the caller + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-call_forwarding_has_been_cancelled.wav"); + end + +--disable the follow me + if enabled == "true" and not empty(follow_me_uuid) then + local sql = "update v_follow_me set "; + sql = sql .. "follow_me_enabled = 'false' "; + sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; + sql = sql .. "and follow_me_uuid = '"..follow_me_uuid.."' "; + if (debug["sql"]) then + log.notice(sql); + end + dbh:query(sql); + end + +--check the destination + if empty(forward_all_destination) then + enabled = "false"; + forward_all_enabled = "false"; + end + +--update the extension + do + local sql = "update v_extensions set "; + if (enabled == "true") then + sql = sql .. "forward_all_destination = '"..forward_all_destination.."', "; + sql = sql .. "dial_string = '"..dial_string:gsub("'", "''").."', "; + sql = sql .. "do_not_disturb = 'false', "; + else + sql = sql .. "forward_all_destination = null, "; + sql = sql .. "dial_string = null, "; + end + sql = sql .. "forward_all_enabled = '"..forward_all_enabled.."' "; + sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; + sql = sql .. "and extension_uuid = '"..extension_uuid.."' "; + if (debug["sql"]) then + log.notice(sql); + end + dbh:query(sql); + end + +--disconnect from database + dbh:release() + +--clear the cache + if extension and #extension > 0 and cache.support() then + cache.del("directory:"..extension.."@"..domain_name); + if #number_alias > 0 then + cache.del("directory:"..number_alias.."@"..domain_name); + end + end + +--hangup + if (session:ready()) then + --wait for the file to be written before proceeding + session:sleep(100); + --end the call + session:hangup(); + end diff --git a/resources/install/scripts/follow_me.lua b/resources/install/scripts/follow_me.lua index 5dce059ae0..ee1a267672 100644 --- a/resources/install/scripts/follow_me.lua +++ b/resources/install/scripts/follow_me.lua @@ -22,158 +22,140 @@ -- Contributor(s): -- Mark J Crane ---set default variables - min_digits = "1"; - max_digits = "11"; - max_tries = "3"; - digit_timeout = "3000"; - ---debug - debug["sql"] = true; - ---define the trim function - require "resources.functions.trim"; - ---define the explode function - require "resources.functions.explode"; +--include config.lua + require "resources.functions.config"; --create the api object api = freeswitch.API(); ---include config.lua - require "resources.functions.config"; + require "resources.functions.channel_utils"; + local log = require "resources.functions.log".follow_me + local cache = require "resources.functions.cache" + local Database = require "resources.functions.database" --check if the session is ready - if ( session:ready() ) then - --answer the call - session:answer(); - - --get the variables - pin_number = session:getVariable("pin_number"); - sounds_dir = session:getVariable("sounds_dir"); - domain_uuid = session:getVariable("domain_uuid"); - domain_name = session:getVariable("domain_name"); - extension_uuid = session:getVariable("extension_uuid"); - context = session:getVariable("context"); - if (not context ) then context = 'default'; end - - --set the sounds path for the language, dialect and voice - default_language = session:getVariable("default_language"); - default_dialect = session:getVariable("default_dialect"); - default_voice = session:getVariable("default_voice"); - if (not default_language) then default_language = 'en'; end - if (not default_dialect) then default_dialect = 'us'; end - if (not default_voice) then default_voice = 'callie'; end - - --a moment to sleep - session:sleep(1000); - - --connect to the database - require "resources.functions.database_handle"; - dbh = database_handle('system'); - - --determine whether to update the dial string - sql = "select * from v_extensions "; - sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; - sql = sql .. "and extension_uuid = '"..extension_uuid.."' "; - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[follow_me] "..sql.."\n"); - end - status = dbh:query(sql, function(row) - extension = row.extension; - number_alias = row.number_alias or ''; - accountcode = row.accountcode; - follow_me_uuid = row.follow_me_uuid; - --freeswitch.consoleLog("NOTICE", "[call forward] extension "..row.extension.."\n"); - --freeswitch.consoleLog("NOTICE", "[call forward] accountcode "..row.accountcode.."\n"); - end); + if not session:ready() then return end - --determine whether to update the dial string - enabled = "false"; - sql = "select * from v_follow_me "; - sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; - sql = sql .. "and follow_me_uuid = '"..follow_me_uuid.."' "; - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[follow_me] "..sql.."\n"); - end - status = dbh:query(sql, function(row) - enabled = row.follow_me_enabled; - call_prompt = row.call_prompt; - cid_name_prefix = row.cid_name_prefix; - cid_number_prefix = row.cid_number_prefix; - dial_string = row.dial_string; - end); - - --set follow me - if (enabled == "false") then - --answer and play a tone - session:answer(); - api = freeswitch.API(); - reply = api:executeString("uuid_display "..session:get_uuid().." Activated "); +--answer the call + session:answer(); - session:execute("sleep", "2000"); - session:execute("playback", "tone_stream://%(200,0,500,600,700)"); - --notify the caller - --session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-call_forwarding_has_been_set.wav"); - end - - --unset follow me - if (enabled == "true") then - --answer and play a tone - session:answer(); - api = freeswitch.API(); - reply = api:executeString("uuid_display "..session:get_uuid().." Cancelled "); +--get the variables + local domain_uuid = session:getVariable("domain_uuid"); + local domain_name = session:getVariable("domain_name"); + local extension_uuid = session:getVariable("extension_uuid"); - session:execute("sleep", "2000"); - session:execute("playback", "tone_stream://%(500,0,300,200,100,50,25)"); - --notify the caller - --session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-call_forwarding_has_been_cancelled.wav"); - end +--set the sounds path for the language, dialect and voice + local sounds_dir = session:getVariable("sounds_dir"); + local default_language = session:getVariable("default_language") or 'en'; + local default_dialect = session:getVariable("default_dialect") or 'us'; + local default_voice = session:getVariable("default_voice") or 'callie'; - --enable or disable follow me - if (follow_me_uuid ~= nil) then - sql = "update v_follow_me set "; - if (enabled == "true") then - sql = sql .. "follow_me_enabled = 'false' "; - else - sql = sql .. "follow_me_enabled = 'true' "; - end - sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; - sql = sql .. "and follow_me_uuid = '"..follow_me_uuid.."' "; - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[follow_me] "..sql.."\n"); - end - dbh:query(sql); - end - - --update the extension - sql = "update v_extensions set "; - if (enabled == "true") then - sql = sql .. "dial_string = null, "; - else - sql = sql .. "dial_string = '"..dial_string.."', "; - end - sql = sql .. "do_not_disturb = 'false', "; - sql = sql .. "forward_all_enabled= 'false' "; - sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; - sql = sql .. "and extension_uuid = '"..extension_uuid.."' "; - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[follow_me] "..sql.."\n"); - end - dbh:query(sql); - - --clear the cache - if (extension ~= nil) then - api:execute("memcache", "delete directory:"..extension.."@"..domain_name); - if #number_alias > 0 then - api:execute("memcache", "delete directory:"..number_alias.."@"..domain_name); - end - end - - --wait for the file to be written before proceeding - session:sleep(1000); - - --end the call - session:hangup(); - +--a moment to sleep + session:sleep(1000); + +--check if the session is ready + if not session:ready() then return end + +--connect to the database + local dbh = Database.new('system'); + +--determine whether to update the dial string + local sql = "select extension, number_alias, accountcode, follow_me_uuid "; + sql = sql .. "from v_extensions "; + sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; + sql = sql .. "and extension_uuid = '"..extension_uuid.."' "; + if (debug["sql"]) then + log.notice(sql); end + + local row = dbh:first_row(sql) + if not row then return end + + local extension = row.extension; + local number_alias = row.number_alias or ''; + local accountcode = row.accountcode; + local follow_me_uuid = row.follow_me_uuid; + +--determine whether to update the dial string + sql = "select follow_me_enabled, call_prompt, cid_name_prefix, cid_number_prefix, dial_string " + sql = sql .. "from v_follow_me "; + sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; + sql = sql .. "and follow_me_uuid = '"..follow_me_uuid.."' "; + if (debug["sql"]) then + log.notice(sql); + end + + row = dbh:first_row(sql) + if not row then return end + + local enabled = row.follow_me_enabled; + local call_prompt = row.call_prompt; + local cid_name_prefix = row.cid_name_prefix; + local cid_number_prefix = row.cid_number_prefix; + local dial_string = row.dial_string; + +--set follow me + if (enabled == "false") then + --play a tone + channel_display(session:get_uuid(), "Activated") + + session:execute("sleep", "2000"); + session:execute("playback", "tone_stream://%(200,0,500,600,700)"); + --notify the caller + --session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-call_forwarding_has_been_set.wav"); + end + +--unset follow me + if (enabled == "true") then + --play a tone + channel_display(session:get_uuid(), "Cancelled") + + session:execute("sleep", "2000"); + session:execute("playback", "tone_stream://%(500,0,300,200,100,50,25)"); + --notify the caller + --session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-call_forwarding_has_been_cancelled.wav"); + end + +--enable or disable follow me + sql = "update v_follow_me set "; + if (enabled == "true") then + sql = sql .. "follow_me_enabled = 'false' "; + else + sql = sql .. "follow_me_enabled = 'true' "; + end + sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; + sql = sql .. "and follow_me_uuid = '"..follow_me_uuid.."' "; + if (debug["sql"]) then + log.notice(sql); + end + dbh:query(sql); + +--update the extension + sql = "update v_extensions set "; + if (enabled == "true") then + sql = sql .. "dial_string = null, "; + else + sql = sql .. "dial_string = '"..dial_string:gsub("'", "''").."', "; + end + sql = sql .. "do_not_disturb = 'false', "; + sql = sql .. "forward_all_enabled= 'false' "; + sql = sql .. "where domain_uuid = '"..domain_uuid.."' "; + sql = sql .. "and extension_uuid = '"..extension_uuid.."' "; + if (debug["sql"]) then + log.notice(sql); + end + dbh:query(sql); + +--clear the cache + if (extension ~= nil) and cache.support() then + cache.del("directory:"..extension.."@"..domain_name); + if #number_alias > 0 then + cache.del("directory:"..number_alias.."@"..domain_name); + end + end + +--wait for the file to be written before proceeding + session:sleep(1000); + +--end the call + session:hangup(); diff --git a/resources/install/scripts/resources/functions/channel_utils.lua b/resources/install/scripts/resources/functions/channel_utils.lua index a94ceffe62..3676f87d7d 100644 --- a/resources/install/scripts/resources/functions/channel_utils.lua +++ b/resources/install/scripts/resources/functions/channel_utils.lua @@ -23,6 +23,14 @@ function channel_evalute(uuid, cmd) return result end +function channel_display(uuid, text) + local cmd = ("uuid_display %s '%s'"):format(uuid, text) + local result = trim(api:executeString(cmd)) + if result:sub(1, 4) == '-ERR' then return nil, result end + if result == '_undef_' then return false end + return result +end + local _switchname local function switchname() if _switchname then return _switchname end