在Twilio中,我如何使呼叫者排队并通过SIP呼叫代理,但要使用户排队,直到SIP端点不忙

时间:2020-07-03 04:06:01

标签: node.js queue twilio enqueue

现在与Twilio一起工作了一个月左右,对Twiml和Twilios NodeJS SDK基础有了很好的了解。

现在尝试着处理复杂的工作流程,例如排队呼叫者。 到目前为止,我已经成功使呼叫者入队,然后通过SDK触发了到代理的出站呼叫。

我的问题,如果座席正忙于另一个客户(例如,他们正在“通话中”),我不希望他们的SIP线路再次呼叫。现在,如果有另一位客户打来电话,并且队列中没有人,则SIP线路会振铃!

唯一可行的方法是,如果有超过1个人等待出队。

相反,我希望twilio保留它们入队,一旦调用queue/left函数,然后触发座席的电话响起。


到目前为止,这是我的代码库(重要内容被截断了)

    //function invite()
    ...
    const terminationURI = `termination=${termination}`; //termination is the SIP endpoint which is dynamic in my WebApp.
    twiml.enqueue({action: `queue/left?${terminationURI}`, method: 'POST', waitUrl: `queue/wait?${terminationURI}` }, 'queue');
     ...

这将返回一个Twiml,如下所示:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Response>
<Enqueue action=\"queue/left?termination=%sip%sipuri.sip.us1.twilio.com\" method=\"POST\" waitUrl=\"queue/wait?termination=%sip%sipuri.sip.us1.twilio.com\">queue</Enqueue>
</Response>

这可以正常工作,将客户添加到Queue中,并调用queue / wait函数。 函数等待调用执行以下操作:

    //function queue/wait()
    //"body" is the Query parameters that Twilio posts to my WebApp
    ...
    
    //The issue is CurrentQueueSize is ALWAYS 1 even if there is an active call with the single agent


 if(body.CurrentQueueSize == 1 && body.QueuePosition == 1)
{
    
    twiml.play('http://com.twilio.sounds.music.s3.amazonaws.com/oldDog_-_endless_goodbye_%28instr.%29.mp3');
    

    const client = require('twilio')(accountSid, authToken);
    client.calls.create({
         to: 'sip:'+event.queryStringParameters.termination+';region=au1',
         from: body.From,
         twiml: "<Response><Dial><Queue>queue</Queue></Dial></Response>",
       })
      .then(call => console.log(call.sid));
    
}
else
{
    const people = body.QueuePosition
    
    twiml.say(`Thanks for calling! We'll be with you shortly. You are in position number ${people}`);
    twiml.play('http://com.twilio.sounds.music.s3.amazonaws.com/oldDog_-_endless_goodbye_%28instr.%29.mp3');
    twiml.redirect();
}

这将向呼叫者返回一个Twiml,如下所示(播放“保持音乐”并触发通话)

    <?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Response>
<Play>http://com.twilio.sounds.music.s3.amazonaws.com/oldDog_-_endless_goodbye_%28instr.%29.mp3</Play></Response>

最后,一旦第一个呼叫者离开队列,就会触发queue/left() Webhook,该Webhook基本上检查队列中是否还有其他人,如果是,请致电该代理的SIP电话。

//function queue/left()

   if(body.QueueSid)
    {
        
        const client = require('twilio')(accountSid, authToken);
    
        client.queues(body.QueueSid)
          .fetch()
          .then(q => {
                              
              if(q.currentSize > 0)
              {
                    client.calls.create({
                         to: 'sip:'+event.queryStringParameters.termination+';region=au1',
                         from: body.From,
                         twiml: "<Response><Dial><Queue>queue</Queue></Dial></Response>",
                       })
                      .then(call => {});
              }
              
        });

    }

非常感谢您的帮助!

0 个答案:

没有答案