Call Us Today! 877.742.2583




Page tree
Skip to end of metadata
Go to start of metadata

About

This Lua example adds simple conference room management. The caller will be prompted to enter a conference number and a PIN to access the conference room. 

 Click to expand Table of Contents

DB Schema

Description of the database table "conferences":

Table Conferences
conferencing=> \d+ conferences
                                  Table "public.conferences"
   Column   |  Type   |                        Modifiers                         | Description
------------+---------+----------------------------------------------------------+-------------
 id         | integer | not null default nextval('conferences_id_seq'::regclass) |
 conf_num   | integer | not null                                                 |
 conf_pin   | integer |                                                          |
 conf_owner | text    |                                                          |
 conf_email | text    |                                                          |


SQL Schema of conferences table:

Conferences Schema
CREATE TABLE conferences(
   id SERIAL NOT NULL, 
   conf_num INT NOT NULL, 
   conf_pin INT, 
   conf_owner TEXT, 
   conf_email TEXT
);

Lua Script for Conferencing

Lua Conference Manager
require "luasql.postgres"

attempt = 1
max_attempts = 3

function session_hangup_hook(status)
  freeswitch.consoleLog("NOTICE", "Session hangup: " .. status .. "\n")
  db_connection:close()
  error()
end

function get_conference_num(min, max, attempts, timeout)
  local conference_num
  freeswitch.consoleLog("NOTICE", "Awaiting caller to enter a conference number phrase:conference_num\n")
  conference_num = session:playAndGetDigits(min, max, attempts, timeout, '#', 'phrase:conference_num', '', '\\d+')
  return(conference_num)
end

function get_conference_pin(min, max, attempts, timeout, pin_number)
  local pin_attempt = 1
  local pin_max_attempt = 3

  while pin_attempt <= pin_max_attempt do
    conference_pin = session:playAndGetDigits(min, max, attempts, timeout, '#', 'phrase:conference_pin', '', '\\d+')
    if tonumber(conference_pin) == tonumber(pin_number) then
      return true
    else
      session:execute("phrase", "conference_bad_pin")
    end

    pin_attempt = pin_attempt + 1
  end

  return false
end

env = assert(luasql.postgres())
db_connection = assert(env:connect("dbname=conferencing user=conf password=conf"))

session:answer();
session:setHangupHook("session_hangup_hook")

if session:ready() then
  freeswitch.consoleLog("NOTICE", string.format("Caller has called conferencing server, Playing welcome message phrase:conference_welcome\n"))
  session:execute("phrase", "conference_welcome")
end

while attempt <= max_attempts do
  conf_num = get_conference_num(1, 4, 3, 4000)

  db_cursor = assert(db_connection:execute(string.format("select conf_pin from conferences where conf_num = %d", tonumber(conf_num))))
  row = db_cursor:fetch({}, "a")

  --[[ do conference authentication ]]--
  if row == nil then

    --[[ if the conference number does not exist, playback message saying it is
         and invalid conference number ]]--
    session:execute("phrase", "conference_bad_num")

  elseif row["conf_pin"] == nil or row["conf_pin"] == "" then
    freeswitch.consoleLog("NOTICE", string.format("Conference %d has no PIN, Sending caller into conference\n", tonumber(conf_num)))

    --[[ join the conference ]]--
    session:execute("conference", string.format("%s@default", conf_num))
  else
    freeswitch.consoleLog("NOTICE", string.format("Conference %d has a PIN %d, Authenticating user\n", tonumber(conf_num), tonumber(row["conf_pin"])))

    --[[ get the conference pin number ]]--
    if ((get_conference_pin(1, 4, 3, 4000, row["conf_pin"])) == true) then
      freeswitch.consoleLog("NOTICE", string.format("Conference %d correct PIN entered, Sending caller into conference\n", tonumber(conf_num)))
      --[[ join the conference, if the correct pin was entered ]]--
      session:execute("conference", string.format("%s@default", conf_num))
    else
      freeswitch.consoleLog("NOTICE", string.format("Conference %d invalid PIN entered, Looping again\n", tonumber(conf_num)))
    end
  end

  attempt = attempt + 1
end

session:execute("phrase", "conference_too_many_failures")

session:hangup()