Update the voicemail script and add the ability to send an email on demand for the voicemail message and then add ability to forward the message to another extension.

This commit is contained in:
Mark Crane
2013-01-03 14:05:45 +00:00
parent d1456dcb29
commit e3458daa71

View File

@@ -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 = [[<font face=arial>
<b>Message From "]]..caller_id_name..[[" <A HREF="tel:]]..caller_id_number..[[">]]..caller_id_number..[[</A></b><br>
<hr noshade size=1>
Created: ]]..os.date("%A, %d %b %Y %I:%M %p", start_epoch)..[[<br>
Duration: ]]..message_length_formatted..[[<br>
Account: ]]..voicemail_id..[[@]]..domain_name..[[<br>
</font>]];
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 = [[<font face=arial>
<b>Message From "]]..caller_id_name..[[" <A HREF="tel:]]..caller_id_number..[[">]]..caller_id_number..[[</A></b><br>
<hr noshade size=1>
Created: ]]..os.date("%A, %d %b %Y %I:%M %p", start_epoch)..[[<br>
Duration: ]]..message_length_formatted..[[<br>
Account: ]]..voicemail_id..[[@]]..domain_name..[[<br>
</font>]];
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();