import os,weakref from log import * from ivr import * from imap_mailbox.imap4ext import * class List(list): pass class VoiceMsg: def __init__(self,uid,mb): self._uid = uid self._mb = mb self._audio = None def _load(self): self._fp = self._mb.downloadWAV(self._uid) self._audio = IvrAudioFile() self._audio.fpopen("tmp.wav",AUDIO_READ,self._fp) def audio(self): if self._audio == None: self._load() return self._audio def save(self): self._mb.saveMsg(self._uid) def delete(self): self._mb.deleteMsg(self._uid) class IvrDialog(IvrDialogBase): def __init__(self): self.voice_lib = None self.cur_list = None self.msg_list = None self.new_msgs = List() self.saved_msgs = List() self.cur_msg = 0 self.exit = False self.key_enabled = False def loadVoiceLib(self): self.voice_lib = dict() # Parts for the welcome text self.voice_lib['you_have'] = None self.voice_lib['new_msg'] = None self.voice_lib['saved_msg'] = None self.voice_lib['no_msg'] = None self.voice_lib['and'] = None # Menu played after each message self.voice_lib['msg_menu'] = None # Status acknowledgement self.voice_lib['msg_deleted'] = None self.voice_lib['msg_saved'] = None self.voice_lib['first_msg'] = None self.voice_lib['next_msg'] = None # End of conversation self.voice_lib['bye'] = None # Pre-Load the WAVs for k in self.voice_lib.keys(): wav = IvrAudioFile() wav.open(config['wav_dir'] + '/' + k + '.wav',AUDIO_READ) self.voice_lib[k] = wav # Menu will be looped until a key is pressed self.voice_lib['msg_menu'].loop = True def loadMsgList(self,criterion): msg_list = List() name_list = self.mailbox.getWavMsgList(criterion) for n in name_list: msg_list.append(VoiceMsg(n,self.mailbox)) return msg_list def onSessionStart(self,hdrs): self.__init__() self.loadVoiceLib() self.mailbox = IMAP4_Mailbox(getHeader(hdrs,"P-Mailbox-URL")) debug("***** Mailbox Url: ******\n" + str(self.mailbox.url)) self.new_msgs = self.loadMsgList('UNSEEN') self.saved_msgs = self.loadMsgList('SEEN') if (len(self.new_msgs) == 0) and \ (len(self.saved_msgs) == 0): self.enqueue(self.voice_lib['no_msg'],None) self.enqueue(self.voice_lib['bye'],None) self.exit = True return self.enqueue(self.voice_lib['you_have'],None) if len(self.new_msgs) > 0: self.enqueue(self.voice_lib['new_msg'],None) self.msg_list = weakref.proxy(self.new_msgs) self.cur_list = weakref.ref(self.new_msgs) if len(self.saved_msgs) > 0: self.enqueue(self.voice_lib['and'],None) self.enqueue(self.voice_lib['saved_msg'],None) else: self.enqueue(self.voice_lib['saved_msg'],None) self.msg_list = weakref.proxy(self.saved_msgs) self.cur_list = weakref.ref(self.saved_msgs) self.enqueueCurMsg() def onBye(self): self.stopSession() def onEmptyQueue(self): if self.exit: self.bye() self.stopSession() def onDtmf(self,key,duration): if not self.key_enabled: return debug("onDtmf(%i,%i)" % (key,duration)) if key == 1: self.flush() elif key == 2: self.key_enabled = False self.flush() self.msg_list[self.cur_msg].save() self.enqueue(self.voice_lib['msg_saved'],None) self.cur_msg += 1 elif key == 3: self.key_enabled = False self.flush() self.msg_list[self.cur_msg].delete() self.enqueue(self.voice_lib['msg_deleted'],None) self.cur_msg += 1 else: return if not self.enqueueCurMsg(): debug("self.cur_list() is self.new_msgs = %s" % repr(self.cur_list() is self.new_msgs)) debug("len(self.saved_msgs) = %i" % len(self.saved_msgs)) if (self.cur_list() is self.new_msgs) and \ len(self.saved_msgs) > 0: self.cur_msg = 0 self.msg_list = weakref.proxy(self.saved_msgs) self.cur_list = weakref.ref(self.saved_msgs) self.enqueue(self.voice_lib['saved_msg'],None) self.enqueueCurMsg() else: self.enqueue(self.voice_lib['bye'],None) self.exit = True def enqueueCurMsg(self): if self.cur_msg >= len(self.msg_list): return False if self.cur_msg > 0: self.enqueue(self.voice_lib['next_msg'],None) else: self.enqueue(self.voice_lib['first_msg'],None) self.enqueue(self.msg_list[self.cur_msg].audio(),None) self.enqueue(self.voice_lib['msg_menu'],None) self.key_enabled = True return True