You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sems/apps/mailbox/mailbox_query.py

223 lines
4.4 KiB

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):
self.__init__()
self.loadVoiceLib()
self.mailbox = IMAP4_Mailbox(getAppParam("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:
if self.queueIsEmpty():
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