Simple Connect To Conference
A simple inbound application that connects an answered inbound call to a named conference.
This application uses the connect to conference action to make an outbound call to a conference named "ATestConference". It sets a number of parameters that control how the call participates in the conference and what media is played to the conference before connecting to the inbound call.
Some audio (holdmusic.wav) is played to the inbound call until the outbound call is answered. Once answered and until the conference starts it is played some different audio (whileconfstopped.wav).
This sample requires one Extra Channel. Please configure your inbound service accordingly.
It also requires the wav files holdmusic.wav and whileconfstopped.wav to be available in the cloud media store.
Uses actions:
{
"actions" :
[
{
"connect_to_conference":
{
"name" : "ATestConference",
"hold_media":
{
"play" :
{
"play_list" :
[
{
"file_to_play" : "holdmusic.wav"
}
]
}
},
"conference_participant" :
{
"talker" : true,
"start_on_entry" : true,
"destroy_on_exit" : false,
"beep_on_entry" : false,
"exit_digit" : "#",
"mute_digit" : "1",
"unmute_digit" : "2",
"while_stopped_media" :
{
"play" :
{
"play_list" :
[
{
"file_to_play" : "whileconfstopped.wav"
}
]
}
},
"name" :
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "a member of the committee"
}
]
}
},
"has_joined_message" :
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "has joined the conference"
}
]
}
},
"has_left_message" :
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "has left the conference"
}
]
}
}
},
"next_page" :
{
"url" : "ConnectToConferenceNext"
}
}
},
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "Sorry, I could not connect you to conference A Test Conference. Goodbye."
}
]
}
}
],
"token" : "my connect to conference instance id"
}
{
"actions" :
[
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "You are now out of the conference. Goodbye."
}
]
}
}
],
"token" : "my connect to conference instance id"
}
{
[
],
"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 SimpleConnectToConference : 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 connect to conference action
ConnectToConference connectToConferenceAction = new ConnectToConference("ATestConference");
connectToConferenceAction.HoldMedia = Play.PlayFile("holdmusic.wav");
ConferenceParticipant participant = new ConferenceParticipant();
participant.Talker = true;
participant.StartOnEntry = true;
participant.DestroyOnExit = false;
participant.BeepOnEntry = false;
participant.ExitDigit = '#';
participant.MuteDigit = '1';
participant.UnmuteDigit = '2';
participant.WhileStoppedMedia = Play.PlayFile("whileconfstopped.wav");
participant.Name = Play.SayText("a member of the committee");
participant.HasJoinedMessage = Play.SayText("has joined the conference");
participant.HasLeftMessage = Play.SayText("has left the conference");
connectToConferenceAction.Participant = participant;
connectToConferenceAction.NextPage = new WebPageRequest("ConnectToConferenceNext.aspx");
actions.Add(connectToConferenceAction);
// Add a message to play if the connect doesn't succeed
Play notConnectedMsgAction = Play.SayText("Sorry, I could not connect you to conference A Test Conference. Goodbye.");
actions.Add(notConnectedMsgAction);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, "my connect to conference instance id");
ourResponse.ToHttpResponse(Response);
}
}
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class ConnectToConferenceNext : 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;
// Setup the actions
List<TelephonyAction> actions = new List<TelephonyAction>();
actions.Add(Play.SayText("You are now out of the conference. Goodbye."));
// 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 SimpleConnectToConference
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 connect to conference action
Dim connectToConferenceAction As ConnectToConference = New ConnectToConference("ATestConference")
connectToConferenceAction.HoldMedia = Play.PlayFile("holdmusic.wav")
Dim participant As ConferenceParticipant = New ConferenceParticipant()
participant.Talker = True
participant.StartOnEntry = True
participant.DestroyOnExit = False
participant.BeepOnEntry = False
participant.ExitDigit = "#"
participant.MuteDigit = "1"
participant.UnmuteDigit = "2"
participant.WhileStoppedMedia = Play.PlayFile("whileconfstopped.wav")
participant.Name = Play.SayText("a member of the committee")
participant.HasJoinedMessage = Play.SayText("has joined the conference")
participant.HasLeftMessage = Play.SayText("has left the conference")
connectToConferenceAction.Participant = participant
connectToConferenceAction.NextPage = New WebPageRequest("ConnectToConferenceNext.aspx")
actions.Add(connectToConferenceAction)
' Add a message to play if the connect doesn't succeed
Dim notConnectedMsgAction As Play = Play.SayText("Sorry, I could not connect you to conference A Test Conference. Goodbye.")
actions.Add(notConnectedMsgAction)
' Respond
Dim ourResponse As TelephonyResponse = New TelephonyResponse(actions, "my connect to conference instance id")
ourResponse.ToHttpResponse(Response)
End Sub
End Class
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class ConnectToConferenceNext
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
' Setup the actions
Dim actions As List(Of TelephonyAction) = New List(Of TelephonyAction)
actions.Add(Play.SayText("You are now out of the conference. Goodbye."))
' 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 java.util.ArrayList;
import java.util.List;
import com.aculab.telephonyrestapi.*;
public class SimpleConnectToConference extends HttpServlet
{
@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;
}
// Set up the actions
List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
// Create the connect to conference action
ConnectToConference connectToConferenceAction = new ConnectToConference("ATestConference");
connectToConferenceAction.setHoldMedia(Play.playFile("holdmusic.wav"));
ConferenceParticipant participant = new ConferenceParticipant();
participant.setTalker(true);
participant.setStartOnEntry(true);
participant.setDestroyOnExit(false);
participant.setBeepOnEntry(false);
participant.setExitDigit('#');
participant.setMuteDigit('1');
participant.setUnmuteDigit('2');
participant.setWhileStoppedMedia(Play.playFile("whileconfstopped.wav"));
participant.setName(Play.sayText("a member of the committee"));
participant.setHasJoinedMessage(Play.sayText("has joined the conference"));
participant.setHasLeftMessage(Play.sayText("has left the conference"));
connectToConferenceAction.setParticipant(participant);
connectToConferenceAction.setNextPage(new WebPageRequest("ConnectToConferenceNext"));
actions.add(connectToConferenceAction);
// Add a message to play if the connect doesn't succeed
Play notConnectedMsgAction = Play.sayText("Sorry, I could not connect you to conference A Test Conference. Goodbye.");
actions.add(notConnectedMsgAction);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, "my connect to conference 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 ConnectToConferenceNext extends HttpServlet
{
@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;
}
String token = ourRequest.getInstanceInfo().getToken();
// Set up the actions
List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
actions.add(Play.sayText("You are now out of the conference. Goodbye."));
// 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='connect call sample')
# On your inbound service configuration page, set the first page entry to point to this page
# e.g., http://<ip address>:<port>/first_page
# To connect to a conference your inbound service will require one Extra Channel, configure
# the service to have one Extra Channel.
if 'first_page' == page:
my_conference = ConnectToConference('ATestConference')
my_conference.set_hold_media(Play(file_to_play='holdmusic.wav'))
my_conference.set_participant(ConferenceParticipant(talker = True,
start_on_entry = True,
destroy_on_exit = False,
beep_on_entry = False,
mute_digit = '1',
unmute_digit = '2',
exit_digit = '#',
while_stopped_media=Play(file_to_play='whileconfstopped.wav'),
name=Play(text_to_say='a member of the committee'),
has_joined_message=Play(text_to_say='has joined the conference'),
has_left_message=Play(text_to_say='has left the conference')))
my_conference.set_next_page(WebPage(url='next_page'))
my_actions.add(my_conference)
my_actions.add(Play(text_to_say='Sorry, I could not connect you to conference A Test Conference. Goodbye.'))
elif 'next_page' == page:
my_actions.add(Play(text_to_say='You are now out of the conference. Goodbye.'))
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\ConnectToConference;
use \Aculab\TelephonyRestAPI\ConferenceParticipantConfiguration;
$response = new Actions();
$response->setToken('my connect to conference instance id');
// Create the connect to conference action
$connect_to_conference = new ConnectToConference('ATestConference');
$connect_to_conference->setHoldMedia(Play::playFile('holdmusic.wav'));
$connect_to_conference->setNextPage('ConnectToConferenceNext.php');
$participant_config = new ConferenceParticipantConfiguration();
$participant_config->setTalker(true);
$participant_config->setStartOnEntry(true);
$participant_config->setDestroyOnExit(false);
$participant_config->setBeepOnEntry(false);
$participant_config->setExitDigit('#');
$participant_config->setMuteDigit('1');
$participant_config->setUnmuteDigit('2');
$participant_config->setWhileStoppedMedia(Play::playFile('whileconfstopped.wav'));
$participant_config->setName(Play::sayText('a member of the committee'));
$participant_config->setHasJoinedMessage(Play::sayText('has joined the conference'));
$participant_config->setHasLeftMessage(Play::sayText('has left the conference'));
$connect_to_conference->setParticipantConfiguration($participant_config);
$response->add($connect_to_conference);
// Add a message to play if the connect to conference doesn't succeed
$play = new Play();
$play->addText('Sorry, I could not connect to conference ATestConference. Goodbye.');
$response->add($play);
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());
$play = new Play();
$play->addText('You are now out of the conference. Goodbye.');
$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();
$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 '';