IVR Menu fix menu options with same length as direct dial regex

This commit is contained in:
agree 2021-02-03 17:23:51 -05:00
parent e10e530561
commit c4dfb7ce59
2 changed files with 30 additions and 12 deletions

View File

@ -149,9 +149,17 @@
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "ac4ff01d-51a2-433f-9243-be9b6dd8ba9c";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "ivr_menu";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "direct_dial_digits";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "/^(\d{2,11})$/";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "direct_dial_digits_min";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "numeric";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "2";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "35772199-3dd3-4c8e-9651-a50c885602d9";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "ivr_menu";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "direct_dial_digits_max";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "numeric";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "11";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;

View File

@ -119,8 +119,9 @@
--set variables from settings
local settings = Settings.new(dbh, domain_name, domain_uuid)
--direct dial regex
direct_dial_digits = settings:get('ivr_menu', 'direct_dial_digits', 'text')
--direct dial length
local direct_dial_digits_min = settings:get('ivr_menu', 'direct_dial_digits_min', 'numeric') or 2;
local direct_dial_digits_max = settings:get('ivr_menu', 'direct_dial_digits_max', 'numeric') or 11;
--storage path
local storage_type = settings:get('recordings', 'storage_type', 'text')
@ -270,24 +271,33 @@
if (debug["sql"]) then
freeswitch.consoleLog("notice", "[ivr_menu] SQL: " .. sql .. "; params:" .. json.encode(params) .. "\n");
end
local direct_dial_exclude = {};
dbh:query(sql, params, function(r)
ivr_menu_option_digits = r.ivr_menu_option_digits
ivr_menu_option_action = r.ivr_menu_option_action
ivr_menu_option_param = r.ivr_menu_option_param
ivr_menu_option_description = r.ivr_menu_option_description
table.insert(xml, [[ <entry action="]]..ivr_menu_option_action..[[" digits="]]..ivr_menu_option_digits..[[" param="]]..ivr_menu_option_param..[[" description="]]..ivr_menu_option_description..[["/>]]);
if (tonumber(ivr_menu_option_digits) and #ivr_menu_option_digits >= tonumber(direct_dial_digits_min)) then
table.insert(direct_dial_exclude, ivr_menu_option_digits);
end
end);
--direct dial
if (ivr_menu_direct_dial == "true") then
table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_digits..[[" param="set ${cond(${user_exists id $1 ]]..domain_name..[[} == true ? user_exists=true : user_exists=false)}" description="direct dial"/>\n]]);
--table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_digits..[[" param="set ${cond(${user_exists} == true ? user_exists=true : ivr_max_failures=${system(expr ${ivr_max_failures} + 1)})}" description="increment max failures"/>\n]]);
table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_digits..[[" param="playback ${cond(${user_exists} == true ? ]]..sound_prefix..[[ivr/ivr-call_being_transferred.wav : ]]..sound_prefix..[[ivr/ivr-that_was_an_invalid_entry.wav)}" description="play sound"/>\n]]);
--table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_digits..[[" param="transfer ${cond(${ivr_max_failures} == ]]..ivr_menu_max_failures..[[ ? ]]..ivr_menu_exit_data..[[)}" description="max fail transfer"/>\n]]);
if (#ivr_menu_cid_prefix > 0) then
table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_digits..[[" param="set effective_caller_id_name=]]..ivr_menu_cid_prefix..[[#${caller_id_name}" description="direct dial"/>\n]]);
local negetive_lookahead = "";
if (#direct_dial_exclude > 0) then
negetive_lookahead = "(?!"..table.concat(direct_dial_exclude, "|")..")";
end
table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_digits..[[" param="transfer ${cond(${user_exists} == true ? $1 XML ]]..domain_name..[[)}" description="direct dial transfer"/>\n]]);
local direct_dial_regex = string.format("/^%s(\\d{%s,%s})$/", negetive_lookahead, direct_dial_digits_min, direct_dial_digits_max);
table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_regex..[[" param="set ${cond(${user_exists id $1 ]]..domain_name..[[} == true ? user_exists=true : user_exists=false)}" description="direct dial"/>\n]]);
--table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_regex..[[" param="set ${cond(${user_exists} == true ? user_exists=true : ivr_max_failures=${system(expr ${ivr_max_failures} + 1)})}" description="increment max failures"/>\n]]);
table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_regex..[[" param="playback ${cond(${user_exists} == true ? ]]..sound_prefix..[[ivr/ivr-call_being_transferred.wav : ]]..sound_prefix..[[ivr/ivr-that_was_an_invalid_entry.wav)}" description="play sound"/>\n]]);
--table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_regex..[[" param="transfer ${cond(${ivr_max_failures} == ]]..ivr_menu_max_failures..[[ ? ]]..ivr_menu_exit_data..[[)}" description="max fail transfer"/>\n]]);
if (#ivr_menu_cid_prefix > 0) then
table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_regex..[[" param="set effective_caller_id_name=]]..ivr_menu_cid_prefix..[[#${caller_id_name}" description="direct dial"/>\n]]);
end
table.insert(xml, [[ <entry action="menu-exec-app" digits="]]..direct_dial_regex..[[" param="transfer ${cond(${user_exists} == true ? $1 XML ]]..domain_name..[[)}" description="direct dial transfer"/>\n]]);
end
--close the extension tag if it was left open