forked from Mirrors/freeswitch
d4f2046712
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11505 d0543943-73ff-0310-b7d9-9358b9ac24b2
243 lines
5.0 KiB
JavaScript
243 lines
5.0 KiB
JavaScript
/*
|
|
* File: aadir.js
|
|
* Purpose: Auto Attendant directory.
|
|
* Machine: OS:
|
|
* Author: John Wehle Date: November 6, 2008
|
|
*
|
|
* Copyright (c) 2008 Feith Systems and Software, Inc.
|
|
* All Rights Reserved
|
|
*/
|
|
|
|
|
|
var digitTimeOut = 3000;
|
|
var interDigitTimeOut = 1000;
|
|
var absoluteTimeOut = 10000;
|
|
|
|
|
|
var base_dir = session.getVariable ("base_dir");
|
|
var domain = session.getVariable ("domain");
|
|
var voicemail_path = base_dir + "/storage/voicemail/default/" + domain + "/";
|
|
|
|
var file_exts = [ ".wav", ".mp3" ];
|
|
|
|
var extRE = /^1[0-9][0-9][0-9]$/g;
|
|
var operator = "operator";
|
|
|
|
var directory;
|
|
var directory_camelcase;
|
|
|
|
var translations = [ "0",
|
|
"QZ", "ABC", "DEF",
|
|
"GHI", "JKL", "MNO",
|
|
"PQRS", "TUV", "WXYZ" ];
|
|
|
|
var extension = "";
|
|
var dtmf_digits = "";
|
|
|
|
|
|
function load_directory ()
|
|
{
|
|
var i;
|
|
var name;
|
|
var number;
|
|
|
|
var dir = apiExecute ("xml_locate", "directory domain name " + domain);
|
|
var re = /\s+$/g;
|
|
var length = dir.search (re);
|
|
|
|
if (length == -1)
|
|
length = dir.length;
|
|
|
|
dir = dir.substring (0, length);
|
|
|
|
var xdir = new XML (dir);
|
|
|
|
directory = new Array ();
|
|
i = 0;
|
|
|
|
re = /[^A-Z0-9\s]/gi;
|
|
|
|
for each (var variables in xdir.groups.group.users.user.variables) {
|
|
name = "";
|
|
number = "";
|
|
|
|
for each (variable in variables.variable) {
|
|
if (variable.@name.toString() == "effective_caller_id_name")
|
|
name = variable.@value.toString();
|
|
if (variable.@name.toString() == "effective_caller_id_number")
|
|
number = variable.@value.toString();
|
|
}
|
|
|
|
if (name.length == 0 || number.length == 0 || number.search (extRE) == -1)
|
|
continue;
|
|
|
|
directory[i] = new Array (2);
|
|
directory[i][0] = name.replace (re, "");
|
|
directory[i][1] = number;
|
|
|
|
i++;
|
|
}
|
|
}
|
|
|
|
|
|
function build_camelcase_directory ()
|
|
{
|
|
var i;
|
|
var fname;
|
|
var lname;
|
|
var fre = /^[A-Z0-9]+/gi;
|
|
var lre = /[A-Z0-9]+$/gi;
|
|
|
|
directory_camelcase = new Array (directory.length);
|
|
|
|
for (i = 0; i < directory.length; i++) {
|
|
directory_camelcase[i] = new Array (2);
|
|
|
|
directory_camelcase[i][0] = "";
|
|
directory_camelcase[i][1] = 0;
|
|
|
|
fname = directory[i][0].match (fre);
|
|
lname = directory[i][0].match (lre);
|
|
if (fname.length != 1 || lname.length != 1) {
|
|
console_log ("err", "Can't parse " + directory[i][0] + " for directory\n");
|
|
continue;
|
|
}
|
|
|
|
directory_camelcase[i][0] = lname[0] + fname[0];
|
|
directory_camelcase[i][1] = directory[i][1];
|
|
}
|
|
}
|
|
|
|
|
|
function directory_lookup (digits)
|
|
{
|
|
var i;
|
|
var match = "";
|
|
var pattern = "^";
|
|
var re;
|
|
|
|
if (digits.length && digits[0] == 0)
|
|
return 0;
|
|
|
|
for (i = 0; i < digits.length; i++) {
|
|
if (isNaN (parseInt (digits[i], 10)))
|
|
return -1;
|
|
pattern += "[" + translations[parseInt (digits[i], 10)] + "]";
|
|
}
|
|
|
|
re = new RegExp (pattern, "i");
|
|
|
|
for (i = 0; i < directory_camelcase.length; i++)
|
|
if (directory_camelcase[i][0].search (re) != -1) {
|
|
if (! isNaN (parseInt (match, 10)))
|
|
return "";
|
|
match = directory_camelcase[i][1];
|
|
}
|
|
|
|
if (isNaN (parseInt (match, 10)))
|
|
return -1;
|
|
|
|
return match;
|
|
}
|
|
|
|
|
|
function on_dtmf (session, type, obj, arg)
|
|
{
|
|
|
|
if (type == "dtmf") {
|
|
dtmf_digits += obj.digit;
|
|
extension = directory_lookup (dtmf_digits)
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
function directory_prompt ()
|
|
{
|
|
var choice;
|
|
var index;
|
|
var repeat;
|
|
|
|
extension = "";
|
|
choice = "";
|
|
repeat = 0;
|
|
|
|
while (session.ready () && repeat < 3) {
|
|
|
|
/* play phrase - if digit keyed while playing callback will catch them*/
|
|
session.sayPhrase ("feith_aa_directory", "#", "", on_dtmf, "");
|
|
|
|
choice = dtmf_digits;
|
|
|
|
while ( isNaN (parseInt (extension, 10)) ) {
|
|
if (! session.ready ())
|
|
return "";
|
|
|
|
dtmf_digits = session.getDigits (1, '#', digitTimeOut,
|
|
interDigitTimeOut, absoluteTimeOut);
|
|
choice += dtmf_digits;
|
|
|
|
extension = directory_lookup (choice);
|
|
}
|
|
|
|
if (parseInt (extension, 10) >= 0)
|
|
break;
|
|
|
|
session.sayPhrase ("voicemail_invalid_extension", "#", "", on_dtmf, "");
|
|
|
|
dtmf_digits = "";
|
|
extension = "";
|
|
choice = "";
|
|
repeat++;
|
|
|
|
session.flushDigits ();
|
|
}
|
|
|
|
return extension;
|
|
}
|
|
|
|
|
|
var choice = "";
|
|
var fd;
|
|
var i;
|
|
var recorded_name;
|
|
|
|
session.answer ();
|
|
|
|
session.execute("sleep", "1000");
|
|
|
|
load_directory ();
|
|
|
|
build_camelcase_directory ();
|
|
|
|
dtmf_digits = "";
|
|
session.flushDigits ();
|
|
choice = directory_prompt ();
|
|
|
|
if (! session.ready ()) {
|
|
session.hangup();
|
|
exit();
|
|
}
|
|
|
|
if ( isNaN (parseInt (choice, 10)) || parseInt (choice, 10) <= 0) {
|
|
session.execute ("transfer", operator + " XML default");
|
|
exit();
|
|
}
|
|
|
|
for (i = 0; i < file_exts.length; i++) {
|
|
recorded_name = voicemail_path + choice + "/recorded_name" + file_exts[i];
|
|
fd = new File (recorded_name);
|
|
if (fd.exists) {
|
|
session.streamFile (recorded_name);
|
|
break;
|
|
}
|
|
}
|
|
|
|
session.execute ("phrase", "spell," + choice);
|
|
|
|
session.execute ("transfer", choice + " XML default");
|
|
|
|
exit();
|