Simple Get Number
A simple application to use the get number action to obtain a number from an answered inbound or outbound call.
A 5 digit number containing only digits 1-6 should be entered. The help digit is set to 7. Once a valid number has been entered it is sent to a page that then reads the entered number back to the caller.
Uses actions:
{
"actions" :
[
{
"get_number":
{
"prompt" :
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "Enter your 5 digit number using digits 1 to 6.
Press 7 to listen to this message again."
}
]
}
},
"digit_count" : 5,
"help_digit" : "7",
"valid_digits" : "123456",
"next_page" :
{
"url" : "ReadEnteredDigits"
}
}
}
],
"token" : "my get number instance id"
}
{
"actions" :
[
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "The number you entered was <say-as interpret-as='characters'>12345</say-as>."
}
]
}
}
]
}
{
[
],
"token" : "Error for Action: xxxx ActionIndex: xxxx Result: xxxx"
}
{
}
Implemented as ASP.Net Web Forms:
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class SimpleGetNumber : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(Request);
if (!ourRequest.IsValid)
{
return;
}
// Setup the actions
List<TelephonyAction> actions = new List<TelephonyAction>();
// Create the get number action
Play prompt = Play.SayText("Enter your 5 digit number using digits 1 to 6. " +
"Press 7 to listen to this message again.");
GetNumber getNumberAction = new GetNumber(prompt);
getNumberAction.DigitCount = 5;
getNumberAction.HelpDigit = '7';
getNumberAction.ValidDigits = "123456";
getNumberAction.NextPage = new WebPageRequest("ReadEnteredDigits.aspx");
actions.Add(getNumberAction);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, "my get number instance id");
ourResponse.ToHttpResponse(Response);
}
}
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class ReadEnteredDigits : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(Request);
if (!ourRequest.IsValid)
{
return;
}
String token = ourRequest.InstanceInfo.Token;
// Get the result of the get_number action
GetNumberResult result = ourRequest.InstanceInfo.GetNumberResult;
String enteredNumber = result.EnteredNumber;
// Setup the actions
List<TelephonyAction> actions = new List<TelephonyAction>();
// Create the play action
Play playNumber = Play.SayText(String.Format(
"The number you entered was <say-as interpret-as='characters'>{0}</say-as>.", enteredNumber));
actions.Add(playNumber);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, token);
ourResponse.ToHttpResponse(Response);
}
}
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class ErrorPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(Request);
if (!ourRequest.IsValid)
{
return;
}
ErrorResult result = ourRequest.InstanceInfo.ErrorResult;
String token = String.Format("Action: {0}\nActionIndex: {1}\nResult: {2}",
result.Action, result.ActionIndex, result.Result);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(null, token);
ourResponse.ToHttpResponse(Response);
}
}
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class FinalPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(Request);
if (!ourRequest.IsValid)
{
return;
}
}
}
Implemented as ASP.Net Web Forms:
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class SimpleGetNumber
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Unpack the request
Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
If Not ourRequest.IsValid Then
Return
End If
' Setup the actions
Dim actions As List(Of TelephonyAction) = New List(Of TelephonyAction)
' Create the get number action
Dim prompt As Play = Play.SayText("Enter your 5 digit number using digits 1 to 6. " + _
"Press 7 to listen to this message again.")
Dim getNumberAction As GetNumber = New GetNumber(prompt)
getNumberAction.DigitCount = 5
getNumberAction.HelpDigit = "7"
getNumberAction.ValidDigits = "123456"
getNumberAction.NextPage = New WebPageRequest("ReadEnteredDigits.aspx")
actions.Add(getNumberAction)
' Respond
Dim ourResponse As TelephonyResponse = New TelephonyResponse(actions, "my get number instance id")
ourResponse.ToHttpResponse(Response)
End Sub
End Class
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class ReadEnteredDigits
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Unpack the request
Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
If Not ourRequest.IsValid Then
Return
End If
Dim token As String = ourRequest.InstanceInfo.Token
' Get the result of the get_number action
Dim result As GetNumberResult = ourRequest.InstanceInfo.ActionResult
Dim enteredNumber As String = result.EnteredNumber
' Setup the actions
Dim actions As List(Of TelephonyAction) = New List(Of TelephonyAction)
' Create the play action
Dim playNumber As Play = Play.SayText(String.Format( _
"The number you entered was <say-as interpret-as="characters">{0}.", enteredNumber))
actions.Add(playNumber)
' Respond
Dim ourResponse As TelephonyResponse = New TelephonyResponse(actions, token)
ourResponse.ToHttpResponse(Response)
End Sub
End Class
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class ErrorPage
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Unpack the request
Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
If Not ourRequest.IsValid Then
Return
End If
Dim result As ErrorResult = ourRequest.InstanceInfo.ErrorResult
Dim token As String = String.Format("Action: {0}\nActionIndex: {1}\nResult: {2}", _
result.Action, result.ActionIndex, result.Result)
' Respond
Dim ourResponse As TelephonyResponse = New TelephonyResponse(token)
ourResponse.ToHttpResponse(Response)
End Sub
End Class
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class FinalPage
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Unpack the request
Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
If Not ourRequest.IsValid Then
Return
End If
End Sub
End Class
Implemented as Java Servlets:
package com.aculab.telephonyrestapi.samples;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import com.aculab.telephonyrestapi.*;
public class SimpleGetNumber extends HttpServlet
{
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
handleRequest(request, response);
}
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
handleRequest(request, response);
}
private void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(request);
if (!ourRequest.isValid())
{
return;
}
// Set up the actions
List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
// Create the get number action
Play prompt = Play.sayText("Enter your 5 digit number using digits 1 to 6. " +
"Press 7 to listen to this message again.");
GetNumber getNumberAction = new GetNumber(prompt);
getNumberAction.setDigitCount(5);
getNumberAction.setHelpDigit('7');
getNumberAction.setValidDigits("123456");
getNumberAction.setNextPage(new WebPageRequest("ReadEnteredDigits"));
actions.add(getNumberAction);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, "my get number instance id");
ourResponse.setHttpServletResponse(response);
}
}
package com.aculab.telephonyrestapi.samples;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import com.aculab.telephonyrestapi.*;
public class ReadEnteredDigits extends HttpServlet
{
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
handleRequest(request, response);
}
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
handleRequest(request, response);
}
private void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(request);
if (!ourRequest.isValid())
{
return;
}
String token = ourRequest.getInstanceInfo().getToken();
// Get the result of the get_number action
GetNumberResult result = (GetNumberResult)ourRequest.getInstanceInfo().getActionResult();
String enteredNumber = result.getEnteredNumber();
// Set up the actions
List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
// Create the play action
Play playNumber = Play.sayText(String.format(
"The number you entered was <say-as interpret-as='characters'>%s</say-as>.", enteredNumber));
actions.add(playNumber);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, token);
ourResponse.setHttpServletResponse(response);
}
}
package com.aculab.telephonyrestapi.samples;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.aculab.telephonyrestapi.*;
public class ErrorPage extends HttpServlet
{
private static final long serialVersionUID = -4842873371047361437L;
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
handleRequest(request, response);
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
handleRequest(request, response);
}
private void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(request);
if (!ourRequest.isValid())
{
return;
}
ErrorResult result = ourRequest.getInstanceInfo().getErrorResult();
String token = String.format("Action: %s\nActionIndex: %d\nResult: %s", result.getAction(), result.getActionIndex(), result.getResult());
// Respond
List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
TelephonyResponse ourResponse = new TelephonyResponse(actions, token);
ourResponse.setHttpServletResponse(response);
}
}
package com.aculab.telephonyrestapi.samples;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import com.aculab.telephonyrestapi.*;
public class FinalPage extends HttpServlet
{
private static final long serialVersionUID = 5940620014313056844L;
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
handleRequest(request, response);
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
handleRequest(request, response);
}
private void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(request);
if (!ourRequest.isValid())
{
return;
}
}
}
Implemented using a wrapper for Python's wsgiref.simple_server.
For the purposes of this sample, the first page is first_page, the final page is final_page and the error page is error_page.
The application base class.
from aculab.telephony_rest_api import Play
class ApplicationBase:
def __init__(self, exit=None):
self.exit = exit or [self.exit]
def exit(self):
pass
def error_page(self, my_actions, query_info):
try:
error_result = query_info.ErrorResult
action = error_result.get('action', 'none')
print("\nError {0} : {1}\n".format(action, error_result['result']))
my_actions.add(Play(text_to_say='I encountered an error.'))
except Exception as exc:
print("Error page exception: {0}".format(exc))
return True
def final_page(self, my_actions, query_info):
try:
tcall = query_info.ThisCall
if tcall:
print("This call ID : {0}".format(tcall.get('call_id')))
print("This call duration : {0}".format(tcall.get('seconds_call_duration')))
self.exit[0]()
except Exception as exc:
print("Final page exception: {0}".format(exc))
return True
def unknown_page(self, my_actions, query_info):
try:
my_actions.add(Play(text_to_say='I find myself on an unknown page.'))
except Exception as exc:
print("Unknown page exception: {0}".format(exc))
return True
The application code.
import sys, os
sys.path.append(os.path.abspath('../..'))
# import the wrappers for the REST API, these are used to create and send tasks
from aculab.telephony_rest_api import *
from aculab.simple_server import *
from aculab.base_application import ApplicationBase
class Application(ApplicationBase):
def __init__(self):
ApplicationBase.__init__(self)
def responder(self, query, start_response):
query_info = RESTQuery(query)
page = query_info.Page
my_actions = Actions(token='get number sample')
# on your inbound service, set the first page entry to point to this page
# e.g., http://<ip address>:<port>/first_page
if 'first_page' == page:
# configure tasks
my_number = GetNumber()
my_number.set_digit_count(5)
my_number.set_help_digit('7')
my_number.set_valid_digits('123456')
play_action = Play(text_to_say=('Please enter your five digit number, '
'using the digits one to six. '
'Press 7 to listen to this message again.'),
tts_voice='English US Male Polly Joey')
my_number.on_prompt_play(play_action)
my_number.set_next_page(next_page=WebPage(url='read_entered_digits'))
my_actions.add(my_number)
elif 'read_entered_digits' == page:
action_result = query_info.ActionResult
digits = action_result['result']['entered_number']
print("Digits entered: {0}".format(digits))
my_actions.add(Play(text_to_say="You entered, <say-as interpret-as='characters'>{0}</say-as>".format(digits)))
elif 'final_page' == page:
if self.final_page(my_actions, query_info) is False:
return None
elif 'error_page' == page:
if self.error_page(my_actions, query_info) is False:
return None
else:
if self.unknown_page(my_actions, query_info) is False:
return None
response_body = my_actions.get_json()
response_headers = [('Content-Type', 'application/json; charset=utf-8'), ('Content-Length', str(len(response_body)))]
start_response('200 OK', response_headers)
return [response_body]
if __name__ == "__main__":
application = Application()
# Set the host and port you want to use in the rest_simple_server.py file.
# To use SSL also set the key and certificate file.
ss = SimpleServer(application, simple_server_host, simple_server_port, simple_server_keyfile, simple_server_certfile)
ss.start()
print("Hit ctl-break to quit.")
declare(encoding='UTF-8');
spl_autoload_register();
header("Content-Type: application/json; charset=UTF-8");
use \Aculab\TelephonyRestAPI\Actions;
use \Aculab\TelephonyRestAPI\Play;
use \Aculab\TelephonyRestAPI\GetNumber;
$response = new Actions();
$response->setToken('my get number instance id');
// Create the get number action
$prompt = Play::sayText("Enter your 5 digit number using digits 1 to 6. " .
"Press 7 to listen to this message again."
);
$getNumberAction = new GetNumber($prompt);
$getNumberAction->setDigitCount(5);
$getNumberAction->setHelpDigit('7');
$getNumberAction->setValidDigits("123456");
$getNumberAction->setNextPage("ReadEnteredDigits.php");
$response->add($getNumberAction);
print $response;
declare(encoding='UTF-8');
spl_autoload_register();
header("Content-Type: application/json; charset=UTF-8");
use \Aculab\TelephonyRestAPI\InstanceInfo;
use \Aculab\TelephonyRestAPI\Actions;
use \Aculab\TelephonyRestAPI\Play;
$info = InstanceInfo::getInstanceInfo();
$response = new Actions();
$response->setToken($info->getToken());
// Get the result of the get_number action
$result = $info->getActionResult();
$enteredNumber = $result->getEnteredNumber();
// Create the play action
$playNumber = Play::sayText("The number you entered was <say-as interpret-as='characters'>" . $enteredNumber . "</say-as>");
$response->add($playNumber);
print $response;
declare(encoding='UTF-8');
spl_autoload_register();
header("Content-Type: application/json; charset=UTF-8");
$info = \Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
$error = $info->getErrorResult();
$action = $error->getAction();
$desc = $error->getResult();
if (!is_null($action)) {
error_log("Error from action \"$action\" with result:\n$desc\n");
} else {
error_log("Error result:\n$desc\n");
}
$response = new \Aculab\TelephonyRestAPI\Actions();
$response->setToken('Error');
$play = new \Aculab\TelephonyRestAPI\Play();
$play->addText('An error has occurred.');
$response->add($play);
print $response;
declare(encoding='UTF-8');
spl_autoload_register();
header("Content-Type: application/json; charset=UTF-8");
$info = \Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
$call = $info->getThisCallInfo();
$callid = $call->getCallId();
$duration = $call->getSecondsCallDuration();
error_log("This all id: $callid\nThis call duration: $duration\n");
print '';