diff options
Diffstat (limited to 'client/ivamVoiceBox.py')
-rw-r--r-- | client/ivamVoiceBox.py | 103 |
1 files changed, 60 insertions, 43 deletions
diff --git a/client/ivamVoiceBox.py b/client/ivamVoiceBox.py index 9217005..131e5c5 100644 --- a/client/ivamVoiceBox.py +++ b/client/ivamVoiceBox.py @@ -1,5 +1,5 @@ -import getopt, sys, os +import getopt, sys, os, time, re import ivamApi, ivamCore, ivamDefs from ivamUtil import getContents, setContents @@ -14,6 +14,9 @@ class VoiceBox(ivamApi.Processor): currentState = STATE_INVALID fileSuffix = ".ulaw.gz" + def getClip(self, s): + return "%s/%s%s" % (self.directory, s, self.fileSuffix) + def onConnect(self, c, callerNumber, ringNumber): if ivamCore.DEBUG: @@ -23,18 +26,20 @@ class VoiceBox(ivamApi.Processor): self.ringNumber = ringNumber self.currentState = self.STATE_WELCOME - c.playClip("welcome") + c.playClip(self.getClip("welcome")) - def loginComplete(self): + def loginComplete(self, c): self.messages = self.getMessageNames() self.currentMessage = 0 + + ivamCore.log("Successful login from %s for MSN %s." % (self.callerNumber, self.ringNumber)) if len(self.messages) == 0: self.currentState = self.STATE_EMPTY - c.playClip("empty") + c.playClip(self.getClip("empty")) else: self.currentState = self.STATE_MESSAGE_BEEP - c.playClip("beep") + c.playClip(self.getClip("beep")) def onClipFinish(self, c, fname): @@ -43,7 +48,7 @@ class VoiceBox(ivamApi.Processor): if self.currentState == self.STATE_WELCOME: self.currentState = self.STATE_WELCOME_BEEP; - c.playClip("beep") + c.playClip(self.getClip("beep")) elif self.currentState == self.STATE_WELCOME_BEEP: self.currentState = self.STATE_RECORD @@ -61,45 +66,45 @@ class VoiceBox(ivamApi.Processor): elif self.currentState == self.STATE_AUTH_OK: - self.loginComplete() + self.loginComplete(c) elif self.currentState == self.STATE_MESSAGE_BEEP: while True: if self.currentMessage >= len(self.messages): - self.currentMessage = self.STATE_NO_MORE_MESSAGES - c.playClip("nomoremessages") + self.currentState = self.STATE_NO_MORE_MESSAGES + c.playClip(self.getClip("nomoremessages")) else: - self.currentState = self.STATE_MESSAGE_BEEP + self.currentState = self.STATE_MESSAGE try: c.playClip(self.messages[self.currentMessage]) - break - except IOError, e: del(self.messages[self.currentMessage]) - if len(self.messages) == 0: - self.currentState = self.STATE_EMPTY - c.playClip("empty") - - continue + if len(self.messages) > 0: + continue + + self.currentState = self.STATE_EMPTY + c.playClip(self.getClip("empty")) + + break elif self.currentState == self.STATE_MESSAGE: self.currentMessage +=1 self.currentState = self.STATE_MESSAGE_BEEP - c.playClip("beep") + c.playClip(self.getClip("beep")) - elif self.currentState == self.STATE_REMOVE: + elif self.currentState == self.STATE_REMOVED: if len(self.messages) == 0: self.currentState = self.STATE_EMPTY - c.playClip("empty") + c.playClip(self.getClip("empty")) else: self.currentState = self.STATE_MESSAGE_BEEP - c.playClip("beep") + c.playClip(self.getClip("beep")) elif self.currentState == self.STATE_NO_MORE_MESSAGES: @@ -107,8 +112,9 @@ class VoiceBox(ivamApi.Processor): pass elif self.currentState == self.STATE_EMPTY: - self.currentState = self.STATE_FINISH - c.hangup() + + # Silence ... + pass def onDtmfEvent(self, c, event): @@ -118,7 +124,7 @@ class VoiceBox(ivamApi.Processor): if ((self.currentState == self.STATE_WELCOME) or (self.currentState == self.STATE_WELCOME_BEEP)) and (event == '0'): if self.pin == "": - self.loginComplete() + self.loginComplete(c) elif self.pin == "-": self.currentState = self.STATE_FINISH @@ -128,8 +134,8 @@ class VoiceBox(ivamApi.Processor): self.currentState = self.STATE_AUTH self.inputPin = "" c.stopPlayback() - c.playClip("auth") - c.setTimeout(AUTH_TIMEOUT) + c.playClip(self.getClip("auth")) + c.setTimeout(self.AUTH_TIMEOUT) elif self.currentState == self.STATE_AUTH: c.stopPlayback() @@ -140,45 +146,47 @@ class VoiceBox(ivamApi.Processor): if self.inputPin == self.pin: self.currentState = self.STATE_AUTH_OK - c.playClip("authok") + c.playClip(self.getClip("authok")) else: self.currentState = self.STATE_FINISH c.hangup() elif self.currentState in [self.STATE_MESSAGE, self.STATE_MESSAGE_BEEP, self.STATE_NO_MORE_MESSAGES] : - changed = 0 - if event == '0': if self.currentMessage >= len(self.messages): self.currentMessage = len(self.messages)-1 os.remove(self.messages[self.currentMessage]) + ivamCore.log("Sucessfully removed message '%s' on behalf of %s for MSN %s." % (self.messages[self.currentMessage], self.callerNumber, self.ringNumber)) del(self.messages[self.currentMessage]) + self.currentState = self.STATE_REMOVED - c.playClip("removed") + c.playClip(self.getClip("removed")) else: + changed = False + if event in ['4', '2']: self.currentMessage -= 1 - changed = 1 + changed = True if event in ['6', '8']: self.currentMessage += 1 - changed = 1 + changed = True if event == '5': - changed = 1 + changed = True if event == '1': self.currentMessage = 0 - changed = 1 + changed = True if event == '7': self.currentMessage = len(self.messages)-1 - changed = 1 + changed = True if self.currentMessage < 0: self.currentMessage = 0 @@ -188,10 +196,10 @@ class VoiceBox(ivamApi.Processor): if changed: self.currentState = self.STATE_MESSAGE_BEEP - c.playClip("beep") + c.playClip(self.getClip("beep")) else: - c.stopPlayback() + c.stopPlayback2() def onTimeout(self, c): @@ -201,17 +209,20 @@ class VoiceBox(ivamApi.Processor): if self.currentState == self.STATE_RECORD: self.currentState = self.STATE_PRE_FINISH c.stopRecording() - c.playClip("beep") + c.playClip(self.getClip("beep")) - elif self.currentState in [self.STATE_AUTH, self.STATE_PIN2, self.STATE_PIN3, self.STATE_PIN4]: + elif self.currentState == self.STATE_AUTH: self.currentState = self.STATE_FINISH c.hangup() def onRecordFinish(self, c, fname): if ivamCore.DEBUG: - ivamCore.log("onRecordFinish(%s)", fname) + ivamCore.log("onRecordFinish(%s)" % fname) + ivamCore.log("Sucessfully recorded new message '%s' from %s for MSN %s." % (fname, self.callerNumber, self.ringNumber)) + + os.environ["SPOOLDIR"] = self.directory ivamCore.log("Starting new message notification program.") r=os.spawnvp(os.P_WAIT, self.messageProgram, (self.messageProgram, fname)) ivamCore.log("Program finished (return value is %i)." % r) @@ -219,15 +230,19 @@ class VoiceBox(ivamApi.Processor): def getMessageNames(self): f = os.listdir(self.messageDirectory) + f = map(lambda e: "%s/%s" % (self.messageDirectory, e), f) f.sort() f.reverse() return f def nextMessageName(self): - return "%s/%010i-%s-%s%s" % (self.messageDirectory, time.time(), self.callerNumber, self.callerNumber, self.fileSuffix) + return "%s/%010u:%s:%s%s" % (self.messageDirectory, time.time(), self.ringNumber, self.callerNumber, self.fileSuffix) def setPin(self, pin): + + if ivamCore.DEBUG: + ivamCore.log("setPin('%s')" % pin) if re.match('^([0-9#*]*|-)$', pin).end() is None: ivamCore.log("Invalid PIN. PIN has to consist of 0-9#*. Use '-' for always denying access.") @@ -242,6 +257,7 @@ class VoiceBox(ivamApi.Processor): self.directory = dname self.messageDirectory = dname + "/messages" + try: self.setPin(getContents("%s/PIN" % dname)) except Exception: @@ -252,11 +268,11 @@ class VoiceBox(ivamApi.Processor): except Exception: self.recordTime = 60 - messageProgram = "%s/newmessage" % dname + self.messageProgram = "%s/newmessage" % dname -def setupVoiceBox(dname, pin = "-", recordTime = 60): +def setupVoiceBox(dname, pin = "-", recordTime = 60, email = "root"): if dname.find("/") == -1: dname = "%s/%s" % (ivamDefs.spoolDirectory, dname) @@ -265,6 +281,7 @@ def setupVoiceBox(dname, pin = "-", recordTime = 60): setContents("%s/PIN" % dname, pin) setContents("%s/RECORD_TIME" % dname, `recordTime`) + setContents("%s/EMAIL" % dname, email) ulaw = map(lambda e: e+".ulaw.gz", ('welcome', 'beep', 'empty', 'nomoremessages', 'auth', 'authok', 'removed')) |