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