Accept an Incoming Call

👍

You're ready for this how-to guide if you've got the following:

A FreeClimb account
A registered application
A configured FreeClimb Number
Your tools and language installed


Node.js

An incoming call is initiated by FreeClimb POSTing to the resource specified in the Voice URL in App Config. In response to a POST request from FreeClimb, the application may supply a number of PerCL actions in the JSON encoded response. In this sample the Say, Pause and Hangup PerCL actions are utilized.

Create your package.json file and save in the root directory of your project:

{
  "name": "node-accept-incoming-call-how-to-guide",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "@freeclimb/sdk": "^3.8.0",
    "body-parser": "^1.19.0",
    "dotenv": "^8.1.0",
    "express": "^4.17.1"
  }
}

Install the package by running the following in the command line/terminal:

yarn install

Example code:

require('dotenv').config()
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const { PerclScript, Say, Pause, Hangup } = require('@freeclimb/sdk')

app.use(bodyParser.json())
var port = process.env.PORT || 80
app.post('/incomingCall', (req, res) => {
  res.status(200).json(new PerclScript({
    commands: [
      new Say({ text: "Hello. Thank you for invoking the accept incoming call tutorial." }),
      new Pause({ length: 100 }),
      new Say({ text: "Goodbye" }),
      new Hangup({})
    ]
  }).build())
})
// Specify this route with 'Status Callback URL' in App Config
app.post('/status', (req, res) => {
  res.status(200)
})

Start the server:

app.listen(port, () => {
  console.log(`Starting server on port ${port}`)
})

Java

An incoming call is initiated by FreeClimb POSTing to the InboundCall controller. In response to a POST request from FreeClimb, the application may supply a number of PerCL actions in the JSON encoded response. In this sample the Say, Pause and Hangup PerCL actions are utilized.

Create your build.gradle file and save it to the root directory in your project:

/*
 * This file was generated by the Gradle 'init' task.
 *
 * This is a general purpose Gradle build.
 * Learn how to create Gradle builds at https://guides.gradle.org/creating-new-gradle-builds
 */

buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
  //Add the dependency
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE"
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'gs-spring-boot'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
    maven { url 'https://jitpack.io' }
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile "org.springframework.boot:spring-boot-starter-web"
    testCompile "junit:junit"
    compile 'com.github.FreeClimbAPI:FreeClimb-Java-SDK:3.0.0'
}

sourceSets {
    main {
        java {
            srcDirs = ['src'] // changed line
        }
    }
}

Build the file by running the following in your terminal/command line:

gradle build

Example code:

/* 
 * AFTER RUNNING PROJECT WITH COMMAND: 
 * `gradle build && java -Dserver.port=0080 -jar build/libs/gs-spring-boot-0.1.0.jar`
 * CALL NUMBER ASSOCIATED WITH THE ACCOUNT (CONFIGURED IN FreeClimb DASHBOARD)
 * EXPECT MESSAGE TO BE REPEATED TO YOU: 
 * 'Hello. Thank you for invoking the accept incoming call tutorial. Goodbye.'
*/

package main.java.accept_call;

import org.springframework.web.bind.annotation.RestController;
import com.vailsys.freeclimb.api.FreeClimbException;
import com.vailsys.freeclimb.api.call.CallStatus;
import com.vailsys.freeclimb.percl.Hangup;
import com.vailsys.freeclimb.percl.Language;
import com.vailsys.freeclimb.percl.Pause;
import com.vailsys.freeclimb.percl.PerCLScript;
import com.vailsys.freeclimb.percl.Say;
import com.vailsys.freeclimb.webhooks.StatusCallback;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@RestController
public class AcceptCall {

  // To properly communicate with FreeClimb's API, set your FreeClimb app's
  // VoiceURL endpoint to '{yourApplicationURL}/InboundCall' for this example
  // Your FreeClimb app can be configured in the FreeClimb Dashboard
  @RequestMapping(value = {
      "/InboundCall" }, method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  public ResponseEntity<?> inboundCall(@RequestBody String str) {
    PerCLScript script = new PerCLScript();

    StatusCallback statusCallback;
    try {
      // Convert JSON into a call status callback object
      statusCallback = StatusCallback.fromJson(str);
    } catch (FreeClimbException pe) {
      PerCLScript errorScript = new PerCLScript();
      Say sayError = new Say("There was a problem processing the incoming call.");
      sayError.setLanguage(Language.ENGLISH_US);
      errorScript.add(sayError);
      return new ResponseEntity<>(errorScript.toJson(), HttpStatus.OK);
    }

    if (statusCallback.getCallStatus() == CallStatus.RINGING) {
      // Create PerCL say script with US English as the language
      Say say = new Say("Hello. Thank you for invoking the accept incoming call tutorial.");
      say.setLanguage(Language.ENGLISH_US);

      // Add PerCL say script to PerCL container
      script.add(say);

      // Create PerCL pause script with a duration of 100 milliseconds
      Pause pause = new Pause(100);

      // Add PerCL pause script to PerCL container
      script.add(pause);

      // Create PerCL say script with US English as the language
      Say sayGoodbye = new Say("Goodbye.");
      sayGoodbye.setLanguage(Language.ENGLISH_US);

      // Add PerCL say script to PerCL container
      script.add(sayGoodbye);

      // Create PerCL hangup script
      Hangup hangup = new Hangup();

      // Add PerCL hangup script to PerCL container
      script.add(hangup);
    }

    // Convert PerCL container to JSON and append to response
    return new ResponseEntity<>(script.toJson(), HttpStatus.OK);
  }
}

C#

An incoming call is initiated by FreeClimb POSTing to the InboundCall controller. In response to a POST request from FreeClimb, the application may supply a number of PerCL actions in the JSON encoded response. In this sample the Say, Pause and Hangup PerCL actions are utilized.

Example code:

[HttpPost("InboundCall")]
    public ActionResult InboundCall (CallStatusCallback freeClimbRequest) {
      // Create an empty PerCL script container
      PerCLScript script = new PerCLScript ();
      // Verify inbound call is in proper state
      if (freeClimbRequest.getCallStatus == ECallStatus.Ringing) {
        // Create PerCL say script with US English as the language
        Say say = new Say ();
        say.setLanguage (ELanguage.EnglishUS);
        // Set prompt to record message
        say.setText ("Hello. Thank you for invoking the accept incoming call tutorial.");
 
        // Add PerCL say script to PerCL container
        script.Add (say);
 
        // Create PerCL pause script with a duration of 100 milliseconds
        Pause pause = new Pause (100);
 
        // Add PerCL pause script to PerCL container
        script.Add (pause);
 
        // Create PerCL say script with US English as the language
        Say sayGoodbye = new Say ();
        sayGoodbye.setLanguage (ELanguage.EnglishUS);
        // Set prompt
        sayGoodbye.setText ("Goodbye.");
 
        // Add PerCL say script to PerCL container
        script.Add (sayGoodbye);
 
        // Create PerCL hangup script
        Hangup hangup = new Hangup ();
 
        // Add PerCL hangup script to PerCL container
        script.Add (new Hangup ());
      }
      // Convert PerCL container to JSON and append to response
      return Content (script.toJson (), "application/json");
    }