Files
fusionpbx/resources/install/scripts/app/agent_status/index.lua
DigiDaz 829f3d44a0 Moved the display update to the end (#1913)
Moved the UPDATE sip request to the end as it was sending the UPDATE request sometimes before the ACK had been received to the 200OK. This was sometimes causing it to fail.

Also removed a couple of commented out lines.
2016-09-13 20:06:26 -06:00

188 lines
6.2 KiB
Lua

--set default variables
max_digits = 15;
digit_timeout = 5000;
debug["sql"] = true;
--connect to the database
require "resources.functions.database_handle";
dbh = database_handle('system');
--set the api
api = freeswitch.API();
--get the argv values
action = argv[2];
--get the session variables
if (session:ready()) then
session:answer();
end
--get the session variables
if (session:ready()) then
--general variables
domain_uuid = session:getVariable("domain_uuid");
domain_name = session:getVariable("domain_name");
context = session:getVariable("context");
uuid = session:get_uuid();
agent_authorized = session:getVariable("agent_authorized");
agent_id = session:getVariable("agent_id");
agent_password = session:getVariable("agent_password");
--set the sounds path for the language, dialect and voice
default_language = session:getVariable("default_language");
default_dialect = session:getVariable("default_dialect");
default_voice = session:getVariable("default_voice");
if (not default_language) then default_language = 'en'; end
if (not default_dialect) then default_dialect = 'us'; end
if (not default_voice) then default_voice = 'callie'; end
end
--set default as access denied
if (agent_authorized == nil or agent_authorized ~= 'true') then
agent_authorized = 'false';
end
--define the sounds directory
sounds_dir = session:getVariable("sounds_dir");
sounds_dir = sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice;
--get the agent_id from the caller
if (agent_id == nil) then
min_digits = 2;
max_digits = 20;
max_tries = 3;
agent_id = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:voicemail_enter_id:#", "", "\\d+");
end
--get the pin number from the caller
if (agent_password == nil and agent_authorized ~= 'true') then
min_digits = 3;
max_digits = 20;
max_tries = 3;
agent_password = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:voicemail_enter_pass:#", "", "\\d+");
end
--get the agent password
sql = "SELECT * FROM v_call_center_agents ";
sql = sql .. "WHERE domain_uuid = '" .. domain_uuid .."' ";
sql = sql .. "AND agent_id = '" .. agent_id .."' ";
if (agent_authorized ~= 'true') then
sql = sql .. "AND agent_password = '" .. agent_password .."' ";
end
freeswitch.consoleLog("notice", "[user status] sql: " .. sql .. "\n");
dbh:query(sql, function(row)
--set the variables
agent_name = row.agent_name;
agent_id = row.agent_id;
--authorize the user
agent_authorized = 'true';
end);
--show the results
if (agent_id) then
freeswitch.consoleLog("notice", "[user status][login] agent id: " .. agent_id .. " authorized: " .. agent_authorized .. "\n");
end
if (agent_password and debug["password"]) then
freeswitch.consoleLog("notice", "[user status][login] agent password: " .. agent_password .. "\n");
end
--get the user_uuid
if (agent_authorized == 'true') then
sql = "SELECT user_uuid, user_status FROM v_users ";
sql = sql .. "WHERE username = '".. agent_name .."' ";
sql = sql .. "AND domain_uuid = '" .. domain_uuid .."' ";
if (debug["sql"]) then
freeswitch.consoleLog("NOTICE", "[call_center] sql: ".. sql .. "\n");
end
dbh:query(sql, function(row)
--get the user info
user_uuid = row.user_uuid;
user_status = row.user_status;
if (user_status == "Available") then
action = "logout";
status = 'Logged Out';
else
action = "login";
status = 'Available';
end
--show the status in the log
freeswitch.consoleLog("NOTICE", "[call_center] user_status: ".. status .. "\n");
--set the user_status in the users table
sql = "UPDATE v_users SET ";
sql = sql .. "user_status = '"..status.."' ";
sql = sql .. "WHERE user_uuid = '" .. user_uuid .."' ";
if (debug["sql"]) then
freeswitch.consoleLog("NOTICE", "[call_center] sql: ".. sql .. "\n");
end
dbh:query(sql);
--send a login or logout to mod_callcenter
cmd = "callcenter_config agent set status "..agent_name.."@"..domain_name.." '"..status.."'";
freeswitch.consoleLog("notice", "[user status][login] "..cmd.."\n");
result = api:executeString(cmd);
--set the presence to terminated - turn the lamp off:
if (action == "logout") then
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", agent_name.."@"..domain_name);
event:addHeader("login", agent_name.."@"..domain_name);
event:addHeader("unique-id", user_uuid);
event:addHeader("answer-state", "terminated");
event:fire();
end
--set presence in - turn lamp on
if (action == "login") then
event = freeswitch.Event("PRESENCE_IN");
event:addHeader("proto", "sip");
event:addHeader("login", agent_name.."@"..domain_name);
event:addHeader("from", agent_name.."@"..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", user_uuid);
event:addHeader("Presence-Call-Direction", "outbound");
event:addHeader("answer-state", "confirmed");
event:fire();
end
end);
end
--unauthorized
if (agent_authorized == 'false') then
result = session:streamFile(sounds_dir.."/voicemail/vm-fail_auth.wav");
status = "Invalid ID or Password";
end
--set the status and presence
if (session:ready()) then
if (action == "login") then
session:execute("playback", sounds_dir.."/ivr/ivr-you_are_now_logged_in.wav");
end
if (action == "logout") then
session:execute("playback", sounds_dir.."/ivr/ivr-you_are_now_logged_out.wav");
end
end
--send the status to the display
if (status ~= nil) then
reply = api:executeString("uuid_display "..uuid.." '"..status.."'");
end
--set the session sleep to give time to see the display
if (session:ready()) then
session:execute("sleep", "2000");
end