summaryrefslogtreecommitdiff
path: root/misc/freeswitch/scripts/dialplan/ivr.lua
diff options
context:
space:
mode:
Diffstat (limited to 'misc/freeswitch/scripts/dialplan/ivr.lua')
-rw-r--r--misc/freeswitch/scripts/dialplan/ivr.lua83
1 files changed, 68 insertions, 15 deletions
diff --git a/misc/freeswitch/scripts/dialplan/ivr.lua b/misc/freeswitch/scripts/dialplan/ivr.lua
index f8b8a2d..6b230dc 100644
--- a/misc/freeswitch/scripts/dialplan/ivr.lua
+++ b/misc/freeswitch/scripts/dialplan/ivr.lua
@@ -21,29 +21,51 @@ function Ivr.new(self, arg)
end
-function Ivr.ivr_phrase(self, phrase, keys, timeout, ivr_repeat)
+function Ivr.ivr_break(self)
+ return self.exit or not self.caller:ready();
+end
+
+
+function Ivr.ivr_phrase(self, phrase, keys, timeout, ivr_repeat, phrase_data)
ivr_repeat = ivr_repeat or 3;
timeout = timeout or 30;
self.digit = '';
self.exit = false;
self.break_keys = {};
+ local query_keys = {};
+
for index=1, #keys do
- self.break_keys[keys[index]] = true;
+ if type(keys[index]) == 'table' then
+ if tostring(keys[index].key) ~= '' then
+ table.insert(query_keys, keys[index].key);
+ end
+ self.break_keys[keys[index].key] = keys[index];
+ else
+ if tostring(keys[index]) ~= '' then
+ table.insert(query_keys, keys[index]);
+ end
+ self.break_keys[keys[index]] = true;
+ end
end
global_callback:callback('dtmf', 'ivr_ivr_phrase', self.ivr_phrase_dtmf, self);
-
+ local continue = true;
for index=0, ivr_repeat do
- self.caller.session:sayPhrase(phrase, table.concat(keys, ':'));
- self.caller:sleep(timeout * 1000);
- if self.exit then
+ continue = self:ivr_break() or self.caller.session:sayPhrase(phrase, phrase_data or table.concat(query_keys, ':'));
+ continue = self:ivr_break() or self.caller:sleep(timeout * 1000);
+
+ if self:ivr_break() then
break;
end
end
global_callback:callback_unset('dtmf', 'ivr_ivr_phrase');
+ if type(self.break_keys[self.digit]) == 'table' then
+ return self.digit, self.break_keys[self.digit];
+ end
+
return self.digit;
end
@@ -57,17 +79,17 @@ function Ivr.ivr_phrase_dtmf(self, dtmf)
end
-function Ivr.read_phrase(self, phrase, phrase_data, max_keys, min_keys, timeout, enter_key)
+function Ivr.read_phrase(self, phrase, phrase_data, max_keys, min_keys, timeout, key_terminator)
self.max_keys = max_keys or 64;
self.min_keys = min_keys or 1;
- self.enter_key = enter_key or '#';
+ self.key_terminator = key_terminator or '#';
self.digits = '';
self.exit = false;
timeout = timeout or 30;
global_callback:callback('dtmf', 'ivr_read_phrase', self.read_phrase_dtmf, self);
- self.caller.session:sayPhrase(phrase, phrase_data or enter_key or '');
- self.caller:sleep(timeout * 1000);
+ local continue = self:ivr_break() or self.caller.session:sayPhrase(phrase, phrase_data or key_terminator or '');
+ continue = self:ivr_break() or self.caller:sleep(timeout * 1000);
global_callback:callback_unset('dtmf', 'ivr_read_phrase');
return self.digits;
@@ -79,7 +101,7 @@ function Ivr.read_phrase_dtmf(self, dtmf)
return nil;
end
- if self.enter_key == dtmf.digit then
+ if self.key_terminator == dtmf.digit then
self.exit = true;
return false;
end
@@ -88,32 +110,63 @@ function Ivr.read_phrase_dtmf(self, dtmf)
end
-function Ivr.check_pin(self, phrase, pin, pin_timeout, pin_repeat, key_enter)
+function Ivr.check_pin(self, phrase_enter, phrase_incorrect, pin, pin_timeout, pin_repeat, key_terminator)
if not pin then
return nil;
end
+ self.exit = false;
pin_timeout = pin_timeout or 30;
pin_repeat = pin_repeat or 3;
- key_enter = key_enter or '#';
+ key_terminator = key_terminator or '#';
local digits = '';
for i = 1, pin_repeat do
if digits == pin then
self.caller:send_display('PIN: OK');
- break
+ break;
elseif digits ~= "" then
self.caller:send_display('PIN: wrong');
+ self.caller.session:sayPhrase(phrase_incorrect, '');
+ elseif self:ivr_break() then
+ break;
end
self.caller:send_display('Enter PIN');
- digits = ivr:read_phrase(phrase, nil, 0, pin:len() + 1, pin_timeout, key_enter);
+ digits = ivr:read_phrase(phrase_enter, nil, 0, pin:len() + 1, pin_timeout, key_terminator);
end
if digits ~= pin then
self.caller:send_display('PIN: wrong');
+ self.caller.session:sayPhrase(phrase_incorrect, '');
return false
end
self.caller:send_display('PIN: OK');
return true;
end
+
+
+function Ivr.record(self, file_name, beep, phrase_record, phrase_too_short, record_length_max, record_length_min, record_repeat, silence_level, silence_lenght_abort)
+ local duration = nil;
+ for index=1, record_repeat do
+ if (duration and duration >= record_length_min) or not self.caller:ready() then
+ break;
+ elseif duration then
+ self.caller:send_display('Recording too short');
+ if phrase_too_short then
+ self.caller.session:sayPhrase(phrase_too_short);
+ end
+ end
+ if phrase_record then
+ self.caller.session:sayPhrase(phrase_record);
+ end
+ if beep then
+ self.caller:playback(beep);
+ end
+ self.caller:send_display('Recording...');
+ local result = self.caller.session:recordFile(file_name, record_length_max, silence_level, silence_lenght_abort);
+ duration = self.caller:to_i('record_seconds');
+ end
+
+ return duration or 0;
+end