#!/usr/bin/env python
-"""
+"""
FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
from twisted.internet.protocol import ClientFactory
import freepy
+
class FsHelper(ClientFactory):
def __init__(self, host=None, passwd=None, port=None):
if passwd:
self.passwd = passwd
if port:
- self.port = port
-
+ self.port = port
+
self.freepyd = None
self.connection_deferred = None
def reset(self):
self.freepyd = None
self.connection_deferred = None
-
+
def connect(self):
-
+
if self.freepyd:
# if we have a protocol object, we are connected (since we always
# null it upon any disconnection)
if self.connection_deferred:
# we are already connecting, return existing dfrd
return self.connection_deferred
-
+
self.connection_deferred = defer.Deferred()
self.connection_deferred.addCallback(self.dologin)
self.connection_deferred.addErrback(self.generalError)
self.connection_deferred = None
deferred2callback.callback("Connected")
-
def generalError(self, failure):
print "General error: %s" % failure
return failure
def startedConnecting(self, connector):
pass
-
+
def buildProtocol(self, addr):
return freepy.FreepyDispatcher(self.conncb, self.discocb)
-
+
def clientConnectionLost(self, connector, reason):
print "clientConnectionLost! conn=%s, reason=%s" % (connector,
reason)
- self.connection_deferred = None
+ self.connection_deferred = None
self.freepyd = None
-
+
def clientConnectionFailed(self, connector, reason):
print "clientConnectionFailed! conn=%s, reason=%s" % (connector,
reason)
self.freepyd = None
deferred2callback = self.connection_deferred
- self.connection_deferred = None
+ self.connection_deferred = None
deferred2callback.errback(reason)
def discocb(self, reason):
self.freepyd = None
def dologin(self, connectmsg):
- return self.freepyd.login(self.passwd)
+ return self.freepyd.login(self.passwd)
def originate(self, party2dial, dest_ext_app, bgapi=True):
"""
d.addCallback(originate_inner)
return d
-
-
-
def dialconf(self, people2dial, conf_name, bgapi=True):
"""
conf_name - name of conf TODO: change to match db
def listconf(self, conf_name):
"""
- conf_name - name of conf
+ conf_name - name of conf
returns - a deferred that will be called back with a result
like:
d.addCallback(confdtmf_inner)
return d
-
def confsay(self, conf_name, text2speak, bgapi=True):
"""
conf_name - name of conf
def confstop(self, conf_name, bgapi=True):
"""
stop playback of all sounds
-
+
conf_name - name of conf
returns - a deferred that will be called back with a result
like:
d.addCallback(confstop_inner)
return d
-
def showchannels(self, bgapi=True):
def showchannels_inner(ignored):
d.addCallback(killchan_inner)
return d
-
def broadcast(self, uuid, path, legs="both", bgapi=True):
"""
- @legs - one of the following strings: aleg|bleg|both
+ @legs - one of the following strings: aleg|bleg|both
"""
def broadcast_inner(ignored):
df = self.freepyd.broadcast(uuid, path, legs, bgapi)
d.addCallback(sofia_profile_restart_inner)
return d
-
def sofia_status_profile(self, profile_name, bgapi=True):
def sofia_status_profile_inner(ignored):
- df = self.freepyd.sofia_status_profile(profile_name,
- bgapi)
+ df = self.freepyd.sofia_status_profile(profile_name, bgapi)
return df
d = self.connect()
class FsHelperTest:
def __init__(self, fshelper):
- self.fshelper=fshelper
+ self.fshelper = fshelper
pass
def test_dialconf(self):
# called "freeswitch" on the local freeswitch instance.
# one party is actually another conference, just to make
# the example more confusing.
- people2dial = [{'name':'freeswitch',
- 'number':'888@conference.freeswitch.org'},
- {'name':'mouselike',
- 'number':'904@mouselike.org'}]
+ people2dial = [
+ {
+ 'name': 'freeswitch',
+ 'number': '888@conference.freeswitch.org'
+ },
+ {
+ 'name': 'mouselike',
+ 'number': ' 904@mouselike.org'
+ }
+ ]
d = self.fshelper.dialconf(people2dial, "freeswitch", bgapi=False)
def failed(error):
print "Failed to dial users!"
d.addErrback(failed)
def worked(*args):
print "Worked! Dialed user result: %s" % str(args)
- d.addCallback(worked)
+ d.addCallback(worked)
return d
def test_listconf(self):
def worked(*args):
print "Kicked user from conf, result: %s" % str(args)
d.addCallback(worked)
-
+
def test1():
kick_everyone = False
print "failed: %s" % str(failure)
reactor.stop()
if kick_everyone:
- d.addCallback(kickeveryone)
+ d.addCallback(kickeveryone)
d.addErrback(failed)
#fsht.test_confkick()
#d = fshelper.connect()
def test2():
fshelper = FsHelper(host="127.0.0.1",
passwd="ClueCon",
- port=8021)
+ port=8021)
fshelper.sofia_profile_restart("mydomain.com")
- reactor.run()
+ reactor.run()
def test3():
fshelper = FsHelper(host="127.0.0.1",
passwd="ClueCon",
- port=8021)
+ port=8021)
print "Calling originate.."
party2dial="sofia/foo/600@192.168.1.202:5080"
d = fshelper.originate(party2dial=party2dial,
def worked(result):
print "Originate succeeded: %s" % result
reactor.stop()
-
+
def failed(failure):
print "failed: %s" % str(failure)
reactor.stop()
-
+
d.addCallback(worked)
d.addErrback(failed)
- reactor.run()
+ reactor.run()
def test4():
fshelper = FsHelper(host="127.0.0.1",
passwd="ClueCon",
- port=8021)
+ port=8021)
def worked(result):
print "Originate succeeded: %s" % result
#reactor.stop()
-
+
def failed(failure):
print "failed: %s" % str(failure)
#reactor.stop()
bgapi=True)
d.addCallback(worked)
d.addErrback(failed)
- party2dial="sofia/foo/someone@bar.com"
+ party2dial="sofia/foo/someone@bar.com"
d2 = fshelper.originate(party2dial=party2dial,
dest_ext_app=dest_ext_app,
bgapi=True)
-
+
d2.addCallback(worked)
d2.addErrback(failed)
- reactor.run()
+ reactor.run()
def test5():
fshelper = FsHelper(host="127.0.0.1",
passwd="ClueCon",
- port=8021)
+ port=8021)
def worked(result):
print "Originate succeeded: %s" % result
#reactor.stop()
-
+
def failed(failure):
print "failed: %s" % str(failure)
#reactor.stop()
for i in xrange(20):
-
- party2dial="sofia/foo/600@192.168.1.202:5080"
+ party2dial = "sofia/foo/600@192.168.1.202:5080"
d = fshelper.originate(party2dial=party2dial,
dest_ext_app="700",
bgapi=True)
d.addCallback(worked)
d.addErrback(failed)
- reactor.run()
+ reactor.run()
+
def test6():
"""
from wikipbx import channelsutil
def show_chanels(raw_xml):
print raw_xml
-
+
def failure(failure):
print failure
-
+
d = fshelper.showchannels(bgapi=False)
d.addCallback(show_chanels)
d.addErrback(failure)
reactor.run()
-
-if __name__=="__main__":
+
+if __name__ == "__main__":
#test1()
#test2()
#test3()
-"""
+"""
FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
debug("setRequestFinished called. response_content: %s " %
self.response_content)
self.finished = True
-
+
def getDeferred(self):
return self.deferred
if not line.strip() or len(line.strip()) == 0:
self._fsm.BlankLine()
return self.isRequestFinished()
-
+
matchstr = re.compile("auth/request", re.I)
result = matchstr.search(line)
if (result != None):
"""
Example success response
========================
-
+
lineReceived: Content-Type: auth/request
lineReceived:
lineReceived: Content-Type: command/reply
lineReceived:
"""
-
+
def __init__(self):
super(LoginRequest, self).__init__()
import loginrequest_sm
return
msg = "Login failed, most likely a bad password"
self.errbackDeferred(Failure(Exception(msg)))
-
+
def getReplyText(self):
self.response_content
linereceived: Content-Type: command/reply
linereceived: Reply-Text: +OK Job-UUID: 788da080-24e0-11dc-85f6-3d7b12..
- linereceived:
+ linereceived:
"""
def __init__(self):
lineReceived:
lineReceived: Call Requested: result: [SUCCESS]
"""
-
+
def __init__(self):
super(ApiRequest, self).__init__()
import apirequest_sm
# we need to add it back .. otherwise the Content-length
# will be off by one
line += "\n"
-
+
self.response_content += line
if len(self.response_content) == self.content_length:
return True
# By default, just return accumulated string
return self.response_content
-
+
class DialoutRequest(ApiRequest):
"""
Example raw dialout response
class BgDialoutRequest(BgApiRequest):
def __init__(self):
super(BgDialoutRequest, self).__init__()
-
+
class ConfKickRequest(ApiRequest):
"""
def __init__(self):
super(BgConfKickRequest, self).__init__()
-
+
class ListConfRequest(ApiRequest):
"""
Response to request to list conferences:
========================================
-
+
lineReceived: Content-Type: api/response
lineReceived: Content-Length: 233
lineReceived:
def __init__(self):
super(ListConfRequest, self).__init__()
self.conf_members = []
-
+
def add_content(self, line):
"""
conf not empty example
else:
confmember = models.ConfMember(line)
self.conf_members.append(confmember)
-
+
return super(ListConfRequest, self).add_content(line)
-
+
def getResponse(self):
# TODO: parse this content into a meaningful
# 'object' .. though, not sure this is really
# necessary. wait till there's a need
return self.conf_members
-
+
# http://wiki.freeswitch.org/wiki/Mod_python
# before reporting errors
-import sys, time
from freeswitch import *
+
def onDTMF(input, itype, funcargs):
- console_log("1","\n\nonDTMF input: %s\n" % input)
+ console_log("1", "\n\nonDTMF input: %s\n" % input)
if input == "5":
- return "pause"
+ return "pause"
if input == "3":
- return "seek:+60000"
+ return "seek:+60000"
if input == "1":
- return "seek:-60000"
+ return "seek:-60000"
if input == "0":
- return "stop"
- return None # will make the streamfile audio stop
+ return "stop"
+ return None # will make the streamfile audio stop
-def handler(uuid):
- console_log("1","... test from my python program\n")
+def handler(uuid):
+ console_log("1", "... test from my python program\n")
session = PySession(uuid)
session.answer()
session.setDTMFCallback(onDTMF, "")
session.playFile("/path/to/your.mp3", "")
session.speak("Please enter telephone number with area code and press pound sign. ")
input = session.getDigits("", 11, "*#", "#", 10000)
- console_log("1","result from get digits is %s\n" % input)
+ console_log("1", "result from get digits is %s\n" % input)
phone_number = session.playAndGetDigits(5, 11, 3, 10000, "*#",
"/sounds/test.gsm",
"/sounds/invalid.gsm",
"",
- "^17771112222$");
- console_log("1","result from play_and_get_digits is %s\n" % phone_number)
+ "^17771112222$")
+ console_log("1", "result from play_and_get_digits is %s\n" % phone_number)
session.transfer("1000", "XML", "default")
session.hangup("1")
-
from py_modules.speechtools import Grammar, SpeechDetect
from py_modules.speechtools import SpeechObtainer
-import time, os
+import os
VOICE_ENGINE = "cepstral"
VOICE = "William"
GRAMMAR_ROOT = "/usr/src/freeswitch_trunk/scripts"
"""
-Example speech recognition application in python.
+Example speech recognition application in python.
How to make this work:
"""
+
class RecipeWizard:
def __init__(self, session):
- self.session=session
- self.session.set_tts_parms(VOICE_ENGINE, VOICE)
+ self.session = session
+ self.session.set_tts_parms(VOICE_ENGINE, VOICE)
self.main()
def main(self):
-
- console_log("debug", "recipe wizard main()\n")
- self.speechdetect = SpeechDetect(self.session, "openmrcp", "127.0.0.1");
+ console_log("debug", "recipe wizard main()\n")
+ self.speechdetect = SpeechDetect(self.session, "openmrcp", "127.0.0.1")
self.speechobtainer = SpeechObtainer(speech_detect=self.speechdetect,
required_phrases=1,
wait_time=5000,
max_tries=3)
gfile = os.path.join(GRAMMAR_ROOT, "mainmenu.xml")
- self.grammar = Grammar("mainmenu", gfile,"input",80,90)
- self.speechobtainer.setGrammar(self.grammar);
+ self.grammar = Grammar("mainmenu", gfile, "input", 80, 90)
+ self.speechobtainer.setGrammar(self.grammar)
console_log("debug", "calling speechobtainer.run()\n")
self.speechobtainer.detectSpeech()
self.session.speak("Hello. Welcome to the recipe wizard. Drinks or food?")
self.session.speak("Received result. Result is: %s" % result[0])
else:
self.session.speak("Sorry, I did not hear you")
-
- console_log("debug", "speechobtainer.run() finished\n")
+
+ console_log("debug", "speechobtainer.run() finished\n")
+
def mainmenu():
"""
"""
pass
+
def handler(uuid):
session = PySession(uuid)
session.answer()
rw = RecipeWizard(session)
session.hangup("1")
-
-