summaryrefslogtreecommitdiffstats
path: root/client/ivamVoiceBox.py
diff options
context:
space:
mode:
Diffstat (limited to 'client/ivamVoiceBox.py')
-rw-r--r--client/ivamVoiceBox.py103
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'))