提交 02049440 authored 作者: Nik Martin's avatar Nik Martin

New and improved Dial By Name Directory, includes an actual helpful README, …

New and improved Dial By Name Directory, includes an actual helpful README,  example usage, and a generic phrase macro that uses stock FreeSWITCH IVR prompts.  Refactored about 60 lines of code out of the original aadir.js, added comments and debugging.

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk/scripts/contrib@13072 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 73688467
Dial By Name Directory
Nik Martin
For support, contact me at freeswitch@servercorps.com
=======================
Nostly From the Original Code:
Original Code Author: John Wehle
Date: November 6, 2008
Copyright (c) 2008 Feith Systems and Software, Inc.
All Rights Reserved
=======================
If the prior author's claimed copyright is infringed by the one I claim we'll
work it out, BUT I prefer a much looser license:
==============================================================
Copyright (c) 2009 Nik Martin
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
The original author of this work, Nik Martin, must be credited
as the original author of this work.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
==============================================================
dial_by_name_directory.xml is a phrase macro for the beginning of the directory app.
dial_by_name_directory.js is the directory app itself.
Place dial_by_name_directory somewhere in conf/lang/en/ maybe in a folder named directory?
edit en.xml in conf/lang/en to include the directory/ directory (uh-oh, bad name)
drop dial_by_name_directpry.js in scripts/
in the dial plan, execute the dial by name directpry like:
<extension name="dial_by_name">
<condition field="destination_number" expression="^6000$">
<action application="javascript" data="dial_by_name_directory.js" />
</condition>
</extension>
or, from an IVR:
<entry action="menu-exec-app" digits="9" param="javascript dial_by_name_directory.js"/>
\ No newline at end of file
/**
=======================
Mostly From the Original Code aadir.js:
Original Code Author: John Wehle
Date: November 6, 2008
Copyright (c) 2008 Feith Systems and Software, Inc.
All Rights Reserved
=======================
If the prior author's claimed copyright is infringed by the one I claim we'll
work it out, BUT I prefer a much looser MIT license:
==============================================================
Copyright (c) 2009 Nik Martin
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
The original author of this work, Nik Martin, must be credited
as the original author of this work.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
==============================================================
*/
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 translations = [ "0",
"QZ", "ABC", "DEF",
"GHI", "JKL", "MNO",
"PQRS", "TUV", "WXYZ" ];
var extension = "";
var dtmf_digits = "";
/**
* Build an array of [last_namefirst_name,extension].
* matches will then start at last name and go until
* a unique match emerges:
* martinnik and martinmatt match until the a in matt and i in nik
*
* @return the image at the specified URL
*/
function build_directory_list() {
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();
//clean up the name string, letters and numbers only
name = name.replace (re, "");
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);
//make the name look like LastnameFirstname
name = name.split(" ")[1] + name.split(" ")[0];
directory[i][0] = name;
directory[i][1] = number;
console_log ("debug", directory[i][0] + ":" + directory[i][1] + "\n");
i++;
}
}
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;
//build a regex pattern to match against
pattern += "[" + translations[parseInt (digits[i], 10)] + "]";
console_log("debug", "pattern: " + pattern + "\n");
}
re = new RegExp (pattern, "i");
for (i = 0; i < directory.length; i++)
if (directory[i][0].search (re) != -1) {
if (! isNaN (parseInt (match, 10)))
return "";
match = directory[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 ("dial_by_name_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;
console_log ("debug", "choice: " + choice + "\n");
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");
console_log("info", "loading dial-by-name directory\n");
build_directory_list();
dtmf_digits = "";
session.flushDigits ();
choice = directory_prompt ();
if (! session.ready ()) {
session.hangup();
exit();
}
//this must try to determine if the extension is a number, but it seems that
//non-integer extension are ok in FS. Leftover from original code
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 features");
exit();
\ No newline at end of file
<?xml version="1.0" encoding="Windows-1252"?>
<include><!--This line will be ignored it's here to validate the xml and is optional -->
<macro name="dial_by_name_directory">
<input pattern="^(.*)$">
<match>
<action function="play-file" data="ivr/ivr-use_telephone_keypad.wav"/>
<!--<action function="say" data="$1" method="pronounced" type="name_spelled"/>-->
<action function="play-file" data="ivr/ivr-spell_name.wav"/>
<action function="play-file" data="ivr/ivr-last_name_first.wav"/>
</match>
</input>
</macro>
</include><!--This line will be ignored it's here to validate the xml and is optional -->
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论