diff --git a/includes/install/scripts/voicemail.lua b/includes/install/scripts/voicemail.lua index f347377b42..9aaf46a4b5 100644 --- a/includes/install/scripts/voicemail.lua +++ b/includes/install/scripts/voicemail.lua @@ -112,13 +112,13 @@ --get the voicemail id function get_voicemail_id() - voicemail_id = macro(session, "voicemail_id", 5000, ''); - if (string.len(voicemail_id) == 0) then + id = macro(session, "voicemail_id", 5000, ''); + if (string.len(id) == 0) then if (session:ready()) then - voicemail_id = get_voicemail_id(); + id = get_voicemail_id(); end else - return voicemail_id; + return id; end end @@ -152,7 +152,7 @@ --compare the password from the database with the password provided by the user if (voicemail_password ~= password) then --incorrect password - macro(session, "password_not_valid", 2000, ''); + macro(session, "password_not_valid", 1000, ''); if (session:ready()) then check_password(voicemail_id); end @@ -443,31 +443,35 @@ table.insert(actions, {app="playAndGetDigits",data="digits/5.wav"}); end --To forward this message press 8 - if (name == "forward_message") then + if (name == "to_forward_message") then actions = {} - table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-zzz.wav"}); + table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-to_forward.wav"}); table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-press.wav"}); table.insert(actions, {app="playAndGetDigits",data="digits/8.wav"}); end - --To add an introduction to this message press 1 - --if (name == "add_prefix_to_message") then - -- actions = {} - -- table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-zzz.wav"}); - -- table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-press.wav"}); - -- table.insert(actions, {app="playAndGetDigits",data="digits/1.wav"}); - --end - --To send this message now press 2 - --if (name == "send_message") then - -- actions = {} - -- table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-zzz.wav"}); - -- table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-press.wav"}); - -- table.insert(actions, {app="playAndGetDigits",data="digits/2.wav"}); - --end - --please enter the extension to send this message to followed by # - --if (name == "send_message_to_extension") then - -- actions = {} - -- table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-zzz.wav"}); - --end + --Please enter the extension to forward this message to followed by # + if (name == "forward_enter_extension") then + actions = {} + table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-forward_enter_ext.wav"}); + table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-followed_by_pound.wav"}); + end + --To forward this recording to your email press 9 + if (name == "forward_to_email") then + actions = {} + table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-forward_to_email.wav"}); + table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-press.wav"}); + table.insert(actions, {app="playAndGetDigits",data="digits/9.wav"}); + end + --Emailed + if (name == "emailed") then + actions = {} + table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-emailed.wav"}); + end + --Please enter the extension to send this message to followed by # + --if (name == "send_message_to_extension") then + -- actions = {} + -- table.insert(actions, {app="playAndGetDigits",data="voicemail/vm-zzz.wav"}); + --end --Message saved if (name == "message_saved") then actions = {} @@ -559,7 +563,7 @@ --save the recording function record_message() --record your message at the tone press any key or stop talking to end the recording - result = macro(session, "record_message", 200); + result = macro(session, "record_message", 100); --start epoch start_epoch = os.time(); @@ -587,7 +591,7 @@ if (message_length < 4) then if (session:ready()) then --your recording is below the minimal acceptable length, please try again - macro(session, "too_small", 200); + macro(session, "too_small", 100); --record your message at the tone record_message(); end @@ -603,11 +607,11 @@ dtmf_digits = ''; --to listen to the recording press 1 if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "to_listen_to_recording", 200, ''); + dtmf_digits = macro(session, "to_listen_to_recording", 100, ''); end --to save the recording press 2 if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "to_save_recording", 200, ''); + dtmf_digits = macro(session, "to_save_recording", 100, ''); end --to re-record press 3 if (string.len(dtmf_digits) == 0) then @@ -621,8 +625,8 @@ record_menu(); elseif (dtmf_digits == "2") then --save the message - macro(session, "message_saved", 200, ''); - macro(session, "goodbye", 200, ''); + macro(session, "message_saved", 100, ''); + macro(session, "goodbye", 100, ''); --hangup the call session:hangup(); elseif (dtmf_digits == "3") then @@ -630,7 +634,7 @@ record_message(); elseif (dtmf_digits == "*") then --hangup - macro(session, "goodbye", 200, ''); + macro(session, "goodbye", 100, ''); session:hangup(); else if (session:ready()) then @@ -639,6 +643,157 @@ end end +--define a function to send email + function send_email(uuid) + --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); + freeswitch.consoleLog("notice", "[voicemail] message length: " .. message_length .. "\n"); + + --send the email + message = [[ + Message From "]]..caller_id_name..[[" ]]..caller_id_number..[[
+
+ Created: ]]..os.date("%A, %d %b %Y %I:%M %p", start_epoch)..[[
+ Duration: ]]..message_length_formatted..[[
+ Account: ]]..voicemail_id..[[@]]..domain_name..[[
+
]]; + if (voicemail_attach_file == "true") then + freeswitch.email("", + "", + "To: "..voicemail_mail_to.."\nFrom: "..voicemail_mail_to.."\nSubject: Voicemail from "..caller_id_name.." <"..caller_id_number.."> "..message_length_formatted, + message, + voicemail_dir.."/"..voicemail_id.."/msg_"..uuid..".wav" + ); + else + freeswitch.email("", + "", + "To: "..voicemail_mail_to.."\nFrom: "..voicemail_mail_to.."\nSubject: Voicemail from "..caller_id_name.." <"..caller_id_number.."> "..message_length_formatted, + message + ); + end + end + +--define a function to forward a message to an extension + function forward_to_extension(uuid) + --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 + 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); + + --request the forward_voicemail_id + forward_voicemail_id = macro(session, "forward_enter_extension", 7000, ''); + if (string.len(forward_voicemail_id) == 0) then + forward_voicemail_id = macro(session, "forward_enter_extension", 7000, ''); + end + if (string.len(forward_voicemail_id) == 0) then + forward_voicemail_id = macro(session, "forward_enter_extension", 7000, ''); + end + + --get the voicemail settings using the voicemail_uuid + sql = [[SELECT * FROM v_voicemails + WHERE domain_uuid = ']] .. domain_uuid ..[[' + AND voicemail_id = ']] .. forward_voicemail_id ..[[' + AND voicemail_enabled = 'true' ]]; + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "\n"); + end + status = dbh:query(sql, function(row) + forward_voicemail_uuid = string.lower(row["voicemail_uuid"]); + forward_voicemail_mail_to = row["voicemail_mail_to"]; + forward_voicemail_attach_file = row["voicemail_attach_file"]; + forward_voicemail_local_after_email = row["voicemail_local_after_email"]; + end); + + --set default values + if (string.len(forward_voicemail_attach_file) == 0) then + forward_voicemail_attach_file = "true"; + end + if (string.len(forward_voicemail_local_after_email) == 0) then + forward_voicemail_local_after_email = "true"; + end + + --save the message to the voicemail messages + 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, "'".. forward_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, ") "); + 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); + + --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(); + + --local after email is true so copy the recording file + if (voicemail_local_after_email == "true") then + os.execute("mkdir -p " .. voicemail_dir.."/"..forward_voicemail_id); + os.execute("cp "..voicemail_dir.."/"..voicemail_id.."/msg_"..uuid..".wav "..voicemail_dir.."/"..forward_voicemail_id.."/msg_"..uuid..".wav"); + end + + --send the email with the voicemail recording attached + if (string.len(forward_voicemail_mail_to) > 3) then + send_email(uuid); + end + end + --leave a voicemail if (voicemail_action == "save") then @@ -648,43 +803,12 @@ session:streamFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav"); else --if there is no greeting then play digits of the voicemail_id - result = macro(session, "person_not_available_record_message", 200); + result = macro(session, "person_not_available_record_message", 100); end --save the recording record_message(); - --set the message waiting event - local event = freeswitch.Event("message_waiting"); - event:addHeader("MWI-Messages-Waiting", "yes"); - event:addHeader("MWI-Message-Account", "sip:"..voicemail_id.."@"..domain_name); - event:fire(); - - --send the email with the voicemail recording attached - if (string.len(voicemail_mail_to) > 3) then - message = [[ - Message From "]]..caller_id_name..[[" ]]..caller_id_number..[[
-
- Created: ]]..os.date("%A, %d %b %Y %I:%M %p", start_epoch)..[[
- Duration: ]]..message_length_formatted..[[
- Account: ]]..voicemail_id..[[@]]..domain_name..[[
-
]]; - if (voicemail_attach_file == "true") then - freeswitch.email("", - "", - "To: "..voicemail_mail_to.."\nFrom: "..voicemail_mail_to.."\nSubject: Voicemail from "..caller_id_name.." <"..caller_id_number.."> "..message_length_formatted, - message, - voicemail_dir.."/"..voicemail_id.."/msg_"..uuid..".wav" - ); - else - freeswitch.email("", - "", - "To: "..voicemail_mail_to.."\nFrom: "..voicemail_mail_to.."\nSubject: Voicemail from "..caller_id_name.." <"..caller_id_number.."> "..message_length_formatted, - message - ); - end - end - --save the message to the voicemail messages local sql = {} table.insert(sql, "INSERT INTO v_voicemail_messages "); @@ -719,6 +843,17 @@ end dbh:query(sql); + --set the message waiting event + local event = freeswitch.Event("message_waiting"); + event:addHeader("MWI-Messages-Waiting", "yes"); + event:addHeader("MWI-Message-Account", "sip:"..voicemail_id.."@"..domain_name); + event:fire(); + + --send the email with the voicemail recording attached + if (string.len(voicemail_mail_to) > 3) then + send_email(uuid); + end + --local after email is false so delete the recording file if (voicemail_local_after_email == "false") then os.remove(voicemail_dir.."/"..voicemail_id.."/msg_"..uuid..".wav"); @@ -737,7 +872,7 @@ function main_menu () status = dbh:query(sql, function(row) new_messages = row["new_messages"]; end); - dtmf_digits = macro(session, "new_messages", 200, new_messages); + dtmf_digits = macro(session, "new_messages", 100, new_messages); --saved voicemail count if (string.len(dtmf_digits) == 0) then sql = [[SELECT count(*) as saved_messages FROM v_voicemail_messages @@ -750,19 +885,19 @@ function main_menu () status = dbh:query(sql, function(row) saved_messages = row["saved_messages"]; end); - dtmf_digits = macro(session, "saved_messages", 200, saved_messages); + dtmf_digits = macro(session, "saved_messages", 100, saved_messages); end --to listen to new message if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "listen_to_new_messages", 200, ''); + dtmf_digits = macro(session, "listen_to_new_messages", 100, ''); end --to listen to saved message if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "listen_to_saved_messages", 200, ''); + dtmf_digits = macro(session, "listen_to_saved_messages", 100, ''); end --for advanced options if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "advanced", 200, ''); + dtmf_digits = macro(session, "advanced", 100, ''); end --to exit press # if (string.len(dtmf_digits) == 0) then @@ -778,7 +913,7 @@ function main_menu () elseif (dtmf_digits == "0") then session:transfer("0", "XML", context); elseif (dtmf_digits == "*") then - macro(session, "goodbye", 200, ''); + macro(session, "goodbye", 100, ''); session:hangup(); else if (session:ready()) then @@ -793,7 +928,7 @@ function listen_to_recording (message_number, uuid, created_epoch, caller_id_nam api = freeswitch.API(); reply = api:executeString("uuid_display "..session:get_uuid().." "..caller_id_number); --say the message number - dtmf_digits = macro(session, "message_number", 200, ''); + dtmf_digits = macro(session, "message_number", 100, ''); --say the number session:say(message_number, "en", "NUMBER", "pronounced"); --say the message date @@ -804,45 +939,55 @@ function listen_to_recording (message_number, uuid, created_epoch, caller_id_nam end --to listen to the recording press 1 if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "listen_to_recording", 200, ''); + dtmf_digits = macro(session, "listen_to_recording", 100, ''); end --to save the recording press 2 if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "save_recording", 200, ''); - end - --to delete the recording press 7 - if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "delete_recording", 200, ''); + dtmf_digits = macro(session, "save_recording", 100, ''); end --to return the call now press 5 if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "return_call", 200, ''); + dtmf_digits = macro(session, "return_call", 100, ''); + end + --to delete the recording press 7 + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "delete_recording", 100, ''); + end + --to forward this message press 8 + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "to_forward_message", 100, ''); + end + --to forward this recording to your email press 9 + if (string.len(dtmf_digits) == 0) then + dtmf_digits = macro(session, "forward_to_email", 100, ''); end --wait for more digits if (string.len(dtmf_digits) == 0) then dtmf_digits = session:getDigits(max_digits, "#", 3000); end - --to forward this message press 8 - --to add an introduction to this message press 1 - --to send this message now 2 - --please enter the extension to send this message to followed by # --process the dtmf 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(uuid); - macro(session, "message_saved", 200, ''); - elseif (dtmf_digits == "7") then - delete_recording(uuid); + macro(session, "message_saved", 100, ''); elseif (dtmf_digits == "5") then return_call(caller_id_number); + elseif (dtmf_digits == "7") then + delete_recording(uuid); + elseif (dtmf_digits == "8") then + forward_to_extension(uuid); + macro(session, "message_saved", 100, ''); + elseif (dtmf_digits == "9") then + send_email(uuid); + macro(session, "emailed", 100); elseif (dtmf_digits == "*") then main_menu(); elseif (dtmf_digits == "0") then session:transfer("0", "XML", context); else message_saved(uuid); - macro(session, "message_saved", 200, ''); + macro(session, "message_saved", 100, ''); end end @@ -887,7 +1032,7 @@ end end dbh:query(sql); --message deleted - macro(session, "message_deleted", 200, ''); + macro(session, "message_deleted", 100, ''); --check the message waiting status message_waiting(); end @@ -919,7 +1064,7 @@ function menu_messages (message_status) max_timeout = 2000; min_digits = 1; max_digits = 1; - tries =1; + tries = 1; timeout = 2000; --set the message number message_number = 0; @@ -985,18 +1130,18 @@ end function advanced () --To record a greeting press 1 - dtmf_digits = macro(session, "to_record_greeting", 200, ''); + dtmf_digits = macro(session, "to_record_greeting", 100, ''); --To choose greeting press 2 if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "choose_greeting", 200, ''); + dtmf_digits = macro(session, "choose_greeting", 100, ''); end --To record your name 3 if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "to_record_name", 200, ''); + dtmf_digits = macro(session, "to_record_name", 100, ''); end --To change your password press 6 if (string.len(dtmf_digits) == 0) then - dtmf_digits = macro(session, "change_password", 200, ''); + dtmf_digits = macro(session, "change_password", 100, ''); end --For the main menu press 0 if (string.len(dtmf_digits) == 0) then @@ -1041,7 +1186,7 @@ function record_greeting() or greeting_id == "9") then --record your greeting at the tone press any key or stop talking to end the recording - macro(session, "record_greeting", 200, ''); + macro(session, "record_greeting", 100, ''); --record the greeting max_len_seconds = 30; @@ -1056,7 +1201,7 @@ function record_greeting() advanced(); else --invalid greeting_id - greeting_id = macro(session, "choose_greeting_fail", 200, ''); + greeting_id = macro(session, "choose_greeting_fail", 100, ''); --send back to choose the greeting if (session:ready()) then @@ -1104,13 +1249,13 @@ function choose_greeting() session:streamFile(voicemail_dir.."/"..voicemail_id.."/greeting_"..greeting_id..".wav"); --greeting selected - macro(session, "greeting_selected", 200, greeting_id); + macro(session, "greeting_selected", 100, greeting_id); --advanced menu advanced(); else --invalid greeting_id - greeting_id = macro(session, "choose_greeting_fail", 200, ''); + greeting_id = macro(session, "choose_greeting_fail", 100, ''); --send back to choose the greeting if (session:ready()) then @@ -1124,7 +1269,7 @@ end function record_name() --play the name record - macro(session, "record_name", 200, ''); + macro(session, "record_name", 100, ''); --save the recording -- syntax is session:recordFile(file_name, max_len_secs, silence_threshold, silence_secs) @@ -1139,7 +1284,7 @@ function record_name() session:streamFile(voicemail_dir.."/"..voicemail_id.."/recorded_name.wav"); --message saved - macro(session, "message_saved", 200, ''); + macro(session, "message_saved", 100, ''); --advanced menu advanced();