No console_log
WIKIPBX ----------------------------------------------------------------------
FREESWITCH CONSOLE -----------------------------------------------
2008-03-04 19:12:47 [NOTICE] mod_sofia.c:1047 sofia_receive_message() Pre-Answer sofia/Local/100@192.168.1.95:5060!
2008-03-04 19:12:47 [NOTICE] mod_python.c:86 eval_some_python() Invoking py module: wikipbx.ivr.voicemail
-------------> cepstral voice playes here <-----------------
2008-03-04 19:12:47 [NOTICE] switch_core_session.c:732 switch_core_session_thread() Session 7 (sofia/Local/102) Ended
2008-03-04 19:12:47 [NOTICE] switch_core_session.c:734 switch_core_session_thread() Close Channel sofia/Local/102 [CS_HANGUP]
VOICEMAIL.PY--------------------------------------------------------------------------
"""
WikiPBX web GUI front-end for FreeSWITCH
Copyright (C) 2007, Branch Cut
License Version: MPL 1.1
"""
import os
os.environ['DJANGO_SETTINGS_MODULE']='wikipbx.settings'
from freeswitch import *
from wikipbx.wikipbxweb.models import *
from wikipbx import mailutil
reload(mailutil)
import wikipbx.ivr.baseivr
reload(wikipbx.ivr.baseivr)
from wikipbx.ivr.baseivr import BaseIvr
from pytz import timezone
import datetime
import md5
class VoicemailIvr(BaseIvr):
def __init__(self, session):
super(VoicemailIvr, self).__init__(session)
self.mailbox_name = self.session.getVariable("mailbox")
self.userprofile = None
if self.mailbox_name and self.mailbox_name != "None":
mbn = self.mailbox_name
userprofs = UserProfile.objects.filter(account=self.account,
user__email=mbn)
if userprofs:
self.userprofile = userprofs[0]
self.uuid = self.session.getVariable("uuid")
# the number dialed, we can use this to match it with an
# existing endpoint, and then from there figure out what
# userprofile to use for storing voicemail
self.dest_num = self.session.getVariable("destination_number")
if not self.dest_num or self.dest_num == "None":
self.dest_num = None
class VoicemailPlayerIvr(VoicemailIvr):
def __init__(self, session):
super(VoicemailPlayerIvr, self).__init__(session)
self.login_attempts = 0
def main(self):
logged_in = self.login()
if not logged_in:
return
self.browse_voicemails()
def browse_voicemails(self):
if self.userprof:
voicemails = Voicemail.objects.filter(account=self.account,
userprofile=self.userprof)
voicemails = voicemails.order_by("id")
else:
# account wide login
voicemails = Voicemail.objects.filter(account=self.account,
userprofile__isnull=True)
if not voicemails:
self.speak("Sorry, there are no voicemail messages")
return
self.speak("There are %s voicemail messages" % len(voicemails))
for voicemail in voicemails:
self.play_voicemail(voicemail)
self.speak("There are no more voicemail messages. Goodbye")
def play_voicemail(self, voicemail):
self.speak("Going to play voicemail %s" % voicemail.id)
self.session.streamFile(voicemail.get_path())
self.post_play_options(voicemail)
def post_play_options(self, voicemail):
thing2say = "Press 1 to replay voicemail. "
thing2say += "Press 2 to delete voicemail. "
tempfile = self.make_tts_file(thing2say)
in_rslt = self.session.playAndGetDigits(1,1,3,6000,
"*#",tempfile,
"", "","")[1]
console_log("INFO","user input: %s\n" % str(in_rslt))
if not in_rslt:
self.speak("Sorry, no input detected")
else:
if int(in_rslt) == 1:
self.play_voicemail(voicemail)
elif int(in_rslt) == 2:
vmid = voicemail.id
voicemail.delete()
self.speak("Voicemail %s has been deleted" % str(vmid))
else:
self.speak("%s is an invalid option. Goodbye" %
in_rslt)
def login(self):
if self.login_attempts > 5:
self.speak("Sorry, maximum number of login attempts exceeded")
return False
self.login_attempts += 1
# TODO: only prompt if ${sip_authorized} is not "true")
# prompt them to enter mailbox id
thing2say = "Welcome to voicemail player. Please enter mailbox i d followed by the pound sign"
tempfile = self.make_tts_file(thing2say)
in_rslt = self.session.playAndGetDigits(1,10,3,4000,
"*#",tempfile,
"", "","")[1]
console_log("INFO","user input: %s\n" % str(in_rslt))
if not in_rslt:
self.speak("You did not enter anything. Goodbye")
return False
# check if an user exists in the current account
# with the mailbox id the person entered
self.userprof = None
userprofs = UserProfile.objects.filter(account=self.account,
mailbox=in_rslt)
if not userprofs:
speakable = " ".join(in_rslt)
self.speak("Sorry, no mailbox with i d: %s" %
speakable, stream=False)
return False
else:
self.userprof = userprofs[0]
# prompt them to enter password
thing2say = "Please enter mailbox password followed by the pound sign"
tempfile = self.make_tts_file(thing2say)
in_rslt = self.session.playAndGetDigits(1,10,3,4000,
"*#",tempfile,
"", "","")[1]
console_log("INFO","user input: %s\n" % str(in_rslt))
if not in_rslt:
self.speak("You did not enter anything. Goodbye", stream=False)
return False
if not self.userprof.get_vm_password() == in_rslt:
speakable = " ".join(in_rslt)
self.speak("Sorry %s is not the correct password" % speakable,
stream=False)
return self.login()
return True
class VoicemailRecorderIvr(VoicemailIvr):
def __init__(self, session):
super(VoicemailRecorderIvr, self).__init__(session)
def main(self):
#self.speak("Welcome to voicemail recorder.")
#self.speak("Please start speaking after the beep. "
# "Press any key when finished. ")
if os.path.isfile("/usr/local/freeswitch/sounds/en/us/callie/voicemail/8000/vm-record_message.wav") == true:
console_log("debug","/usr/local/freeswitch/sounds/en/us/callie/voicemail/8000/vm-record_message.wav")
self.session.streamFile("/usr/local/freeswitch/sounds/en/us/callie/voicemail/8000/vm-record_message.wav")
self.playbeep()
# if there is no userprofile specified, we are going to
# drop the voicemail into _each_ account admin's vm box
self.admin = None
if not self.userprofile:
# choose the first account admin
self.admin = self.account.admins.all()[0]
voicemail = Voicemail(uuid=self.uuid,
account=self.account,
userprofile=self.admin)
voicemail.save()
else:
voicemail = Voicemail(uuid=self.uuid,
account=self.account,
userprofile=self.userprofile)
voicemail.save()
vm_path = voicemail.get_path()
max_len = 600 # 10 mins
silence_threshold = 500
silence_secs = 5
self.session.recordFile(vm_path,
max_len,
silence_threshold,
silence_secs)
# TODO: allow them to listen, re-record
# check asterisk vmail features
self.speak("Thank You. Your voicemail has been "
"recorded. Goodbye")
# make sure its non empty, if so, just delete it and
# skip the email notifications
if voicemail.get_audio_length() == 0:
console_log("debug", "voicemail audio is empty, deleting\n")
voicemail.delete()
return
# If account-wide, copy it to all _other_ admins mailboxes
if not self.userprofile:
admins = self.account.admins.all()
for otheradmin in admins:
if otheradmin == self.admin:
# skip the 1st admin we used earlier, already has vm
continue
voicemail_copy = Voicemail(uuid=self.uuid,
account=self.account,
userprofile=otheradmin)
voicemail_copy.save()
# copy actual file
voicemail.copy_audio(voicemail_copy.get_path())
# TODO: add a direct link back to the webserver which displays all
# details on the voicemail. currently links back to homepage.
# use this approach until hangup hook works ... but will this code
# get called if user hangs up abruptly? so far in testing, seems
# to work.
console_log("INFO","sending email, session: %s\n" % str(self.session))
caller_id_number = self.session.getVariable("caller_id_number")
caller_id_name = self.session.getVariable("caller_id_name")
login_link = ('login' %
(self.account.server.fqdn,
self.account.server.http_port))
msg_body = ("You have received a new voicemail (id=%s) "
"from %s (%s). Please %s to listen to your message." %
(voicemail.id, caller_id_number,
caller_id_name, login_link))
# if a mailbox (web user) was explicitly specified, use email
# associated with that web user. otherwise, send a notice
# to all account admins
if self.userprofile:
recipients = [self.userprofile.user.email]
else:
admins = self.account.admins.all()
recipients = [x.user.email for x in admins]
mailutil.acct_send(recipients=recipients,
subject="New voicemail: %s" % voicemail.id,
msg_body=msg_body,
account=self.account)
console_log("INFO","sent email, session: %s\n" % str(self.session))
# TODO: run other voicemail triggers (listen to events)
def handler(uuid):
if not uuid:
console_log("info", "\nNo uuid given\n")
return
session = PySession(uuid)
try:
vmaction = session.getVariable("vmaction")
console_log("info", "\nvmaction: %s\n" % str(self.vmaction))
if vmaction == "play":
vmplayer = VoicemailPlayerIvr(session)
vmplayer.main()
elif vmaction == "record":
vmrecorder = VoicemailRecorderIvr(session)
vmrecorder.main()
else:
console_log("error", "Invalid voicemail action: %s\n" % vmaction)
session.set_tts_parms("cepstral", "william")
session.speak("Sorry, the voicemail system had an error. "
"Error code 101")
except Exception, e:
console_log("error", "Error running voicemail IVR: %s\n" % e)
session.set_tts_parms("cepstral", "william")
session.speak("Sorry, the voicemail system had an error. "
"Error code 102")
-----------------------------------------------------------------------------------
thanks
thaper