FSSCRIPTS-9 thanks john, sound files will appear by friday for this
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10777 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
3410c58a2e
commit
2d1d3d98ed
|
@ -0,0 +1,6 @@
|
|||
This directory contains a javascript auto attendant which queries
|
||||
FreeSWITCH for name / extension information rather than using
|
||||
hardcoded values. It requires a wave file which says:
|
||||
|
||||
Please spell the name of the person using your telephone keypad
|
||||
last name first. Press 1 for Q or Z.
|
|
@ -0,0 +1,242 @@
|
|||
/*
|
||||
* 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.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();
|
Loading…
Reference in New Issue