mirror of
https://github.com/fusionpbx/fusionpbx.git
synced 2026-01-06 11:43:50 +00:00
Fix. Send message count in each MWI notify. (#1728)
* move send event code to separate function * move get message count to separate function
This commit is contained in:
committed by
FusionPBX
parent
9f1f38c4be
commit
dc3575c05c
@@ -235,6 +235,8 @@
|
||||
require "app.voicemail.resources.functions.record_greeting";
|
||||
require "app.voicemail.resources.functions.choose_greeting";
|
||||
require "app.voicemail.resources.functions.record_name";
|
||||
require "app.voicemail.resources.functions.message_count"
|
||||
require "app.voicemail.resources.functions.mwi_notify";
|
||||
|
||||
--send a message waiting event
|
||||
if (voicemail_action == "mwi") then
|
||||
|
||||
@@ -137,11 +137,13 @@
|
||||
dbh:query(sql);
|
||||
end
|
||||
|
||||
--set the message waiting event
|
||||
local event = freeswitch.Event("message_waiting");
|
||||
event:addHeader("MWI-Messages-Waiting", "yes");
|
||||
event:addHeader("MWI-Message-Account", "sip:"..forward_voicemail_id.."@"..domain_name);
|
||||
event:fire();
|
||||
--get new and saved message counts
|
||||
local new_messages, saved_messages = message_count_by_id(
|
||||
forward_voicemail_id, domain_uuid
|
||||
)
|
||||
|
||||
--send the message waiting event
|
||||
mwi_notify(forward_voicemail_id.."@"..domain_name, new_messages, saved_messages)
|
||||
|
||||
--if local after email is true then copy the recording file
|
||||
if (storage_type ~= "base64") then
|
||||
|
||||
@@ -76,27 +76,13 @@
|
||||
end
|
||||
|
||||
--voicemail count if zero new messages set the mwi to no
|
||||
if (session:ready()) then
|
||||
if (voicemail_id ~= nil) then
|
||||
sql = [[SELECT count(*) as new_messages FROM v_voicemail_messages
|
||||
WHERE domain_uuid = ']] .. domain_uuid ..[['
|
||||
AND voicemail_uuid = ']] .. voicemail_uuid ..[['
|
||||
AND (message_status is null or message_status = '') ]];
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n");
|
||||
end
|
||||
status = dbh:query(sql, function(row)
|
||||
--send the message waiting event
|
||||
local event = freeswitch.Event("message_waiting");
|
||||
if (row["new_messages"] == "0") then
|
||||
event:addHeader("MWI-Messages-Waiting", "no");
|
||||
else
|
||||
event:addHeader("MWI-Messages-Waiting", "yes");
|
||||
end
|
||||
event:addHeader("MWI-Message-Account", "sip:"..voicemail_id.."@"..domain_name);
|
||||
event:fire();
|
||||
end);
|
||||
end
|
||||
if session:ready() and voicemail_id and voicemail_uuid and #voicemail_uuid > 0 then
|
||||
--get new and saved message counts
|
||||
local new_messages, saved_messages = message_count_by_uuid(
|
||||
voicemail_uuid, domain_uuid
|
||||
)
|
||||
--send the message waiting event
|
||||
mwi_notify(voicemail_id.."@"..domain_name, new_messages, saved_messages)
|
||||
end
|
||||
|
||||
--set the display
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
local log = require "resources.functions.log"["voicemail-count"]
|
||||
|
||||
-- Tested SQL on SQLite 3, PgSQL 9.5, MySQL 5.5 and MariaDB 10
|
||||
|
||||
local message_count_by_uuid_sql = [[SELECT
|
||||
( SELECT count(*)
|
||||
FROM v_voicemail_messages
|
||||
WHERE voicemail_uuid = '%s'
|
||||
AND (message_status is null or message_status = '')
|
||||
) as new_messages,
|
||||
|
||||
( SELECT count(*)
|
||||
FROM v_voicemail_messages
|
||||
WHERE voicemail_uuid = '%s'
|
||||
AND message_status = 'saved'
|
||||
) as saved_messages
|
||||
]]
|
||||
|
||||
function message_count_by_uuid(voicemail_uuid)
|
||||
local new_messages, saved_messages = "0", "0"
|
||||
|
||||
local sql = string.format(message_count_by_uuid_sql,
|
||||
voicemail_uuid, voicemail_uuid
|
||||
)
|
||||
|
||||
if debug["sql"] then
|
||||
log.noticef("SQL: %s", sql)
|
||||
end
|
||||
|
||||
dbh:query(sql, function(row)
|
||||
new_messages, saved_messages = row.new_messages, row.saved_messages
|
||||
end)
|
||||
|
||||
if debug["info"] then
|
||||
log.noticef("mailbox uuid: %s messages: %s/%s", voicemail_uuid, new_messages, saved_messages)
|
||||
end
|
||||
|
||||
return new_messages, saved_messages
|
||||
end
|
||||
|
||||
local message_count_by_id_sql = [[SELECT
|
||||
( SELECT count(*)
|
||||
FROM v_voicemail_messages as m inner join v_voicemails as v
|
||||
on v.voicemail_uuid = m.voicemail_uuid
|
||||
WHERE v.voicemail_id = '%s' AND v.domain_uuid = '%s'
|
||||
AND (m.message_status is null or m.message_status = '')
|
||||
) as new_messages,
|
||||
|
||||
( SELECT count(*)
|
||||
FROM v_voicemail_messages as m inner join v_voicemails as v
|
||||
on v.voicemail_uuid = m.voicemail_uuid
|
||||
WHERE v.voicemail_id = '%s' AND v.domain_uuid = '%s'
|
||||
AND m.message_status = 'saved'
|
||||
) as saved_messages
|
||||
]]
|
||||
|
||||
function message_count_by_id(voicemail_id, domain_uuid)
|
||||
local new_messages, saved_messages = "0", "0"
|
||||
|
||||
local sql = string.format(message_count_by_id_sql,
|
||||
voicemail_id, domain_uuid, voicemail_id, domain_uuid
|
||||
)
|
||||
|
||||
if debug["sql"] then
|
||||
log.noticef("SQL: %s", sql)
|
||||
end
|
||||
|
||||
dbh:query(sql, function(row)
|
||||
new_messages, saved_messages = row.new_messages, row.saved_messages
|
||||
end)
|
||||
|
||||
if debug["info"] then
|
||||
log.noticef("mailbox: %s messages: %s/%s", voicemail_id, new_messages, saved_messages)
|
||||
end
|
||||
|
||||
return new_messages, saved_messages
|
||||
end
|
||||
|
||||
@@ -29,13 +29,13 @@
|
||||
local accounts = {}
|
||||
table.insert(accounts, voicemail_id);
|
||||
--get the voicemail id and all related mwi accounts
|
||||
sql = [[SELECT extension, number_alias from v_extensions
|
||||
local sql = [[SELECT extension, number_alias from v_extensions
|
||||
WHERE domain_uuid = ']] .. domain_uuid ..[['
|
||||
AND (mwi_account = ']]..voicemail_id..[[' or mwi_account = ']]..voicemail_id..[[@]]..domain_name..[[')]];
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n");
|
||||
end
|
||||
status = dbh:query(sql, function(row)
|
||||
dbh:query(sql, function(row)
|
||||
if (string.len(row["number_alias"]) > 0) then
|
||||
table.insert(accounts, row["number_alias"]);
|
||||
else
|
||||
@@ -43,35 +43,21 @@
|
||||
end
|
||||
end);
|
||||
|
||||
--get the message count
|
||||
sql = [[SELECT count(*) as message_count FROM v_voicemail_messages as m, v_voicemails as v
|
||||
WHERE v.domain_uuid = ']] .. domain_uuid ..[['
|
||||
AND v.voicemail_uuid = m.voicemail_uuid
|
||||
AND v.voicemail_id = ']] .. voicemail_id ..[['
|
||||
AND (m.message_status is null or m.message_status = '') ]];
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n");
|
||||
end
|
||||
status = dbh:query(sql, function(row)
|
||||
message_count = row["message_count"];
|
||||
end);
|
||||
--get new and saved message counts
|
||||
local new_messages, saved_messages = message_count_by_id(
|
||||
voicemail_id, domain_uuid
|
||||
)
|
||||
|
||||
--send the message waiting event
|
||||
for key,value in pairs(accounts) do
|
||||
local event = freeswitch.Event("message_waiting");
|
||||
if (message_count == "0") then
|
||||
if (debug["info"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] mailbox: "..value.."@"..domain_name.." messages: " .. message_count .. " no messages\n");
|
||||
for _,value in ipairs(accounts) do
|
||||
local account = value.."@"..domain_name
|
||||
mwi_notify(account, new_messages, saved_messages)
|
||||
if (debug["info"]) then
|
||||
if new_messages == "0" then
|
||||
freeswitch.consoleLog("notice", "[voicemail] mailbox: "..account.." messages: no new messages\n");
|
||||
else
|
||||
freeswitch.consoleLog("notice", "[voicemail] mailbox: "..account.." messages: " .. new_messages .. " new message(s)\n");
|
||||
end
|
||||
event:addHeader("MWI-Messages-Waiting", "no");
|
||||
else
|
||||
if (debug["info"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] mailbox: "..voicemail_id.."@"..domain_name.." messages: " .. message_count .. " \n");
|
||||
end
|
||||
event:addHeader("MWI-Messages-Waiting", "yes");
|
||||
end
|
||||
event:addHeader("MWI-Message-Account", "sip:"..value.."@"..domain_name);
|
||||
event:addHeader("MWI-Voice-Message", message_count.."/0 ("..message_count.."/0)");
|
||||
event:fire();
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
--define a function to send email
|
||||
function mwi_notify(account, new_messages, saved_messages)
|
||||
new_messages = tonumber(new_messages) or 0
|
||||
saved_messages = tonumber(saved_messages) or 0
|
||||
|
||||
local event = freeswitch.Event("message_waiting")
|
||||
event:addHeader("MWI-Messages-Waiting", (new_messages == 0) and "no" or "yes")
|
||||
event:addHeader("MWI-Message-Account", "sip:" .. account)
|
||||
event:addHeader("MWI-Voice-Message", string.format("%d/%d (0/0)", new_messages, saved_messages))
|
||||
return event:fire()
|
||||
end
|
||||
|
||||
--return module value
|
||||
return mwi_notify
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
--only run the script a single time
|
||||
runonce = true
|
||||
|
||||
--connect to the database
|
||||
require "resources.functions.database_handle";
|
||||
dbh = database_handle('system');
|
||||
@@ -52,6 +53,12 @@
|
||||
--check if a file exists
|
||||
require "resources.functions.file_exists";
|
||||
|
||||
--send MWI NOTIFY message
|
||||
require "app.voicemail.resources.functions.mwi_notify"
|
||||
|
||||
--get message count for mailbox
|
||||
require "app.voicemail.resources.functions.message_count"
|
||||
|
||||
--create the api object
|
||||
api = freeswitch.API();
|
||||
|
||||
@@ -65,7 +72,7 @@
|
||||
end
|
||||
|
||||
--Send MWI events for voicemail boxes with messages
|
||||
sql = [[SELECT v.voicemail_id, v.voicemail_uuid, v.domain_uuid, d.domain_name, COUNT(*) AS message_count
|
||||
local sql = [[SELECT v.voicemail_id, v.voicemail_uuid, v.domain_uuid, d.domain_name, COUNT(*) AS message_count
|
||||
FROM v_voicemail_messages as m, v_voicemails as v, v_domains as d
|
||||
WHERE v.voicemail_uuid = m.voicemail_uuid
|
||||
AND v.domain_uuid = d.domain_uuid
|
||||
@@ -73,43 +80,20 @@
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n");
|
||||
end
|
||||
status = dbh:query(sql, function(row)
|
||||
dbh:query(sql, function(row)
|
||||
|
||||
--get saved and new message counts
|
||||
sql = [[SELECT count(*) as new_messages FROM v_voicemail_messages
|
||||
WHERE domain_uuid = ']] .. row["domain_uuid"] ..[['
|
||||
AND voicemail_uuid = ']] .. row["voicemail_uuid"] ..[['
|
||||
AND (message_status is null or message_status = '') ]];
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n");
|
||||
end
|
||||
status = dbh:query(sql, function(r)
|
||||
new_messages = r["new_messages"];
|
||||
end);
|
||||
sql = [[SELECT count(*) as saved_messages FROM v_voicemail_messages
|
||||
WHERE domain_uuid = ']] .. row["domain_uuid"] ..[['
|
||||
AND voicemail_uuid = ']] .. row["voicemail_uuid"] ..[['
|
||||
AND message_status = 'saved' ]];
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n");
|
||||
end
|
||||
status = dbh:query(sql, function(r)
|
||||
saved_messages = r["saved_messages"];
|
||||
end);
|
||||
local new_messages, saved_messages = message_count_by_uuid(
|
||||
row["voicemail_uuid"], row["domain_uuid"]
|
||||
)
|
||||
|
||||
--send the message waiting event
|
||||
local event = freeswitch.Event("message_waiting");
|
||||
if (new_messages == "0") then
|
||||
event:addHeader("MWI-Messages-Waiting", "no");
|
||||
else
|
||||
event:addHeader("MWI-Messages-Waiting", "yes");
|
||||
end
|
||||
event:addHeader("MWI-Message-Account", "sip:"..row["voicemail_id"].."@"..row["domain_name"]);
|
||||
event:addHeader("MWI-Voice-Message", new_messages.."/"..saved_messages.." (0/0)");
|
||||
event:fire();
|
||||
local account = row["voicemail_id"].."@"..row["domain_name"]
|
||||
mwi_notify(account, new_messages, saved_messages)
|
||||
|
||||
--log to console
|
||||
if (debug["info"]) then
|
||||
freeswitch.consoleLog("notice", "[voicemail] mailbox: "..row["voicemail_id"].."@"..row["domain_name"].." messages: " .. row["message_count"] .. " \n");
|
||||
freeswitch.consoleLog("notice", "[voicemail] mailbox: "..account.." messages: " .. (new_messages or "0") .. "/" .. (saved_messages or "0") .. " \n");
|
||||
end
|
||||
end);
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ local ievents = require "resources.functions.ievents"
|
||||
local IntervalTimer = require "resources.functions.interval_timer"
|
||||
local cache = require "resources.functions.cache"
|
||||
local api = require "resources.functions.api"
|
||||
local mwi_notify = require "app.voicemail.resources.functions.mwi_notify"
|
||||
|
||||
local vm_to_uuid_sql = [[SELECT v.voicemail_uuid
|
||||
FROM v_voicemails as v inner join v_domains as d on v.domain_uuid = d.domain_uuid
|
||||
@@ -79,18 +80,6 @@ local function vm_message_count(account, use_cache)
|
||||
return row.new_messages, row.saved_messages
|
||||
end
|
||||
|
||||
local function mwi_notify(account, new_messages, saved_messages)
|
||||
local event = freeswitch.Event("message_waiting")
|
||||
if (new_messages == "0") then
|
||||
event:addHeader("MWI-Messages-Waiting", "no")
|
||||
else
|
||||
event:addHeader("MWI-Messages-Waiting", "yes")
|
||||
end
|
||||
event:addHeader("MWI-Message-Account", "sip:" .. account)
|
||||
event:addHeader("MWI-Voice-Message", new_messages.."/"..saved_messages.." (0/0)")
|
||||
return event:fire()
|
||||
end
|
||||
|
||||
local sleep = 60000
|
||||
local pid_file = scripts_dir .. "/run/mwi_subscribe.tmp"
|
||||
local pid = api:execute("create_uuid") or tostring(api:getTime())
|
||||
|
||||
Reference in New Issue
Block a user