150 lines
5.3 KiB
Lua
150 lines
5.3 KiB
Lua
|
|
--park_monitor.lua
|
||
|
|
--Date: 4 Oct. 2011
|
||
|
|
--Description:
|
||
|
|
--if the call has been answered
|
||
|
|
--then send presence terminate, and delete from the database
|
||
|
|
|
||
|
|
--connect to the database
|
||
|
|
--ODBC - data source name
|
||
|
|
--local dbh = freeswitch.Dbh("name","user","pass");
|
||
|
|
--FreeSWITCH core db
|
||
|
|
local dbh = freeswitch.Dbh("core:park");
|
||
|
|
|
||
|
|
--get the argv values
|
||
|
|
script_name = argv[0];
|
||
|
|
uuid = argv[1];
|
||
|
|
domain_name = argv[2];
|
||
|
|
park_extension = argv[3];
|
||
|
|
park_timeout_type = argv[4];
|
||
|
|
park_timeout_seconds = argv[5];
|
||
|
|
park_timeout_destination = argv[6];
|
||
|
|
|
||
|
|
--prepare the api
|
||
|
|
api = freeswitch.API();
|
||
|
|
|
||
|
|
--add a trim function
|
||
|
|
function trim (s)
|
||
|
|
return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
|
||
|
|
end
|
||
|
|
|
||
|
|
--monitor the parking lot if the call has hungup send a terminated event, and delete from the db
|
||
|
|
x = 0
|
||
|
|
while true do
|
||
|
|
--sleep a moment to prevent using unecessary resources
|
||
|
|
freeswitch.msleep(1000);
|
||
|
|
|
||
|
|
if (api:executeString("uuid_exists "..uuid) == "false") then
|
||
|
|
--set the presence to terminated
|
||
|
|
event = freeswitch.Event("PRESENCE_IN");
|
||
|
|
event:addHeader("proto", "sip");
|
||
|
|
event:addHeader("event_type", "presence");
|
||
|
|
event:addHeader("alt_event_type", "dialog");
|
||
|
|
event:addHeader("Presence-Call-Direction", "outbound");
|
||
|
|
event:addHeader("state", "Active (1 waiting)");
|
||
|
|
event:addHeader("from", park_extension.."@"..domain_name);
|
||
|
|
event:addHeader("login", park_extension.."@"..domain_name);
|
||
|
|
event:addHeader("unique-id", uuid);
|
||
|
|
event:addHeader("answer-state", "terminated");
|
||
|
|
event:fire();
|
||
|
|
|
||
|
|
--set the park status
|
||
|
|
cmd = "uuid_setvar "..uuid.." park_status cancelled";
|
||
|
|
result = trim(api:executeString(cmd));
|
||
|
|
freeswitch.consoleLog("NOTICE", "Park Status: cancelled\n");
|
||
|
|
|
||
|
|
--delete the lot from the database
|
||
|
|
dbh:query("DELETE from park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' ");
|
||
|
|
|
||
|
|
|
||
|
|
--end the loop
|
||
|
|
break;
|
||
|
|
else
|
||
|
|
cmd = "uuid_getvar "..uuid.." park_status";
|
||
|
|
result = trim(api:executeString(cmd));
|
||
|
|
--freeswitch.consoleLog("notice", "" .. result .. "\n");
|
||
|
|
if (result == "parked") then --_undef_
|
||
|
|
--set presence in
|
||
|
|
event = freeswitch.Event("PRESENCE_IN");
|
||
|
|
event:addHeader("proto", "sip"); --park
|
||
|
|
event:addHeader("login", park_extension.."@"..domain_name);
|
||
|
|
event:addHeader("from", park_extension.."@"..domain_name);
|
||
|
|
event:addHeader("status", "Active (1 waiting)");
|
||
|
|
event:addHeader("rpid", "unknown");
|
||
|
|
event:addHeader("event_type", "presence");
|
||
|
|
event:addHeader("alt_event_type", "dialog");
|
||
|
|
event:addHeader("event_count", "1");
|
||
|
|
event:addHeader("unique-id", uuid);
|
||
|
|
--event:addHeader("Presence-Call-Direction", "outbound")
|
||
|
|
event:addHeader("answer-state", "confirmed");
|
||
|
|
event:fire();
|
||
|
|
else
|
||
|
|
--set the presence to terminated
|
||
|
|
event = freeswitch.Event("PRESENCE_IN");
|
||
|
|
event:addHeader("proto", "sip");
|
||
|
|
event:addHeader("event_type", "presence");
|
||
|
|
event:addHeader("alt_event_type", "dialog");
|
||
|
|
event:addHeader("Presence-Call-Direction", "outbound");
|
||
|
|
event:addHeader("state", "Active (1 waiting)");
|
||
|
|
event:addHeader("from", park_extension.."@"..domain_name);
|
||
|
|
event:addHeader("login", park_extension.."@"..domain_name);
|
||
|
|
event:addHeader("unique-id", uuid);
|
||
|
|
event:addHeader("answer-state", "terminated");
|
||
|
|
event:fire();
|
||
|
|
|
||
|
|
--delete the lot from the database
|
||
|
|
dbh:query("DELETE from park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' ");
|
||
|
|
--freeswitch.consoleLog("NOTICE", "Affected rows: park ext "..park_extension.." " .. dbh:affected_rows() .. "\n");
|
||
|
|
|
||
|
|
--set the park status
|
||
|
|
cmd = "uuid_setvar "..uuid.." park_status unparked";
|
||
|
|
result = trim(api:executeString(cmd));
|
||
|
|
freeswitch.consoleLog("NOTICE", "Park Status: unparked "..park_extension.."\n");
|
||
|
|
|
||
|
|
--end the loop
|
||
|
|
break;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--limit the monitor to watching 60 seconds
|
||
|
|
x = x + 1;
|
||
|
|
if (x > tonumber(park_timeout_seconds)) then
|
||
|
|
--set the presence to terminated
|
||
|
|
event = freeswitch.Event("PRESENCE_IN");
|
||
|
|
event:addHeader("proto", "sip");
|
||
|
|
event:addHeader("event_type", "presence");
|
||
|
|
event:addHeader("alt_event_type", "dialog");
|
||
|
|
event:addHeader("Presence-Call-Direction", "outbound");
|
||
|
|
event:addHeader("state", "Active (1 waiting)");
|
||
|
|
event:addHeader("from", park_extension.."@"..domain_name);
|
||
|
|
event:addHeader("login", park_extension.."@"..domain_name);
|
||
|
|
event:addHeader("unique-id", uuid);
|
||
|
|
event:addHeader("answer-state", "terminated");
|
||
|
|
event:fire();
|
||
|
|
|
||
|
|
--delete the lot from the database
|
||
|
|
dbh:query("DELETE from park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' ");
|
||
|
|
|
||
|
|
--set the park status
|
||
|
|
cmd = "uuid_setvar "..uuid.." park_status timeout";
|
||
|
|
result = trim(api:executeString(cmd));
|
||
|
|
freeswitch.consoleLog("NOTICE", "Park Status: timeout\n");
|
||
|
|
|
||
|
|
--end the loop
|
||
|
|
break;
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
--if the timeout was reached transfer the call
|
||
|
|
cmd = "uuid_getvar "..uuid.." park_status";
|
||
|
|
park_status = trim(api:executeString(cmd));
|
||
|
|
if (park_timeout_type == "transfer" and park_status == "timeout") then
|
||
|
|
--set the park status
|
||
|
|
cmd = "uuid_setvar "..uuid.." park_status unparked";
|
||
|
|
result = trim(api:executeString(cmd));
|
||
|
|
freeswitch.consoleLog("NOTICE", "Park Status: unparked\n");
|
||
|
|
--transfer the call when it has timed out
|
||
|
|
cmd = "uuid_transfer "..uuid.." "..park_timeout_destination;
|
||
|
|
result = trim(api:executeString(cmd));
|
||
|
|
end
|