[Freeswitch-svn] [commit] r5687 - freeswitch/trunk/scripts/contrib/trixter
Freeswitch SVN
trixter at freeswitch.org
Fri Sep 7 05:34:27 EDT 2007
Author: trixter
Date: Fri Sep 7 05:34:27 2007
New Revision: 5687
Added:
freeswitch/trunk/scripts/contrib/trixter/disa.js
Log:
DISA app
Added: freeswitch/trunk/scripts/contrib/trixter/disa.js
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/trixter/disa.js Fri Sep 7 05:34:27 2007
@@ -0,0 +1,202 @@
+// -*- mode:c; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil; -*-
+// DISA (Direct Inward System Access) script
+// basically it provides a dialtone for callers, who can then call out
+// on presumably a cheaper rate plan, in addition providing a unified
+// caller id presence for return calls
+//
+// Written by Bret McDanel <trixter AT 0xdecafbad.com>
+//
+// Additions/Updates by
+//
+//
+// This file is licensed under the Trixter General License (TGL) v 1.0
+// You may use this program however you want, so long as you follow the
+// below terms:
+// 1. You may not make this program GNU Public Licensed (GPL)
+// 2. Copyright notices must remain intact
+// 3. You acknowledge this program is useful for nothing, and that if you
+// do use it in any way any authors, contributing or original are not
+// held liable for any losses or damage that results from using it
+// 4. Terms 1 and 2 may not be altered and must be distributed in future copies
+// 5. At your option you may remove condition 3 providing that you assume responsibility
+// from that point on
+
+
+// START OF CONFIGURATION SECTION
+
+var pinmax = 10; // maximum length of a pin - 0 disables pins
+var pinwait = 5000; // ms to wait for pin entry
+var pinterm = "#"; // terminator char for pin entry - cant be part of the pin number
+var pinmaxtry = 3; // maximum number of times to ask for a pin before giving up
+
+var nummaxlen = 11; // maximum length of a dialed numner
+var numterm = "#"; // terminator for destination number
+var numwait = 5000; // ms for them to enter the destination number
+
+var dialprefix = "sofia/default/"; // prefix for outbound calls
+var timeout = 60; // outbound calling timeout in seconds
+
+
+var CLID_name = "The Omega Corporation"; // will use inbound caller's info if commented
+ // if you dont know who this is, watch more
+ // monty python
+var CLID_num = "18005551212"; // will use inbound caller's info if commented
+
+// Sound files that are required - if they are commented they will be skipped
+var snd_prefix = "/sounds"; // sound directory prefix
+var snd_getpin = "get-pin.raw"; // prompt asking for their pin number
+ // cannot be commented - disable by seeing pinmax=0
+var snd_blacklisted = "blacklisted.raw"; // inform them to go away
+var snd_pinfail = "bad-pin.raw"; // sound file to play when they enter a bad pin
+var snd_pinbye = "goodbye.raw"; // when they exhausted pin attempts and didnt auth
+var snd_getdest = "enternum.raw"; // "enter the telephone number you wish to call"
+
+
+// this is the regexps of caller id information that is blacklisted
+// dont forget that Javascript/ECMAScript requires you to escape \ so use \\
+// in regexps
+blacklisted = new Array (new RegExp("^1900\\d{7}$"), // US/CA premium numbers
+ new RegExp("^1710\\d{7}$") // US Government DARPA network
+ );
+
+
+// this is the regexps of automatically authenticated callers
+whitelisted = new Array (new RegExp("^1337$") // they are elite!
+ );
+
+// Array of PINs for access, in this case an account number would amount to a
+// 'secondary pin' although most likely more well known. This information could
+// be obtained from a DB or HTTP resource instead, but in a simple example that is
+// overkill - fetchURLHash for example returns an array so it makes it easy to replace
+pins = new Array ("1234", // Alice
+ "5678" // Bob
+ );
+
+
+
+
+// END OF CONFIGURATION SECTION
+
+
+
+// This function matches session.caller_id_num against an array of RegExps that is passed
+// and returns a boolean determining if there was a match, useful for whitelist/blacklisting
+function CIDMatch(regexps)
+{
+ if(typeof regexps != "undefined") {
+ for (var i=0; i<regexps.length; i++) {
+ if(arrMatch = regexps[i].exec(session.caller_id_number)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+
+// this function strips a listed character out of a string
+function removeChr(str,chr)
+{
+ var newStr = "";
+
+ for(var i=0;i<str.length;i++) {
+ if(str.substr(i,1) != chr) { newStr += str.substr(i,1); }
+ }
+
+ return newStr;
+}
+
+
+// this is the dtmf callback function - in a nice generic way
+function main_cb(type,digits,args)
+{
+ if(type == "dtmf") {
+ if(digits!='false') { return digits; }
+ return false; // stop playback if any
+ }
+}
+
+
+
+
+
+// MAIN PROGRAM ENTRY POINT
+
+if(CIDMatch(blacklisted)) {
+ if(typeof snd_blacklisted != "undefined") {
+ session.streamFile(snd_blacklsited);
+ }
+ console_log(session.caller_id_num + " is blacklisted\n");
+ exit();
+}
+
+session.answer();
+
+if(!CIDMatch(whitelisted)) {
+ // Get a pin number
+ if(pinmax > 0) {
+ var isAuthed=false;
+ for(var curpintry=0; isAuthed == false && curpintry < pinmaxtry; curpintry++) {
+ session.flushDigits(); // clear out input buffers
+ if((pin=session.streamFile(snd_getpin,main_cb,""))==false) {
+ pin=session.getDigits(pinmax,pinterm,pinwait);
+ } else {
+ pin+=session.getDigits(pinmax-1,pinterm,pinwait);
+ }
+
+ pin = removeChr(pin,pinterm); // make sure the didnt enter it during the prompt
+
+ if(pin != "" && pin != "false") {
+ for (var i=0;i<pins.length && isAuthed==false;i++) {
+ if(pins[i] == pin) {
+ console_log("checking pin against " + pins[i] + "\n");
+ isAuthed=true;
+ }
+ }
+ }
+
+ if(isAuthed == false) {
+ if(typeof snd_pinfail != "undefined") {
+ session.streamFile(snd_pinfail);
+ }
+ }
+
+ }
+
+ if(isAuthed == false) {
+ if(typeof snd_pinbye != "undefined") {
+ session.streamFile(snd_pinbye);
+ }
+ console_log(session.caller_id_num + " failed to authenticate\n");
+ exit();
+ }
+ }
+}
+
+
+// there should probably be better error checking here
+// if the number doesnt work ask to get a new one
+// if the rmeote party hangs up possibly allow the caller to call someone else
+// but I got bored with this and decided it was good enough for now
+
+// Get destination number
+session.flushDigits();
+if((destnum=session.streamFile(snd_getdest,main_cb,""))==false) {
+ destnum=session.getDigits(nummaxlen,numterm,numwait);
+} else {
+ destnum+=session.getDigits(nummaxlen-1,numterm,numwait);
+}
+destnum = removeChr(destnum,numterm);
+
+if(destnum.length>0) {
+ if(typeof CLID_name != "undefined") {
+ session.setVariable("effective_caller_id_name",CLID_name);
+ }
+ if(typeof CLID_num != "undefined") {
+ session.setVariable("effective_caller_id_num",CLID_num);
+ }
+
+ session.originate("",dialprefix+destnum,timeout);
+}
+
+exit();
More information about the Freeswitch-svn
mailing list