fusionpbx/resources/install/scripts/app/messages/resources/events.lua

336 lines
10 KiB
Lua

--
-- Version: MPL 1.1
--
-- The contents of this file are subject to the Mozilla Public License Version
-- 1.1 (the "License"); you may not use this file except in compliance with
-- the License. You may obtain a copy of the License at
-- http://www.mozilla.org/MPL/
--
-- Software distributed under the License is distributed on an "AS IS" basis,
-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-- for the specific language governing rights and limitations under the
-- License.
--
-- The Original Code is FusionPBX
--
-- The Initial Developer of the Original Code is
-- Mark J Crane <markjcrane@fusionpbx.com>
-- Copyright (C) 2018
-- Start the script
-- <!-- Subscribe to events -->
-- <hook event="CUSTOM" subclass="SMS::SEND_MESSAGE" script="app/messages/resources/events.lua"/>
--prepare the api object
api = freeswitch.API();
--define the functions
require "resources.functions.trim";
require "resources.functions.explode";
require "resources.functions.base64";
--include the database class
local Database = require "resources.functions.database";
--set debug
debug["sql"] = false;
--get the events
--serialize the data for the console
--freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n");
--freeswitch.consoleLog("notice","[evnts] " .. event:serialize("json") .. "\n");
--intialize settings
--from_user = '';
--get the event variables
uuid = event:getHeader("Core-UUID");
from_user = event:getHeader("from_user");
from_host = event:getHeader("from_host");
to_user = event:getHeader("to_user");
to_host = event:getHeader("to_host");
content_type = event:getHeader("type");
message_text = event:getBody();
--set required variables
if (from_user ~= nil and from_host ~= nil) then
message_from = from_user .. '@' .. from_host;
end
if (to_user ~= nil and to_host ~= nil) then
message_to = to_user .. '@' .. to_host;
end
message_type = 'message';
--connect to the database
dbh = Database.new('system');
--exits the script if we didn't connect properly
assert(dbh:connected());
--set debug
debug["sql"] = true;
--include json library
local json
if (debug["sql"]) then
json = require "resources.functions.lunajson"
end
--check if the from user exits
if (from_user ~= nil and from_host ~= nil) then
cmd = "user_exists id ".. from_user .." "..from_host;
freeswitch.consoleLog("notice", "[messages][from] user exists " .. cmd .. "\n");
from_user_exists = api:executeString(cmd);
else
from_user_exists = 'false';
end
--check if the to user exits
if (to_user ~= nil and to_host ~= nil) then
cmd = "user_exists id ".. to_user .." "..to_host;
freeswitch.consoleLog("notice", "[messages][to] user exists " .. cmd .. "\n");
to_user_exists = api:executeString(cmd);
else
to_user_exists = 'false';
end
--add the message
if (from_user_exists == 'true') then
--set the direction
message_direction = 'send';
--get the from user_uuid
cmd = "user_data ".. from_user .."@"..from_host.." var domain_uuid";
domain_uuid = trim(api:executeString(cmd));
--get the from user_uuid
cmd = "user_data ".. from_user .."@"..from_host.." var user_uuid";
user_uuid = trim(api:executeString(cmd));
--get the from contact_uuid
cmd = "user_data ".. to_user .."@"..to_host.." var contact_uuid";
contact_uuid = trim(api:executeString(cmd));
--create a new uuid and add it to the uuid list
message_uuid = api:executeString("create_uuid");
--sql statement
sql = "INSERT INTO v_messages ";
sql = sql .."( ";
sql = sql .."domain_uuid, ";
sql = sql .."message_uuid, ";
sql = sql .."user_uuid, ";
if (contact_uuid ~= null and string.len(contact_uuid) > 0) then
sql = sql .."contact_uuid, ";
end
sql = sql .."message_direction, ";
sql = sql .."message_date, ";
sql = sql .."message_type, ";
if (message_from ~= null and string.len(message_from) > 0) then
sql = sql .."message_from, ";
end
sql = sql .."message_to, ";
sql = sql .."message_text ";
sql = sql ..") ";
sql = sql .."VALUES ( ";
sql = sql ..":domain_uuid, ";
sql = sql ..":message_uuid, ";
sql = sql ..":user_uuid, ";
if (contact_uuid ~= null and string.len(contact_uuid) > 0) then
sql = sql ..":contact_uuid, ";
end
sql = sql ..":message_direction, ";
sql = sql .."now(), ";
sql = sql ..":message_type, ";
if (message_from ~= null and string.len(message_from) > 0) then
sql = sql ..":message_from, ";
end
sql = sql ..":message_to, ";
sql = sql ..":message_text ";
sql = sql ..") ";
--set the parameters
local params= {}
params['domain_uuid'] = domain_uuid;
params['message_uuid'] = message_uuid;
params['user_uuid'] = user_uuid;
if (contact_uuid ~= null and string.len(contact_uuid) > 0) then
params['contact_uuid'] = contact_uuid;
end
params['message_direction'] = message_direction;
params['message_type'] = message_type;
if (message_from ~= null) then
params['message_from'] = message_from;
end
params['message_to'] = message_to;
params['message_text'] = message_text;
--show debug info
if (debug["sql"]) then
freeswitch.consoleLog("notice", "[call_center] SQL: " .. sql .. "; params:" .. json.encode(params) .. "\n");
end
--run the query
dbh:query(sql, params);
end
if (to_user_exists == 'true') then
--sql statement
sql = "INSERT INTO v_messages ";
sql = sql .."( ";
sql = sql .."domain_uuid, ";
sql = sql .."message_uuid, ";
sql = sql .."user_uuid, ";
if (contact_uuid ~= null and string.len(contact_uuid) > 0) then
sql = sql .."contact_uuid, ";
end
sql = sql .."message_direction, ";
sql = sql .."message_date, ";
sql = sql .."message_type, ";
if (message_from ~= null and string.len(message_from) > 0) then
sql = sql .."message_from, ";
end
sql = sql .."message_to, ";
sql = sql .."message_text ";
sql = sql ..") ";
sql = sql .."VALUES ( ";
sql = sql ..":domain_uuid, ";
sql = sql ..":message_uuid, ";
sql = sql ..":user_uuid, ";
if (contact_uuid ~= null and string.len(contact_uuid) > 0) then
sql = sql ..":contact_uuid, ";
end
sql = sql ..":message_direction, ";
sql = sql .."now(), ";
sql = sql ..":message_type, ";
if (message_from ~= null and string.len(message_from) > 0) then
sql = sql ..":message_from, ";
end
sql = sql ..":message_to, ";
sql = sql ..":message_text ";
sql = sql ..") ";
--set the direction
message_direction = 'receive';
--get the from user_uuid
cmd = "user_data ".. to_user .."@"..to_host.." var domain_uuid";
domain_uuid = trim(api:executeString(cmd));
--get the from user_uuid
cmd = "user_data ".. to_user .."@"..to_host.." var user_uuid";
user_uuid = trim(api:executeString(cmd));
--get the from contact_uuid
cmd = "user_data ".. to_user .."@"..to_host.." var contact_uuid";
contact_uuid = trim(api:executeString(cmd));
--create a new uuid and add it to the uuid list
message_uuid = api:executeString("create_uuid");
--set the parameters
local params= {}
params['domain_uuid'] = domain_uuid;
params['message_uuid'] = message_uuid;
params['user_uuid'] = user_uuid;
if (contact_uuid ~= null and string.len(message_from) > 0) then
params['contact_uuid'] = contact_uuid;
end
params['message_direction'] = message_direction;
params['message_type'] = message_type;
params['message_from'] = message_from;
params['message_to'] = message_to;
params['message_text'] = message_text;
--show debug info
if (debug["sql"]) then
freeswitch.consoleLog("notice", "[call_center] SQL: " .. sql .. "; params:" .. json.encode(params) .. "\n");
end
--run the query
dbh:query(sql, params);
else
--get setttings needed to send the message
require "resources.functions.settings";
settings = settings(domain_uuid);
if (settings['message'] ~= nil) then
http_method = '';
if (settings['message']['http_method'] ~= nil) then
if (settings['message']['http_method']['text'] ~= nil) then
http_method = settings['message']['http_method']['text'];
end
end
http_content_type = '';
if (settings['message']['http_content_type'] ~= nil) then
if (settings['message']['http_content_type']['text'] ~= nil) then
http_content_type = settings['message']['http_content_type']['text'];
end
end
http_destination = '';
if (settings['message']['http_destination'] ~= nil) then
if (settings['message']['http_destination']['text'] ~= nil) then
http_destination = settings['message']['http_destination']['text'];
end
end
http_auth_enabled = 'false';
if (settings['message']['http_auth_enabled'] ~= nil) then
if (settings['message']['http_auth_enabled']['boolean'] ~= nil) then
http_auth_enabled = settings['message']['http_auth_enabled']['boolean'];
end
end
http_auth_type = '';
if (settings['message']['http_auth_type'] ~= nil) then
if (settings['message']['http_auth_type']['text'] ~= nil) then
http_auth_type = settings['message']['http_auth_type']['text'];
end
end
http_auth_user = '';
if (settings['message']['http_auth_user'] ~= nil) then
if (settings['message']['http_auth_user']['text'] ~= nil) then
http_auth_user = settings['message']['http_auth_user']['text'];
end
end
http_auth_password = '';
if (settings['message']['http_auth_password'] ~= nil) then
if (settings['message']['http_auth_password']['text'] ~= nil) then
http_auth_password = settings['message']['http_auth_password']['text'];
end
end
end
--get the sip user outbound_caller_id
if (from_user ~= nil and from_host ~= nil) then
cmd = "user_data ".. from_user .."@"..from_host.." var outbound_caller_id_number";
from = trim(api:executeString(cmd));
else
from = '';
end
--replace variables for their value
http_destination = http_destination:gsub("${from}", from);
--send to the provider using curl
if (to_user ~= nil) then
cmd = [[curl ]].. http_destination ..[[ ]]
cmd = cmd .. [[-H "Content-Type: ]]..http_content_type..[[" ]];
if (http_auth_type == 'basic') then
cmd = cmd .. [[-H "Authorization: Basic ]]..base64.encode(http_auth_user..":"..http_auth_password)..[[" ]];
end
cmd = cmd .. [[-d '{"to":"]]..to_user..[[","text":"]]..message_text..[["}']]
result = api:executeString("system "..cmd);
--status = os.execute (cmd);
--debug - log the command
freeswitch.consoleLog("notice", "[message] " .. cmd.. "\n");
end
end