YAYPM:Bridge and then unbridge
From Yate Documentation
				
								
				
				
																
				
				
								
				This script is given as an example, don't forget to change some information such as yate's extmodule binding ip address and port.
This script will:
- 1 - make a phone call to 'jmfoucher'
- 2 - play a sound to jmfoucher
- 3 - wait for DTMF "1"
- 4 - once "1" is pressed, toto is called
- 5 - when toto answers, toto and jmfoucher are bridged
- 6 - after 3 seconds, toto and jmfoucher will be unbridged (the two new channels are independant)
- 7 - two different sounds are played on the different channels
#!/usr/bin/python
from twisted.internet import reactor, defer
from yaypm import TCPDispatcherFactory, AbandonedException
from yaypm.flow import go, getResult
from yaypm.utils import ConsoleFormatter
import logging, yaypm
logger = logging.getLogger("test3")
class myTest(object):
    def __init__(self, client):
        logger.debug(">>> myTest.__init__()")
        self.client = client
        self.run()
    def run(self):
        logger.debug(">>> myTest.run()")
        go(self.test())
    def test(self):
        logger.debug(">>> myTest.test()")
        firsttime = True 
        yield self.client.installMsgHandler("call.route", prio = 50)
        getResult()
        yield self.client.installWatchHandler("call.answered")
        getResult()
        yield self.client.installWatchHandler("chan.hangup")
        getResult()
        execute = self.client.msg("call.execute",
         {"callto": "dumb/",
          "caller": "appelant",
          "target": "jmfoucher",
          "sip_prout": "value",
          "osip_toto": "tata"
         })
        yield execute.dispatch()
        if not getResult():
            logger.warn("can't create monitor connection on jmfoucher")
            monitor = None
        else:
            logger.debug("can monitor jmfoucher")
            try: 
                end = self.client.onwatch(
                    "chan.hangup",
                    lambda m, callid = execute["id"] : m["id"] == callid)
                yield self.client.onwatch(
                    "call.answered",
                    lambda m : m["id"] ==  execute["targetid"],
                    until = end)
                getResult()
                logger.debug("Monitor connection answered.") 
                dumbid = execute["id"]
                monitorid = execute["targetid"]
                callid = execute["id"]
                logger.debug("callid = s" % (callid, monitorid))
                logger.debug("on joue le son")
                self.client.msg("chan.masquerade",
                {"message" : "chan.attach",
                 #"id": monitorid,
                 "id": callid,
                 "source": "wave/play/../../sounds/wp_star_seller_ask.wav"}).enqueue()
                logger.debug("le son est parti")
                while True:
                    logger.debug("dans le while True")
                    yield self.client.onmsg(
                        "chan.dtmf",
                        #lambda m : m["id"] == callid,
                        lambda m : m["id"] == monitorid,
                        end)
                    dtmf = getResult()
                    logger.debug("Dtmf  dtmf["text"])
                    dtmf.ret(True)
                    if dtmf["text"] == "1":
                        if firsttime:
                            firsttime = False
                            self.client.msg("chan.masquerade",
                                {"message" : "chan.attach",
                                 "id": callid,
                                 "source": "wave/play/../../sounds/wp_star_seller_wait.wav"}).enqueue()
                            execute = self.client.msg("call.execute",
                             {"callto": "dumb/",
                              "caller": "jmfoucher",
                              "target": 'toto'})
                            yield execute.dispatch()
                            if not getResult():
                                logger.debug("FAILURE")
                            else:
                                logger.debug("SUCCESS")
                                callid2 = execute["id"]
                                targetid2 = execute["targetid"]
                                logger.debug("callid=s" % (callid, monitorid))
                                logger.debug("callid2=s" % (callid2, targetid2))
                                end = self.client.onmsg("chan.hangup",
                                    lambda m, callid = targetid2 : m["id"] == callid, autoreturn = True)
                                yield self.client.onwatch("call.answered",
                                    lambda m : m["targetid"] == callid2, until = end)
                                answered = getResult()
                                logger.debug("answered= answered)
                                logger.debug("on appelle self.conf")
                                logger.debug("callid = s" % (callid, callid2))
                                connect = self.client.msg(
                                    "chan.connect",
                                    {"id": monitorid,
                                     "targetid": targetid2})
                                yield connect.dispatch()
                                if getResult():
                                    logger.debug("connect SUCCESS")
                                else:
                                    logger.debug("connect FAILURE")
                                def sound():
                                    go(sound2())
                                def sound2():
                                    logger.debug("dans sound")
                                    transfer = self.client.msg("chan.masquerade",
                                                        {"message": "call.transfer",
                                                         "id": monitorid,
                                                         "to": "wave/play/../../sounds/accueil_court.wav",
                                                         "peerto": "wave/play/../../sounds/wp_star_seller_wait.wav"
                                                        })
                                    yield transfer.dispatch()
                                    if not getResult():
                                        logger.debug("transfer failure")
                                    else:
                                        logger.debug("transfer success")
                                reactor.callLater(3, sound)
                            #yield yate.msg("call.drop", {"id": targetid}).dispatch()
                            #getResult()
            except AbandonedException, e:
                logger.debug("Call  callid)
def start(host, port):
    logger.debug("dans start")
    local_addr = remote_addr = host
    local_port = remote_port = port
    #go(route(yate))
    def start_client(client_yate):
        logger.debug("client started");
        myTest(client_yate)
    client_factory = TCPDispatcherFactory(start_client)
    reactor.connectTCP(local_addr, local_port, client_factory)
if __name__ == _main_:
    hdlr = logging.StreamHandler()
    formatter = ConsoleFormatter('%(name)s %(levelname)s %(message)s')
    hdlr.setFormatter(formatter)
    yaypm.logger.addHandler(hdlr)
    yaypm.logger.setLevel(logging.DEBUG)
    #yaypm.flow.logger_flow.setLevel(logging.DEBUG)
    yaypm.logger_messages.setLevel(logging.DEBUG)
    yaypm.logger_messages.setLevel(logging.INFO) 
    logger.setLevel(logging.DEBUG)
    logger.addHandler(hdlr)
    #f = TCPDispatcherFactory(start)
    #reactor.connectTCP("192.168.4.87", 5039, f)
    start("192.168.4.87", 5039)
    reactor.run()
