diff --git a/includes/install/scripts/voicemail.lua b/includes/install/scripts/voicemail.lua index fec2e8ab64..8211d7472e 100644 --- a/includes/install/scripts/voicemail.lua +++ b/includes/install/scripts/voicemail.lua @@ -780,85 +780,6 @@ end end ---define a function to send email - function send_email(id, uuid) - --get voicemail message details - sql = [[SELECT * FROM v_voicemails - WHERE domain_uuid = ']] .. domain_uuid ..[[' - AND voicemail_id = ']] .. id ..[[']] - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); - end - status = dbh:query(sql, function(row) - --voicemail_uuid = string.lower(row["voicemail_uuid"]); - --voicemail_password = row["voicemail_password"]; - --greeting_id = row["greeting_id"]; - voicemail_mail_to = row["voicemail_mail_to"]; - voicemail_attach_file = row["voicemail_attach_file"]; - voicemail_local_after_email = row["voicemail_local_after_email"]; - end); - - --get voicemail message details - sql = [[SELECT * FROM v_voicemail_messages - WHERE domain_uuid = ']] .. domain_uuid ..[[' - AND voicemail_message_uuid = ']] .. uuid ..[[']] - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); - end - status = dbh:query(sql, function(row) - --get the values from the database - --uuid = row["voicemail_message_uuid"]; - created_epoch = row["created_epoch"]; - caller_id_name = row["caller_id_name"]; - caller_id_number = row["caller_id_number"]; - message_length = row["message_length"]; - --message_status = row["message_status"]; - --message_priority = row["message_priority"]; - end); - - --calculate the message length - message_length_formatted = format_seconds(message_length); - if (debug["info"]) then - freeswitch.consoleLog("notice", "[voicemail] message length: " .. message_length .. "\n"); - end - - --send the email - subject = [[Voicemail from ]]..caller_id_name..[[ <]]..caller_id_number..[[> ]]..message_length_formatted; - local message = {} - table.insert(message, [[]]); - table.insert(message, [[Message From "]]..caller_id_name..[[" ]]..caller_id_number..[[
]]); - table.insert(message, [[
]]); - table.insert(message, [[Created: ]]..os.date("%A, %d %b %Y %I:%M %p", created_epoch)..[[
]]); - table.insert(message, [[Duration: ]]..message_length_formatted..[[
]]); - table.insert(message, [[Account: ]]..id..[[@]]..domain_name..[[
]]); - table.insert(message, [[
]]); - body = table.concat(message, ""); - body = body:gsub("'", "'"); - body = body:gsub([["]], """); - if (voicemail_attach_file == "true") then - file = voicemail_dir.."/"..id.."/msg_"..uuid.."."..vm_message_ext; - cmd = "luarun email.lua "..voicemail_mail_to.." "..voicemail_mail_to.." '"..subject.."' '"..body.."' '"..file.."'"; - else - cmd = "luarun email.lua "..voicemail_mail_to.." "..voicemail_mail_to.." '"..subject.."' '"..body.."'"; - end - api = freeswitch.API(); - if (debug["info"]) then - freeswitch.consoleLog("notice", "[voicemail] cmd: " .. cmd .. "\n"); - end - result = api:executeString(cmd); - - --local after email is false so delete the recording file - if (voicemail_local_after_email == "false") then - os.remove(voicemail_dir.."/"..id.."/msg_"..uuid.."."..vm_message_ext); - end - - --emailed - if (session:ready()) then - dtmf_digits = ''; - macro(session, "emailed", 1, 1000, ''); - end - end - --define a function to forward a message to an extension function forward_to_extension(uuid) @@ -975,282 +896,208 @@ end end ---leave a voicemail - if (voicemail_action == "save") then - - --voicemail prompt - if (skip_greeting == "true") then - --skip the greeting - else +--define function main menu + function main_menu () + if (voicemail_uuid) then + --clear the value + dtmf_digits = ''; + --flush dtmf digits from the input buffer + session:flushDigits(); + --new voicemail count if (session:ready()) then - if (string.len(greeting_id) > 0) then - --play the greeting - session:streamFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav"); - else - --if there is no greeting then play digits of the voicemail_id - dtmf_digits = ''; - result = macro(session, "person_not_available_record_message", 1, 100); - end - end - end - - --save the recording - timeouts = 0; - record_message(); - - --save the message to the voicemail messages - if (message_length > 2) then - local sql = {} - table.insert(sql, "INSERT INTO v_voicemail_messages "); - table.insert(sql, "("); - table.insert(sql, "voicemail_message_uuid, "); - table.insert(sql, "domain_uuid, "); - table.insert(sql, "voicemail_uuid, "); - table.insert(sql, "created_epoch, "); - table.insert(sql, "caller_id_name, "); - table.insert(sql, "caller_id_number, "); - table.insert(sql, "message_length "); - --table.insert(sql, "message_status, "); - --table.insert(sql, "message_priority, "); - table.insert(sql, ") "); - table.insert(sql, "VALUES "); - table.insert(sql, "( "); - table.insert(sql, "'".. uuid .."', "); - table.insert(sql, "'".. domain_uuid .."', "); - table.insert(sql, "'".. voicemail_uuid .."', "); - table.insert(sql, "'".. start_epoch .."', "); - table.insert(sql, "'".. caller_id_name .."', "); - table.insert(sql, "'".. caller_id_number .."', "); - table.insert(sql, "'".. message_length .."' "); - --table.insert(sql, "'".. message_status .."', "); - --table.insert(sql, "'".. message_priority .."' "); - table.insert(sql, ") "); - if (voicemail_local_after_email == "true") then - sql = table.concat(sql, "\n"); - end - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); - end - dbh:query(sql); - end - - --set the message waiting event - if (message_length > 2) then - local event = freeswitch.Event("message_waiting"); - event:addHeader("MWI-Messages-Waiting", "yes"); - event:addHeader("MWI-Message-Account", "sip:"..voicemail_id.."@"..domain_name); - event:fire(); - end - - --send the email with the voicemail recording attached - if (message_length > 2) then - if (string.len(voicemail_mail_to) > 3) then - send_email(voicemail_id, uuid); - end - end - - end - -function main_menu () - if (voicemail_uuid) then - --clear the value - dtmf_digits = ''; - --flush dtmf digits from the input buffer - session:flushDigits(); - --new voicemail count - if (session:ready()) 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) - new_messages = row["new_messages"]; - end); - dtmf_digits = macro(session, "new_messages", 1, 100, new_messages); - end - --saved voicemail count - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - sql = [[SELECT count(*) as saved_messages FROM v_voicemail_messages + sql = [[SELECT count(*) as new_messages FROM v_voicemail_messages WHERE domain_uuid = ']] .. domain_uuid ..[[' AND voicemail_uuid = ']] .. voicemail_uuid ..[[' - AND message_status = 'saved' ]]; + 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) - saved_messages = row["saved_messages"]; + new_messages = row["new_messages"]; end); - dtmf_digits = macro(session, "saved_messages", 1, 100, saved_messages); + dtmf_digits = macro(session, "new_messages", 1, 100, new_messages); end - end - --to listen to new message - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "listen_to_new_messages", 1, 100, ''); + --saved voicemail count + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + sql = [[SELECT count(*) as saved_messages FROM v_voicemail_messages + WHERE domain_uuid = ']] .. domain_uuid ..[[' + AND voicemail_uuid = ']] .. voicemail_uuid ..[[' + AND message_status = 'saved' ]]; + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); + end + status = dbh:query(sql, function(row) + saved_messages = row["saved_messages"]; + end); + dtmf_digits = macro(session, "saved_messages", 1, 100, saved_messages); + end end - end - --to listen to saved message - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "listen_to_saved_messages", 1, 100, ''); + --to listen to new message + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "listen_to_new_messages", 1, 100, ''); + end end - end - --for advanced options - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "advanced", 1, 100, ''); + --to listen to saved message + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "listen_to_saved_messages", 1, 100, ''); + end end - end - --to exit press # - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "to_exit_press", 1, 3000, ''); + --for advanced options + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "advanced", 1, 100, ''); + end end - end - --process the dtmf - if (session:ready()) then - if (dtmf_digits == "1") then - menu_messages("new"); - elseif (dtmf_digits == "2") then - menu_messages("saved"); - elseif (dtmf_digits == "5") then - timeouts = 0; - advanced(); - elseif (dtmf_digits == "0") then - session:transfer("0", "XML", context); - elseif (dtmf_digits == "*") then - dtmf_digits = ''; - macro(session, "goodbye", 1, 100, ''); - session:hangup(); - else - if (session:ready()) then - timeouts = timeouts + 1; - if (timeouts < max_timeouts) then - main_menu(); - else - macro(session, "goodbye", 1, 1000, ''); - session:hangup(); + --to exit press # + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "to_exit_press", 1, 3000, ''); + end + end + --process the dtmf + if (session:ready()) then + if (dtmf_digits == "1") then + menu_messages("new"); + elseif (dtmf_digits == "2") then + menu_messages("saved"); + elseif (dtmf_digits == "5") then + timeouts = 0; + advanced(); + elseif (dtmf_digits == "0") then + session:transfer("0", "XML", context); + elseif (dtmf_digits == "*") then + dtmf_digits = ''; + macro(session, "goodbye", 1, 100, ''); + session:hangup(); + else + if (session:ready()) then + timeouts = timeouts + 1; + if (timeouts < max_timeouts) then + main_menu(); + else + macro(session, "goodbye", 1, 1000, ''); + session:hangup(); + end end end end + end + end + +--define function to listen to the recording + function listen_to_recording (message_number, uuid, created_epoch, caller_id_name, caller_id_number) + + --set default values + dtmf_digits = ''; + max_digits = 1; + --flush dtmf digits from the input buffer + session:flushDigits(); + --set the display + if (session:ready()) then + api = freeswitch.API(); + reply = api:executeString("uuid_display "..session:get_uuid().." "..caller_id_number); + end + --say the message number + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "message_number", 1, 100, ''); + end + end + --say the number + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + session:say(message_number, default_language, "NUMBER", "pronounced"); + end + end + --say the message date + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + session:say(created_epoch, default_language, "CURRENT_DATE_TIME", "pronounced"); + end + end + --play the message + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + session:streamFile(voicemail_dir.."/"..voicemail_id.."/msg_"..uuid.."."..vm_message_ext); + session:streamFile("silence_stream://1000"); + end + end + --to listen to the recording press 1 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "listen_to_recording", 1, 100, ''); + end + end + --to save the recording press 2 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "save_recording", 1, 100, ''); + end + end + --to return the call now press 5 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "return_call", 1, 100, ''); + end + end + --to delete the recording press 7 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "delete_recording", 1, 100, ''); + end + end + --to forward this message press 8 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "to_forward_message", 1, 100, ''); + end + end + --to forward this recording to your email press 9 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "forward_to_email", 1, 3000, ''); + end + end + --wait for more digits + --if (session:ready()) then + -- if (string.len(dtmf_digits) == 0) then + -- dtmf_digits = session:getDigits(max_digits, "#", 1, 3000); + -- end + --end + --process the dtmf + if (session:ready()) then + if (dtmf_digits == "1") then + listen_to_recording(message_number, uuid, created_epoch, caller_id_name, caller_id_number); + elseif (dtmf_digits == "2") then + message_saved(voicemail_id, uuid); + macro(session, "message_saved", 1, 100, ''); + elseif (dtmf_digits == "5") then + message_saved(voicemail_id, uuid); + return_call(caller_id_number); + elseif (dtmf_digits == "7") then + delete_recording(uuid); + message_waiting(voicemail_id); + elseif (dtmf_digits == "8") then + forward_to_extension(uuid); + dtmf_digits = ''; + macro(session, "message_saved", 1, 100, ''); + elseif (dtmf_digits == "9") then + send_email(voicemail_id, uuid); + elseif (dtmf_digits == "*") then + timeouts = 0; + main_menu(); + elseif (dtmf_digits == "0") then + message_saved(voicemail_id, uuid); + session:transfer("0", "XML", context); + else + message_saved(voicemail_id, uuid); + macro(session, "message_saved", 1, 100, ''); + end end end -end - -function listen_to_recording (message_number, uuid, created_epoch, caller_id_name, caller_id_number) - - --set default values - dtmf_digits = ''; - max_digits = 1; - --flush dtmf digits from the input buffer - session:flushDigits(); - --set the display - if (session:ready()) then - api = freeswitch.API(); - reply = api:executeString("uuid_display "..session:get_uuid().." "..caller_id_number); - end - --say the message number - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "message_number", 1, 100, ''); - end - end - --say the number - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - session:say(message_number, default_language, "NUMBER", "pronounced"); - end - end - --say the message date - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - session:say(created_epoch, default_language, "CURRENT_DATE_TIME", "pronounced"); - end - end - --play the message - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - session:streamFile(voicemail_dir.."/"..voicemail_id.."/msg_"..uuid.."."..vm_message_ext); - session:streamFile("silence_stream://1000"); - end - end - --to listen to the recording press 1 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "listen_to_recording", 1, 100, ''); - end - end - --to save the recording press 2 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "save_recording", 1, 100, ''); - end - end - --to return the call now press 5 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "return_call", 1, 100, ''); - end - end - --to delete the recording press 7 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "delete_recording", 1, 100, ''); - end - end - --to forward this message press 8 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "to_forward_message", 1, 100, ''); - end - end - --to forward this recording to your email press 9 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "forward_to_email", 1, 3000, ''); - end - end - --wait for more digits - --if (session:ready()) then - -- if (string.len(dtmf_digits) == 0) then - -- dtmf_digits = session:getDigits(max_digits, "#", 1, 3000); - -- end - --end - --process the dtmf - if (session:ready()) then - if (dtmf_digits == "1") then - listen_to_recording(message_number, uuid, created_epoch, caller_id_name, caller_id_number); - elseif (dtmf_digits == "2") then - message_saved(voicemail_id, uuid); - macro(session, "message_saved", 1, 100, ''); - elseif (dtmf_digits == "5") then - message_saved(voicemail_id, uuid); - return_call(caller_id_number); - elseif (dtmf_digits == "7") then - delete_recording(uuid); - message_waiting(voicemail_id); - elseif (dtmf_digits == "8") then - forward_to_extension(uuid); - dtmf_digits = ''; - macro(session, "message_saved", 1, 100, ''); - elseif (dtmf_digits == "9") then - send_email(voicemail_id, uuid); - elseif (dtmf_digits == "*") then - timeouts = 0; - main_menu(); - elseif (dtmf_digits == "0") then - message_saved(voicemail_id, uuid); - session:transfer("0", "XML", context); - else - message_saved(voicemail_id, uuid); - macro(session, "message_saved", 1, 100, ''); - end - end -end --voicemail count if zero new messages set the mwi to no function message_waiting(voicemail_id) @@ -1291,6 +1138,99 @@ end end end +--define a function to send email + function send_email(id, uuid) + --get voicemail message details + sql = [[SELECT * FROM v_voicemails + WHERE domain_uuid = ']] .. domain_uuid ..[[' + AND voicemail_id = ']] .. id ..[[']] + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); + end + status = dbh:query(sql, function(row) + --voicemail_uuid = string.lower(row["voicemail_uuid"]); + --voicemail_password = row["voicemail_password"]; + --greeting_id = row["greeting_id"]; + voicemail_mail_to = row["voicemail_mail_to"]; + voicemail_attach_file = row["voicemail_attach_file"]; + voicemail_local_after_email = row["voicemail_local_after_email"]; + end); + + --get voicemail message details + sql = [[SELECT * FROM v_voicemail_messages + WHERE domain_uuid = ']] .. domain_uuid ..[[' + AND voicemail_message_uuid = ']] .. uuid ..[[']] + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); + end + status = dbh:query(sql, function(row) + --get the values from the database + --uuid = row["voicemail_message_uuid"]; + created_epoch = row["created_epoch"]; + caller_id_name = row["caller_id_name"]; + caller_id_number = row["caller_id_number"]; + message_length = row["message_length"]; + --message_status = row["message_status"]; + --message_priority = row["message_priority"]; + end); + + --format the message length + message_length_formatted = format_seconds(message_length); + if (debug["info"]) then + freeswitch.consoleLog("notice", "[voicemail] message length: " .. message_length .. "\n"); + end + + --send the email + subject = [[Voicemail from ]]..caller_id_name..[[ <]]..caller_id_number..[[> ]]..message_length_formatted; + local message = {} + table.insert(message, [[]]); + table.insert(message, [[Message From "]]..caller_id_name..[[" ]]..caller_id_number..[[
]]); + table.insert(message, [[
]]); + table.insert(message, [[Created: ]]..os.date("%A, %d %b %Y %I:%M %p", created_epoch)..[[
]]); + table.insert(message, [[Duration: ]]..message_length_formatted..[[
]]); + table.insert(message, [[Account: ]]..id..[[@]]..domain_name..[[
]]); + table.insert(message, [[
]]); + body = table.concat(message, ""); + body = body:gsub("'", "'"); + body = body:gsub([["]], """); + if (voicemail_attach_file == "true") then + if (voicemail_local_after_email == "false") then + delete = "true"; + else + delete = "false"; + end + file = voicemail_dir.."/"..id.."/msg_"..uuid.."."..vm_message_ext; + cmd = "luarun email.lua "..voicemail_mail_to.." "..voicemail_mail_to.." '"..subject.."' '"..body.."' '"..file.."' "..delete; + else + cmd = "luarun email.lua "..voicemail_mail_to.." "..voicemail_mail_to.." '"..subject.."' '"..body.."'"; + end + api = freeswitch.API(); + if (debug["info"]) then + freeswitch.consoleLog("notice", "[voicemail] cmd: " .. cmd .. "\n"); + end + result = api:executeString(cmd); + + --whether to keep the voicemail message and details local after email + if (voicemail_local_after_email == "false") then + --delete the voicemail message details + sql = [[DELETE FROM v_voicemail_messages + WHERE domain_uuid = ']] .. domain_uuid ..[[' + AND voicemail_message_uuid = ']] .. uuid ..[[']] + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); + end + status = dbh:query(sql); + --set message waiting indicator + message_waiting(id); + end + + --emailed + if (session:ready()) then + dtmf_digits = ''; + macro(session, "emailed", 1, 1000, ''); + end + end + --delete the recording function delete_recording(uuid) if (session:ready()) then @@ -1352,343 +1292,348 @@ end end end -function menu_messages (message_status) +--define function for messages menu + function menu_messages (message_status) - --set default values - max_timeout = 2000; - min_digits = 1; - max_digits = 1; - tries = 1; - timeout = 2000; - --clear the dtmf - dtmf_digits = ''; - --flush dtmf digits from the input buffer - session:flushDigits(); - --set the message number - message_number = 0; - --message_status new,saved - if (session:ready()) then - if (voicemail_id ~= nil) then - sql = [[SELECT * FROM v_voicemail_messages - WHERE domain_uuid = ']] .. domain_uuid ..[[' - AND voicemail_uuid = ']] .. voicemail_uuid ..[[']] - if (message_status == "new") then - sql = sql .. [[AND (message_status is null or message_status = '') ]]; - elseif (message_status == "saved") then - sql = sql .. [[AND message_status = 'saved' ]]; - end - if (debug["sql"]) then - freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); - end - status = dbh:query(sql, function(row) - --get the values from the database - --row["voicemail_message_uuid"]; - --row["created_epoch"]; - --row["caller_id_name"]; - --row["caller_id_number"]; - --row["message_length"]; - --row["message_status"]; - --row["message_priority"]; - --increment the message count - message_number = message_number + 1; - --listen to the message - if (session:ready()) then - if (debug["info"]) then - freeswitch.consoleLog("notice", message_number.." "..string.lower(row["voicemail_message_uuid"]).." "..row["created_epoch"]); - end - listen_to_recording(message_number, string.lower(row["voicemail_message_uuid"]), row["created_epoch"], row["caller_id_name"], row["caller_id_number"]); - end - end); - end - 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) - if (row["new_messages"] == "0") then - --send the message waiting event - local event = freeswitch.Event("message_waiting"); - event:addHeader("MWI-Messages-Waiting", "no"); - event:addHeader("MWI-Message-Account", "sip:"..voicemail_id.."@"..domain_name); - event:fire(); - end - end); - end - end - - --set the display - if (session:ready()) then - api = freeswitch.API(); - reply = api:executeString("uuid_display "..session:get_uuid().." "..destination_number); - end - - --send back to the main menu - if (session:ready()) then - timeouts = 0; - main_menu(); - end -end - -function advanced () - --clear the dtmf - dtmf_digits = ''; - --flush dtmf digits from the input buffer - session:flushDigits(); - --To record a greeting press 1 - if (session:ready()) then - dtmf_digits = macro(session, "to_record_greeting", 1, 100, ''); - end - --To choose greeting press 2 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "choose_greeting", 1, 100, ''); - end - end - --To record your name 3 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "to_record_name", 1, 100, ''); - end - end - --To change your password press 6 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "change_password", 1, 100, ''); - end - end - --For the main menu press 0 - if (session:ready()) then - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "main_menu", 1, 5000, ''); - end - end - --process the dtmf - if (session:ready()) then - if (dtmf_digits == "1") then - --To record a greeting press 1 - timeouts = 0; - record_greeting(); - elseif (dtmf_digits == "2") then - --To choose greeting press 2 - timeouts = 0; - choose_greeting(); - elseif (dtmf_digits == "3") then - --To record your name 3 - record_name(); - elseif (dtmf_digits == "6") then - --To change your password press 6 - change_password(voicemail_id); - elseif (dtmf_digits == "0") then - --For the main menu press 0 - timeouts = 0; - main_menu(); - else - timeouts = timeouts + 1; - if (timeouts <= max_timeouts) then - advanced(); - else - macro(session, "goodbye", 1, 1000, ''); - session:hangup(); - end - end - end -end - -function record_greeting() - - --flush dtmf digits from the input buffer - session:flushDigits(); - - --Choose a greeting between 1 and 9 - if (session:ready()) then + --set default values + max_timeout = 2000; + min_digits = 1; + max_digits = 1; + tries = 1; + timeout = 2000; + --clear the dtmf dtmf_digits = ''; - greeting_id = macro(session, "choose_greeting_choose", 1, 5000, ''); - freeswitch.consoleLog("notice", "[voicemail] greeting_id: " .. greeting_id .. "\n"); - end - - --validate the greeting_id - if (greeting_id == "1" - or greeting_id == "2" - or greeting_id == "3" - or greeting_id == "4" - or greeting_id == "5" - or greeting_id == "6" - or greeting_id == "7" - or greeting_id == "8" - or greeting_id == "9") then - --record your greeting at the tone press any key or stop talking to end the recording - if (session:ready()) then - dtmf_digits = ''; - macro(session, "record_greeting", 1, 100, ''); - end - - --record the greeting - if (session:ready()) then - max_len_seconds = 30; - silence_threshold = 30; - silence_seconds = 5; - os.execute("mkdir -p " .. voicemail_dir.."/"..voicemail_id); - -- syntax is session:recordFile(file_name, max_len_secs, silence_threshold, silence_secs) - result = session:recordFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav", max_len_seconds, silence_threshold, silence_seconds); - --session:execute("record", voicemail_dir.."/"..uuid.." 180 200"); - end - - --play the greeting - if (session:ready()) then - if (file_exists(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav")) then - session:streamFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav"); + --flush dtmf digits from the input buffer + session:flushDigits(); + --set the message number + message_number = 0; + --message_status new,saved + if (session:ready()) then + if (voicemail_id ~= nil) then + sql = [[SELECT * FROM v_voicemail_messages + WHERE domain_uuid = ']] .. domain_uuid ..[[' + AND voicemail_uuid = ']] .. voicemail_uuid ..[[']] + if (message_status == "new") then + sql = sql .. [[AND (message_status is null or message_status = '') ]]; + elseif (message_status == "saved") then + sql = sql .. [[AND message_status = 'saved' ]]; end - end - - --advanced menu - if (session:ready()) then - timeouts = 0; - advanced(); - end - else - --invalid greeting_id - if (session:ready()) then - dtmf_digits = ''; - macro(session, "choose_greeting_fail", 1, 100, ''); - end - - --send back to choose the greeting - if (session:ready()) then - timeouts = timeouts + 1; - if (timeouts < max_timeouts) then - record_greeting(); - else - timeouts = 0; - advanced(); - end - end - end -end - -function choose_greeting() - - --flush dtmf digits from the input buffer - session:flushDigits(); - - --select the greeting - if (session:ready()) then - dtmf_digits = ''; - greeting_id = macro(session, "choose_greeting_choose", 1, 5000, ''); - end - - --check to see if the greeting file exists - if (greeting_id ~= "0") then - if (not file_exists(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav")) then - --invalid greeting_id file does not exist - greeting_id = "invalid"; - end - end - - --validate the greeting_id - if (greeting_id == "0" - or greeting_id == "1" - or greeting_id == "2" - or greeting_id == "3" - or greeting_id == "4" - or greeting_id == "5" - or greeting_id == "6" - or greeting_id == "7" - or greeting_id == "8" - or greeting_id == "9") then - - --valid greeting_id update the database - if (session:ready()) then - if (greeting_id == "0") then - sql = [[UPDATE v_voicemails SET greeting_id = null ]]; - else - sql = [[UPDATE v_voicemails SET greeting_id = ']]..greeting_id..[[' ]]; - end - sql = sql ..[[WHERE domain_uuid = ']] .. domain_uuid ..[[' ]] - sql = sql ..[[AND voicemail_uuid = ']] .. voicemail_uuid ..[[' ]]; if (debug["sql"]) then freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); end - dbh:query(sql); + status = dbh:query(sql, function(row) + --get the values from the database + --row["voicemail_message_uuid"]; + --row["created_epoch"]; + --row["caller_id_name"]; + --row["caller_id_number"]; + --row["message_length"]; + --row["message_status"]; + --row["message_priority"]; + --increment the message count + message_number = message_number + 1; + --listen to the message + if (session:ready()) then + if (debug["info"]) then + freeswitch.consoleLog("notice", message_number.." "..string.lower(row["voicemail_message_uuid"]).." "..row["created_epoch"]); + end + listen_to_recording(message_number, string.lower(row["voicemail_message_uuid"]), row["created_epoch"], row["caller_id_name"], row["caller_id_number"]); + end + end); end + end - --play the greeting - if (session:ready()) then - if (file_exists(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav")) then - session:streamFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav"); + --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) + if (row["new_messages"] == "0") then + --send the message waiting event + local event = freeswitch.Event("message_waiting"); + event:addHeader("MWI-Messages-Waiting", "no"); + event:addHeader("MWI-Message-Account", "sip:"..voicemail_id.."@"..domain_name); + event:fire(); + end + end); end + end - --greeting selected - if (session:ready()) then - dtmf_digits = ''; - macro(session, "greeting_selected", 1, 100, greeting_id); + --set the display + if (session:ready()) then + api = freeswitch.API(); + reply = api:executeString("uuid_display "..session:get_uuid().." "..destination_number); + end + + --send back to the main menu + if (session:ready()) then + timeouts = 0; + main_menu(); + end + end + +--define a function for the advanced menu + function advanced () + --clear the dtmf + dtmf_digits = ''; + --flush dtmf digits from the input buffer + session:flushDigits(); + --To record a greeting press 1 + if (session:ready()) then + dtmf_digits = macro(session, "to_record_greeting", 1, 100, ''); + end + --To choose greeting press 2 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "choose_greeting", 1, 100, ''); end - - --advanced menu - if (session:ready()) then + end + --To record your name 3 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "to_record_name", 1, 100, ''); + end + end + --To change your password press 6 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "change_password", 1, 100, ''); + end + end + --For the main menu press 0 + if (session:ready()) then + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "main_menu", 1, 5000, ''); + end + end + --process the dtmf + if (session:ready()) then + if (dtmf_digits == "1") then + --To record a greeting press 1 timeouts = 0; - advanced(); - end - else - --invalid greeting_id - if (session:ready()) then - dtmf_digits = ''; - greeting_id = macro(session, "choose_greeting_fail", 1, 100, ''); - end - - --send back to choose the greeting - if (session:ready()) then + record_greeting(); + elseif (dtmf_digits == "2") then + --To choose greeting press 2 + timeouts = 0; + choose_greeting(); + elseif (dtmf_digits == "3") then + --To record your name 3 + record_name(); + elseif (dtmf_digits == "6") then + --To change your password press 6 + change_password(voicemail_id); + elseif (dtmf_digits == "0") then + --For the main menu press 0 + timeouts = 0; + main_menu(); + else timeouts = timeouts + 1; - if (timeouts < max_timeouts) then - choose_greeting(); - else - timeouts = 0; + if (timeouts <= max_timeouts) then advanced(); + else + macro(session, "goodbye", 1, 1000, ''); + session:hangup(); end end - end + end + end -end - -function record_name() - if (session:ready()) then +--define a function to record the greeting + function record_greeting() --flush dtmf digits from the input buffer session:flushDigits(); - --play the name record - dtmf_digits = ''; - macro(session, "record_name", 1, 100, ''); + --Choose a greeting between 1 and 9 + if (session:ready()) then + dtmf_digits = ''; + greeting_id = macro(session, "choose_greeting_choose", 1, 5000, ''); + freeswitch.consoleLog("notice", "[voicemail] greeting_id: " .. greeting_id .. "\n"); + end - --save the recording - -- syntax is session:recordFile(file_name, max_len_secs, silence_threshold, silence_secs) - max_len_seconds = 30; - silence_threshold = 30; - silence_seconds = 5; - os.execute("mkdir -p " .. voicemail_dir.."/"..voicemail_id); - result = session:recordFile(voicemail_dir.."/"..voicemail_id.."/recorded_name.wav", max_len_seconds, silence_threshold, silence_seconds); - --session:execute("record", voicemail_dir.."/"..uuid.." 180 200"); + --validate the greeting_id + if (greeting_id == "1" + or greeting_id == "2" + or greeting_id == "3" + or greeting_id == "4" + or greeting_id == "5" + or greeting_id == "6" + or greeting_id == "7" + or greeting_id == "8" + or greeting_id == "9") then + --record your greeting at the tone press any key or stop talking to end the recording + if (session:ready()) then + dtmf_digits = ''; + macro(session, "record_greeting", 1, 100, ''); + end - --play the greeting - session:streamFile(voicemail_dir.."/"..voicemail_id.."/recorded_name.wav"); + --record the greeting + if (session:ready()) then + max_len_seconds = 30; + silence_threshold = 30; + silence_seconds = 5; + os.execute("mkdir -p " .. voicemail_dir.."/"..voicemail_id); + -- syntax is session:recordFile(file_name, max_len_secs, silence_threshold, silence_secs) + result = session:recordFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav", max_len_seconds, silence_threshold, silence_seconds); + --session:execute("record", voicemail_dir.."/"..uuid.." 180 200"); + end - --message saved - dtmf_digits = ''; - macro(session, "message_saved", 1, 100, ''); + --play the greeting + if (session:ready()) then + if (file_exists(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav")) then + session:streamFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav"); + end + end - --advanced menu - timeouts = 0; - advanced(); + --advanced menu + if (session:ready()) then + timeouts = 0; + advanced(); + end + else + --invalid greeting_id + if (session:ready()) then + dtmf_digits = ''; + macro(session, "choose_greeting_fail", 1, 100, ''); + end + + --send back to choose the greeting + if (session:ready()) then + timeouts = timeouts + 1; + if (timeouts < max_timeouts) then + record_greeting(); + else + timeouts = 0; + advanced(); + end + end + end + end + +--define a function to choose the greeting + function choose_greeting() + + --flush dtmf digits from the input buffer + session:flushDigits(); + + --select the greeting + if (session:ready()) then + dtmf_digits = ''; + greeting_id = macro(session, "choose_greeting_choose", 1, 5000, ''); + end + + --check to see if the greeting file exists + if (greeting_id ~= "0") then + if (not file_exists(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav")) then + --invalid greeting_id file does not exist + greeting_id = "invalid"; + end + end + + --validate the greeting_id + if (greeting_id == "0" + or greeting_id == "1" + or greeting_id == "2" + or greeting_id == "3" + or greeting_id == "4" + or greeting_id == "5" + or greeting_id == "6" + or greeting_id == "7" + or greeting_id == "8" + or greeting_id == "9") then + + --valid greeting_id update the database + if (session:ready()) then + if (greeting_id == "0") then + sql = [[UPDATE v_voicemails SET greeting_id = null ]]; + else + sql = [[UPDATE v_voicemails SET greeting_id = ']]..greeting_id..[[' ]]; + end + sql = sql ..[[WHERE domain_uuid = ']] .. domain_uuid ..[[' ]] + sql = sql ..[[AND voicemail_uuid = ']] .. voicemail_uuid ..[[' ]]; + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); + end + dbh:query(sql); + end + + --play the greeting + if (session:ready()) then + if (file_exists(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav")) then + session:streamFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav"); + end + end + + --greeting selected + if (session:ready()) then + dtmf_digits = ''; + macro(session, "greeting_selected", 1, 100, greeting_id); + end + + --advanced menu + if (session:ready()) then + timeouts = 0; + advanced(); + end + else + --invalid greeting_id + if (session:ready()) then + dtmf_digits = ''; + greeting_id = macro(session, "choose_greeting_fail", 1, 100, ''); + end + + --send back to choose the greeting + if (session:ready()) then + timeouts = timeouts + 1; + if (timeouts < max_timeouts) then + choose_greeting(); + else + timeouts = 0; + advanced(); + end + end + end + + end + +--define a function to record the name + function record_name() + if (session:ready()) then + + --flush dtmf digits from the input buffer + session:flushDigits(); + + --play the name record + dtmf_digits = ''; + macro(session, "record_name", 1, 100, ''); + + --save the recording + -- syntax is session:recordFile(file_name, max_len_secs, silence_threshold, silence_secs) + max_len_seconds = 30; + silence_threshold = 30; + silence_seconds = 5; + os.execute("mkdir -p " .. voicemail_dir.."/"..voicemail_id); + result = session:recordFile(voicemail_dir.."/"..voicemail_id.."/recorded_name.wav", max_len_seconds, silence_threshold, silence_seconds); + --session:execute("record", voicemail_dir.."/"..uuid.." 180 200"); + + --play the greeting + session:streamFile(voicemail_dir.."/"..voicemail_id.."/recorded_name.wav"); + + --message saved + dtmf_digits = ''; + macro(session, "message_saved", 1, 100, ''); + + --advanced menu + timeouts = 0; + advanced(); + end end -end --check voicemail if (voicemail_action == "check") then @@ -1700,6 +1645,79 @@ end end end +--leave a voicemail + if (voicemail_action == "save") then + + --voicemail prompt + if (skip_greeting == "true") then + --skip the greeting + else + if (session:ready()) then + if (string.len(greeting_id) > 0) then + --play the greeting + session:streamFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav"); + else + --if there is no greeting then play digits of the voicemail_id + dtmf_digits = ''; + result = macro(session, "person_not_available_record_message", 1, 100); + end + end + end + + --save the recording + timeouts = 0; + record_message(); + + --save the message to the voicemail messages + if (message_length > 2) then + local sql = {} + table.insert(sql, "INSERT INTO v_voicemail_messages "); + table.insert(sql, "("); + table.insert(sql, "voicemail_message_uuid, "); + table.insert(sql, "domain_uuid, "); + table.insert(sql, "voicemail_uuid, "); + table.insert(sql, "created_epoch, "); + table.insert(sql, "caller_id_name, "); + table.insert(sql, "caller_id_number, "); + table.insert(sql, "message_length "); + --table.insert(sql, "message_status, "); + --table.insert(sql, "message_priority, "); + table.insert(sql, ") "); + table.insert(sql, "VALUES "); + table.insert(sql, "( "); + table.insert(sql, "'".. uuid .."', "); + table.insert(sql, "'".. domain_uuid .."', "); + table.insert(sql, "'".. voicemail_uuid .."', "); + table.insert(sql, "'".. start_epoch .."', "); + table.insert(sql, "'".. caller_id_name .."', "); + table.insert(sql, "'".. caller_id_number .."', "); + table.insert(sql, "'".. message_length .."' "); + --table.insert(sql, "'".. message_status .."', "); + --table.insert(sql, "'".. message_priority .."' "); + table.insert(sql, ") "); + sql = table.concat(sql, "\n"); + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); + end + dbh:query(sql); + end + + --set the message waiting event + if (message_length > 2) then + local event = freeswitch.Event("message_waiting"); + event:addHeader("MWI-Messages-Waiting", "yes"); + event:addHeader("MWI-Message-Account", "sip:"..voicemail_id.."@"..domain_name); + event:fire(); + end + + --send the email with the voicemail recording attached + if (message_length > 2) then + if (string.len(voicemail_mail_to) > 3) then + send_email(voicemail_id, uuid); + end + end + end + --notes --record the video --records audio only