diff --git a/resources/install/scripts/app/voicemail/index.lua b/resources/install/scripts/app/voicemail/index.lua index af2bcdce6f..a0017106a7 100644 --- a/resources/install/scripts/app/voicemail/index.lua +++ b/resources/install/scripts/app/voicemail/index.lua @@ -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 diff --git a/resources/install/scripts/app/voicemail/resources/functions/forward_to_extension.lua b/resources/install/scripts/app/voicemail/resources/functions/forward_to_extension.lua index efca1a1a2a..43c740b83c 100644 --- a/resources/install/scripts/app/voicemail/resources/functions/forward_to_extension.lua +++ b/resources/install/scripts/app/voicemail/resources/functions/forward_to_extension.lua @@ -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 diff --git a/resources/install/scripts/app/voicemail/resources/functions/menu_messages.lua b/resources/install/scripts/app/voicemail/resources/functions/menu_messages.lua index 85c1bb0606..a1555d2b69 100644 --- a/resources/install/scripts/app/voicemail/resources/functions/menu_messages.lua +++ b/resources/install/scripts/app/voicemail/resources/functions/menu_messages.lua @@ -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 diff --git a/resources/install/scripts/app/voicemail/resources/functions/message_count.lua b/resources/install/scripts/app/voicemail/resources/functions/message_count.lua new file mode 100644 index 0000000000..3bad00a8c2 --- /dev/null +++ b/resources/install/scripts/app/voicemail/resources/functions/message_count.lua @@ -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 + diff --git a/resources/install/scripts/app/voicemail/resources/functions/message_waiting.lua b/resources/install/scripts/app/voicemail/resources/functions/message_waiting.lua index 0ad91817eb..ef26819104 100644 --- a/resources/install/scripts/app/voicemail/resources/functions/message_waiting.lua +++ b/resources/install/scripts/app/voicemail/resources/functions/message_waiting.lua @@ -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 diff --git a/resources/install/scripts/app/voicemail/resources/functions/mwi_notify.lua b/resources/install/scripts/app/voicemail/resources/functions/mwi_notify.lua new file mode 100644 index 0000000000..bc7c48d9b7 --- /dev/null +++ b/resources/install/scripts/app/voicemail/resources/functions/mwi_notify.lua @@ -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 diff --git a/resources/install/scripts/app/voicemail/resources/scripts/mwi.lua b/resources/install/scripts/app/voicemail/resources/scripts/mwi.lua index be2fa5f02b..0bdb9d5ffe 100644 --- a/resources/install/scripts/app/voicemail/resources/scripts/mwi.lua +++ b/resources/install/scripts/app/voicemail/resources/scripts/mwi.lua @@ -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); diff --git a/resources/install/scripts/app/voicemail/resources/scripts/mwi_subscribe.lua b/resources/install/scripts/app/voicemail/resources/scripts/mwi_subscribe.lua index e196f539e3..067c610c31 100644 --- a/resources/install/scripts/app/voicemail/resources/scripts/mwi_subscribe.lua +++ b/resources/install/scripts/app/voicemail/resources/scripts/mwi_subscribe.lua @@ -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())