Telephone system:Betamax credit
This collection of scripts will allow the user to hear the credit available on the Betamax services (VoipBuster, Intervoip, etc.), when dialing 1244 (the number for prepaid services as defined by Ministry of Economic affairs).
sounds
This system uses custom sounds (quick and dirty remix), by using the original FreeSWITCH v10.1.21 32kHz sounds (base256 dir), licensed under the Creative Commons Attribution 3.0 Unported License (CC BY 3.0), put in the sounds/en/us/callie/custom/ directory:
file | description | source |
---|---|---|
cell.wav | used to pronounce 'cell' for cellphone type credit | cellulose.wav |
euro.wav | used to pronounce 'euro' (this should be part of FreeSWITCH anyway) | mural.wav |
freedays.wav | used to pronounce 'freedays' | freedom.wav, Saturday.wav |
landline.wav | used to pronounce 'landline' for landline type credit | Orlando.wav, breadline.wav |
Download the sounds here
The system recognizes euro (eur, euro, €, €) and dollar (usd, dollar, $). Unfortunately, currently the script only does English pronunciation and grammar.
credit.php
Todo.. (I need to clean this)
This script will take the 'account' parameter to log in to the appropriate page, and returns the information in the following format:
[{ "currency": "€", "credit": "0.71", "freedays": "0" }]
Note that 'freedays' is only applicable to VoipBuster, and therefore optional
credit.js
This is the script that you have to customize yourself.
include("voipcredit.js"); if (session.ready()) { session.preAnswer(); var voipCredit = new VoipCredit(); // This will add the accounts which loads the php script voipCredit.setAccounts( { "voipbuster": VoipCredit.LANDLINE, "intervoip": VoipCredit.CELL } ); // will say "One moment, please" voipCredit.checkAll(); // will say "The account balance is.." // followed by "x euro/dollar and x cents (and x freedays, if applicable)", optionally with the account type description, see table // followed by "next", followed by the next account, if any voipCredit.speakAll(); };
You can use the following types in setAccounts():
type | pronunciation |
---|---|
VoipCredit.UNKNOWN | no pronunciation |
VoipCredit.LANDLINE | "at landline" |
VoipCredit.CELL | "at cell" |
"abc" (string) | "at A, Bee, Cee" |
"ABC" (string in caps) | "at alpha, bravo, charlie" |
1 (unquoted) | "at account number one" |
"1st" (quoted) | "at first account number" |
voipcredit.js
This script is the VoipCredit class used to prepare the accounts, load the information and say the results This class needs the JSON parser and uses the fetchUrl (javascript curl) feature.
// include the minified JSON parser include("json2_min.js"); function VoipCredit() { // Constructor this.accounts = []; this.succeeded = false; }; VoipCredit.UNKNOWN = false; VoipCredit.LANDLINE = "landline"; VoipCredit.CELL = "cell"; VoipCredit.prototype.setAccounts = function( _accounts ) { // Clear array this.accounts.splice( 0, this.accounts.length ); for ( var idx in _accounts ) this.addAccount( idx, _accounts[idx] ); }; VoipCredit.prototype.addAccount = function( _provider, _type ) { // Add account this.accounts[this.accounts.length] = { "provider" : _provider, "uri" : "https://ackspace.nl/credit.php?field=json&account=" + _provider, "type" : _type, "loaded" : false, "credit" : {} }; }; VoipCredit.prototype.checkAll = function() { // Say: One moment please.. session.streamFile("ivr/ivr-one_moment_please.wav", "", null, ""); this.succeeded = true; // Check all accounts for ( var idx = 0; idx < this.accounts.length; idx++ ) this.succeeded |= this.check( this.accounts[idx] ); }; VoipCredit.prototype.check = function( _account ) { var credit = fetchUrl( _account.uri ); if (credit === false) { console_log( 3, "could not fetch credit info for " + _account.provider ); return false; } else { credit = JSON.parse( credit ); // Make sure to get only the first entry of the credit info if ( credit.length ) credit = credit[0]; _account.credit = credit; _account.loaded = true; return true; } }; VoipCredit.prototype.speakAll = function() { // Say all credit info available if ( !this.succeeded ) { session.streamFile( "zrtp/zrtp-status_error.wav", "", null, "" ); return false; } session.streamFile( "ivr/ivr-account_balance_is.wav", "", null, "" ); for ( var idx = 0; idx < this.accounts.length; idx++ ) { if ( !this.accounts[idx].loaded ) continue; if ( idx ) session.streamFile( "voicemail/vm-next.wav", "", null, "" ); this.speak( this.accounts[idx] ); } }; VoipCredit.prototype.speak = function( _account ) { if ( !_account.hasOwnProperty( "credit" ) && !_account.credit.hasOwnProperty( "credit" ) ) return; session.execute( "say", "en number pronounced " + parseInt( _account.credit.credit ) ); switch ( _account.credit.currency.toLowerCase() ) { case "€": case "eur": case "euro": case "€": session.streamFile("custom/euro.wav", "", null, ""); break; case "$": case "usd": case "dollar": session.streamFile("currency/dollar.wav", "", null, ""); break; } session.streamFile("currency/and.wav", "", null, ""); session.execute( "say", "en number pronounced " + parseInt( (parseFloat( _account.credit.credit ) % 1) * 100 ) ); session.streamFile("currency/cents.wav", "", null, ""); if ( _account.credit.hasOwnProperty( "freedays" ) ) { session.streamFile("currency/and.wav", "", null, ""); session.execute( "say", "en number pronounced " + _account.credit.freedays ); session.streamFile("custom/freedays.wav", "", null, ""); } if ( _account.hasOwnProperty( "type" ) && _account.type !== false ) { // for //session.streamFile( "digits/4.wav", "", null, "" ); // at session.streamFile( "ascii/64.wav", "", null, "" ); switch ( _account.type ) { case "landline": case VoipCredit.LANDLINE: session.streamFile("custom/landline.wav", "", null, ""); break; case "cell": case VoipCredit.CELL: session.streamFile( "custom/cell.wav", "", null, "" ); break; default: // Not a predefined type, pronounce it if ( (typeof _account.type) == "number" ) { session.streamFile( "ivr/ivr-account_number.wav", "", null, "" ); session.execute( "say", "en number pronounced " + _account.type ); } else if ( parseInt( _account.type )) { session.execute( "say", "en number counted " + parseInt( _account.type )); session.streamFile( "ivr/ivr-account_number.wav", "", null, "" ); } else if ( _account.type.toString().toUpperCase() === _account.type.toString() ) session.execute( "say", "en name_phonetic pronounced " + _account.type ); else session.execute( "say", "en name_spelled pronounced " + _account.type ); break; } } session.sleep( 500 ); };
json2.js
This is a public domain JSON parser, created by Douglas Crockford You can find it here
Advised is to use the minified version (You can do this online here)
dialplan
number 1244 is the Dutch standardized number for prepaid services
<extension name="credit"> <condition field="destination_number" expression="^1244$"/> <condition field="${module_exists(mod_spidermonkey)}" expression="true"> <action application="answer"/> <action application="sleep" data="500"/> <action application="javascript" data="credit.js"/> </condition> </extension>
todo
- add option to skip the 'freedays' info
- use grammar provided by FreeSWITCH to provide correct pronunciation for other languages