Telephone system:Betamax credit

From Hackerspace ACKspace
Jump to: navigation, search

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 "&euro;":
	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