mirror of
https://github.com/fusionpbx/fusionpbx.git
synced 2025-12-31 09:33:48 +00:00
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.
188 lines
6.2 KiB
Lua
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
|