diff --git a/scripts/aadir/README b/scripts/aadir/README new file mode 100644 index 0000000000..b1ccb28679 --- /dev/null +++ b/scripts/aadir/README @@ -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. diff --git a/scripts/aadir/aadir.js b/scripts/aadir/aadir.js new file mode 100644 index 0000000000..0fc26d0322 --- /dev/null +++ b/scripts/aadir/aadir.js @@ -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();