voice broadcast Sample

An outbound application that handles answered outbound calls that have been classified.

Live speakers are played a notification message and then asked to press a digit to confirm they have received and understood the message. Answering machines are played a different notification message.

Use actions: Play , Run Menu

    • {
          "actions" :
          [
              {
                  "play" :
                  {
                      "play_list" :
                      [
                          {
                              "text_to_say" : "Hello"
                          }
                      ]
                  }
              },
              {
                  "play" :
                  {
                      "play_list" :
                      [
                          {
                              "text_to_say" : "This is a recorded notification message to let you know that Saint
                                               Custards Preparatory School will open for the spring term on 5th
                                               September next year. Please call
                                               <say-as interpret-as='vxml:digits'>441908273800</say-as>
                                               to let us know that you have received this message."
                          }
                      ]
                  }
              }
          ],
          "token" : "my voice broadcast instance id"
      }
    • {
          "actions" :
          [
              {
                  "play" :
                  {
                      "play_list" :
                      [
                          {
                              "text_to_say" : "Hello"
                          }
                      ]
                  }
              },
              {
                  "play" :
                  {
                      "play_list" :
                      [
                          {
                              "text_to_say" : "This is a notification to let you know that Saint Custards Preparatory
                                               School will open for the spring term on 5th September next year."
                          }
                      ]
                  },
                  "run_menu" :
                  {
                      "prompt" :
                      {
                          "play" :
                          {
                              "play_list" :
                              [
                                  {
                                      "text_to_say" : "Please press 1 to confirm that you have
                                                       received and understood this message,
                                                       or press 2 to hear the message again"
                                  }
                              ]
                          }
                      },
                      "menu_options" :
                      [
                          {
                              "digit" : "1",
                              "next_page" :
                              {
                                  "url" : "ConfirmMessage"
                              }
                          },
                          {
                              "digit" : "2",
                              "next_page" :
                              {
                                  "url" : "VoiceBroadcast"
                              }
                          }
                      }
                      "on_digit_timeout_messages":
                      [
                          {
                              "play" :
                              {
                                  "play_list" :
                                  [
                                      {
                                          "text_to_say" : "I didn't catch your entry."
                                      }
                                  ]
                              }
                          }
                      ],
                      "on_invalid_digit_messages" :
                      [
                          {
                              "play" :
                              {
                                  "play_list" :
                                  [
                                      {
                                          "text_to_say" : "That wasn't one of the options. Please try again."
                                      }
                                  ]
                              }
                          }
                      ]
                  }
              }
          ],
          "token" : "my voice broadcast instance id"
      }
    • {
          "actions" :
          [
              {
                  "play" :
                  {
                      "play_list" :
                      [
                          {
                              "text_to_say" : "Thanks for your confirmation. Goodbye."
                          }
                      ]
                  }
              }
          ],
          "token" : "my voice broadcast 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 VoiceBroadcast : 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 farEndType = ourRequest.InstanceInfo.ThisCall.FarEndType;
      
              // Setup the actions
              List<TelephonyAction> actions = new List<TelephonyAction>();
      
              actions.Add(Play.SayText("Hello."));
      
              if (farEndType.CompareTo("machine") == 0)
              {
                  // Simply leave a message on the answering machine
                  actions.Add(Play.SayText("This is a recorded notification message to let you know that Saint " +
                                           "Custards Preparatory School will open for the spring term on 5th " +
                                           "September next year. Please call " +
                                           "<say-as interpret-as='vxml:digits'>441908273800</say-as> " +
                                           "to let us know that you have received this message."));
              }
              else
              {
                  // Play the notification message
                  actions.Add(Play.SayText("This is a notification to let you know that Saint Custards Preparatory " +
                                           "School will open for the spring term on 5th September next year."));
      
                  // Set up a run menu action to obtain an acknowledgement or repeat the notification message
                  Play prompt = Play.SayText("Please press 1 to confirm that you have received and understood " +
                                             "this message, or press 2 to hear this message again.");
                  List<MenuOption> menuOptions = new List<MenuOption>();
                  menuOptions.Add(new MenuOption('1', new WebPageRequest("ConfirmMessage.aspx")));
                  menuOptions.Add(new MenuOption('2', new WebPageRequest("VoiceBroadcast.aspx")));
                  RunMenu runMenuAction = new RunMenu(prompt, menuOptions);
                  runMenuAction.OnDigitTimeoutMessages.Add(Play.SayText("I didn't catch your entry."));
                  runMenuAction.OnInvalidDigitMessages.Add(Play.SayText("That wasn't one of the options. " +
                                                                        "Please try again."));
                  actions.Add(runMenuAction);
              }
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(actions, "my voice broadcast instance id");
              ourResponse.ToHttpResponse(Response);
          }
      }
      
    • using System;
      using System.Collections.Generic;
      using RestAPIWrapper;
      
      public partial class ConfirmMessage : 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("Thanks for your confirmation. 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 VoiceBroadcast
          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 farEndType As String = ourRequest.InstanceInfo.ThisCall.FarEndType
      
              ' Setup the actions
              Dim actions As List(Of TelephonyAction) = New List(Of TelephonyAction)
      
              actions.Add(Play.SayText("Hello."))
      
              If farEndType.CompareTo("machine") = 0 Then
                  ' Simply leave a message on the answering machine
                  actions.Add(Play.SayText("This is a recorded notification message to let you know that Saint " + _
                                           "Custards Preparatory School will open for the spring term on 5th " + _
                                           "September next year. Please call " + _
                                           "441908273800 " + _
                                           "to let us know that you have received this message."))
              Else
                  ' Play the notification message
                  actions.Add(Play.SayText("This is a notification to let you know that Saint Custards Preparatory " + _
                                           "School will open for the spring term on 5th September next year."))
      
                  ' Set up a run menu action to obtain an acknowledgement or repeat the notification message
                  Dim prompt As Play = Play.SayText("Please press 1 to confirm that you have received and understood " + _
                                             "this message, or press 2 to hear this message again.")
                  Dim menuOptions As List(Of MenuOption) = New List(Of MenuOption)
                  menuOptions.Add(New MenuOption("1", New WebPageRequest("ConfirmMessage.aspx")))
                  menuOptions.Add(New MenuOption("2", New WebPageRequest("VoiceBroadcast.aspx")))
                  Dim runMenuAction As RunMenu = New RunMenu(prompt, menuOptions)
                  runMenuAction.OnDigitTimeoutMessages = New List(Of Play)
                  runMenuAction.OnDigitTimeoutMessages.Add(Play.SayText("I didn't catch your entry."))
                  runMenuAction.OnInvalidDigitMessages = New List(Of Play)
                  runMenuAction.OnInvalidDigitMessages.Add(Play.SayText("That wasn't one of the options. " + _
                                                                        "Please try again."))
                  actions.Add(runMenuAction)
              End If
      
              ' Respond
              Dim ourResponse As TelephonyResponse = New TelephonyResponse(actions, "my voice broadcast instance id")
              ourResponse.ToHttpResponse(Response)
          End Sub
      End Class
      
    • Imports System
      Imports System.Collections.Generic
      Imports RestAPIWrapper
      
      Partial Class ConfirmMessage
          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("Thanks for your confirmation. 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 com.aculab.telephonyrestapi.*;
      
      public class VoiceBroadcast 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 farEndType = ourRequest.getInstanceInfo().getThisCall().getFarEndType();
      
              // Set up the actions
              List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
      
              actions.add(Play.sayText("Hello."));
      
              if (farEndType.compareTo("machine") == 0)
              {
                  // Simply leave a message on the answering machine
                  actions.add(Play.sayText("This is a recorded notification message to let you know that Saint " +
                                           "Custards Preparatory School will open for the spring term on 5th " +
                                           "September next year. Please call " +
                                           "<say-as interpret-as='vxml:digits'>441908273800</say-as> " +
                                           "to let us know that you have received this message."));
              }
              else
              {
                  // Play the notification message
                  actions.add(Play.sayText("This is a notification to let you know that Saint Custards Preparatory " +
                                           "School will open for the spring term on 5th September next year."));
      
                  // Set up a run menu action to obtain an acknoledgement or repeat the notification message
                  Play prompt = Play.sayText("Please press 1 to confirm that you have received and understood " +
                                             "this message, or press 2 to hear this message again.");
                  List<MenuOption> menuOptions = new ArrayList<MenuOption>();
                  menuOptions.add('1', new WebPageRequest("ConfirmMessage"));
                  menuOptions.add('2', new WebPageRequest("VoiceBroadcast"));
                  RunMenu runMenuAction = new RunMenu(prompt, menuOptions);
      
                  List<Play> onDigitTimeoutMessages = new ArrayList<Play>();
                  onDigitTimeoutMessages.add(Play.sayText("I didn't catch your entry."));
                  runMenuAction.setOnDigitTimeoutMessages(onDigitTimeoutMessages);
      
                  List<Play> onInvalidDigitMessages = new ArrayList<Play>();
                  onInvalidDigitMessages.add(Play.sayText("That wasn't one of the options. Please try again."));
                  runMenuAction.setOnInvalidDigitMessages(onInvalidDigitMessages);
      
                  actions.add(runMenuAction);
              }
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(actions, "my voice broadcast 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 ConfirmMessage 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();
      
              // Set up the actions
              List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
              actions.add(Play.sayText("Thanks for your confirmation. 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 actions = new ArrayList();
              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.

      # This is an outbound application and, as such, needs to be invoked by the web services API.
      # It uses a Python wrapper for the web services API to invoke this sample.
      # Before running this sample you will need to configure an outbound service that points to it.
      
      import sys, os
      from threading import Thread
      from getpass import getpass
      sys.path.append(os.path.abspath('../..'))
      
      from aculab.telephony_rest_api import *
      from aculab.simple_server import *
      from aculab.base_application import ApplicationBase
      from aculab.web_services import invoke_outbound_service
      
      
      if sys.version > '3':
          def raw_input(text):
              return input(text)
      
      
      class MyThread(Thread):
          def __init__(self, function):
              Thread.__init__(self)
              self._function = function
              self.return_code = 0
      
          def run(self):
              self.return_code = self._function()
      
      
      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='voice broadcast sample')
      
              # on your inbound service, set the first page entry to point to this page
              # e.g., http://:/first_page
              if 'first_page' == page:
                  # get the call classification (machine / non-machine)       
                  this_call = query_info.ThisCall
                  # the far end type will only be available if classify is enabled
                  far_end_type = this_call.get('far_end_type', 'unknown')
                  play_action = Play(text_to_say="Hello.")
                  if 'far_end_type' == 'answering_machine':
                      play_action.add_text(text_to_say=("This is a recorded notification message to let you know that Saint "
                                                        "Custards Preparatory School will open for the spring term on 5th "
                                                        "September next year. Please call "
                                                        "<say-as interpret-as='vxml:digits'>441908273800</say-as> "
                                                        "to let us know that you have received this message."),
                                           tts_voice='English US Male Polly Joey')
                      my_actions.add(play_action)
                  else:
                      play_action.add_text(text_to_say=("This is a notification to let you know that Saint Custards Preparatory "
                                                        "School will open for the spring term on 5th September next year."),
                                           tts_voice='English US Male Polly Joey')
                      my_actions.add(play_action)
      
                      # set up a run menu action to obtain an acknowledgement or repeat the notification message
                      my_menu = RunMenu()
                      my_menu.on_prompt_play(Play(text_to_say=("Please press 1 to confirm that you have received and understood "
                                                               "this message, or press 2 to hear this message again.")))
                      my_menu.append_menu_option('1', WebPage(url='confirm_message'))
                      my_menu.append_menu_option('2', WebPage(url='first_page'))
                      my_menu.append_on_digit_timeout_message(Play(text_to_say="I didn't catch your entry."))
                      my_menu.append_on_invalid_digit_message(Play(text_to_say="That wasn't one of the options. Please try again."))
                      my_actions.add(my_menu);
      
              elif 'confirm_message' == page:
                  my_actions.add(Play(text_to_say="Thanks for your confirmation. 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]
      
      
      def test_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()
      
      
      if __name__ == "__main__":
          test_thread = MyThread(test_main)
          test_thread.start()
      
          service_name        = raw_input('the outbound service to invoke:')
          service_password    = getpass('your outbound service password:')
          call_to             = raw_input('call to:')
          call_from           = raw_input('call from:')
          token               = raw_input('token:')
          outbound_parameters = raw_input('the outbound service parameters:')
          target              = raw_input('the cloud region or Rapide IP address:')
          username            = raw_input('your cloud or Rapide username:')
      
          outbound_calls = invoke_outbound_service.OutboundCalls(call_to=call_to.strip(),
                                         call_from=call_from.strip(),
                                         token=token.strip(), 
                                         outbound_parameters=outbound_parameters.strip())
          application_instance_ids = invoke_outbound_service.invoke_outbound_service(target=target.strip(), 
                                                             username=username.strip(), 
                                                             service_name=service_name.strip(),
                                                             service_password=service_password.strip(), 
                                                             outbound_calls=outbound_calls)
          test_thread.join()
      
    • declare(encoding='UTF-8');
      spl_autoload_register();
      
      // set headers to prevent the page being cached by intermediaries
      header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
      header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
      
      header("Content-Type: application/json; charset=UTF-8");
      
      use \Aculab\TelephonyRestAPI\InstanceInfo;
      use \Aculab\TelephonyRestAPI\Actions;
      use \Aculab\TelephonyRestAPI\Play;
      use \Aculab\TelephonyRestAPI\RunMenu;
      use \Aculab\TelephonyRestAPI\MessageList;
      
      $info = InstanceInfo::getInstanceInfo();
      $endType = '';
      $response = new Actions();
      if ($info != null) {
          $response->setToken($info->getToken());
      
          $callInfo = $info->getThisCallInfo();
          if ($callInfo != null) {
              $endType = $callInfo->getFarEndType();
          }
      }
      
      if ($endType == 'human') {
          $response->add(
              Play::sayText(
                  "This is a notification to let you know that Saint Custards Preparatory " .
                  "School will open for the spring term on 5th September next year."
              )
          );
          // Create the menu action
          $menuPrompt = Play::sayText(
              "Please press 1 to confirm that you have " .
              "received and understood this message, " .
              "or press 2 to hear the message again"
          );
          $menu = new RunMenu($menuPrompt);
          $menu->addMenuOption('1', 'ConfirmMessage.php');
          $menu->addMenuOption('2', 'First.php');
      
          // Set up some new info messages for digit timeout and invalid digit
          $onDigitTimeoutMessages = new MessageList();
          $onDigitTimeoutMessages->addMessage(
              Play::sayText(
                  "I didn't catch your entry."
              )
          );
          $menu->setOnDigitTimeoutMessages($onDigitTimeoutMessages);
      
          $onInvalidDigitMessages = new MessageList();
          $onInvalidDigitMessages->addMessage(
              Play::sayText(
                  "That wasn't one of the options. Please try again."
              )
          );
          $menu->setOnInvalidDigitMessages($onInvalidDigitMessages);
      
          $response->add($menu);
      } elseif ($endType == 'answering_machine') {
          $response->add(
              Play::sayText(
                  "This is a recorded notification message to let you know that Saint " .
                  "Custards Preparatory School will open for the spring term on 5th " .
                  "September next year. Please call 01234 567890 to let us know that " .
                  "you have received this message."
              )
          );
      } // else no actions, so the call will be disconnected
      print $response;
      
      
    • declare(encoding='UTF-8');
      spl_autoload_register();
      header("Content-Type: application/json; charset=UTF-8");
      
      $info = \Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
      
      $response = new \Aculab\TelephonyRestAPI\Actions();
      $response->setToken($info->getToken());
      
      $play = new \Aculab\TelephonyRestAPI\Play();
      $play->addText('Thanks for your confirmation. 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 '';