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:
Alexey Melnichuk
2016-07-01 19:08:55 +03:00
committed by FusionPBX
parent 9f1f38c4be
commit dc3575c05c
8 changed files with 140 additions and 98 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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())