簡體   English   中英

使用 Twilio 任務路由器執行非電話相關任務時“無法發出 Dequeue”

[英]"Failed to issue Dequeue" when using Twilio Task Router for non-phone related tasks

注意:下面的代碼片段是有效的。 這篇文章中提到的“出隊”錯誤是基於這些腳本外部的現有分配回調。 刪除 URL 並將 reservation.dequeue 移至此代碼后,錯誤就解決了。

我們正在開發使用兩個人之間的對話的聊天應用程序。 當用戶發起聊天時,我目前已通過以下步驟將其“連接”起來:

  1. 對話已創建。
  2. 用戶已創建。
  3. 用戶被添加到對話中。
  4. 任務是使用屬性中的對話元數據創建的。

(隨后在其他用戶的session上接受預訂等步驟)

這些步驟按預期工作,但由於任務不是來電,因此會生成“40140 - 由於缺少 'call_sid' 屬性而無法發出出列指令” 我嘗試將任務放入“SMS”任務通道,但這並沒有阻止錯誤。

我找不到任何有關創建基於非電話呼叫的任務的特定文檔,因此我可能錯誤地設置了任務路由。

以下代碼片段顯示了我如何(在 .NET 中)創建對話、用戶和任務,以及我如何(在 TaskRouter.js 中)接受預訂。

/***********************************************************************************************************
This code is server-side in .NET
***********************************************************************************************************/
public ConversationCredentials CreateConversation( string program, string name )
{
  var memberId = DateTime.Now.ToString( "yyyyMMdd" );  // Temporary
  TwilioClient.Init( _twilioAccountSid,_twilioAuthToken );

  // If we decide to keep conversations on Twilio, we should replace the memberid with phiid, since member id might change

  var conversation = ConversationResource.Create(
    friendlyName: memberId + "_" + DateTime.Now.ToString( "HHmmss" )
  );

  var conversationCredentials = JoinConversation( conversation.Sid, name );
  var taskSid = CreateTask( program, conversation.Sid, memberId );

  conversationCredentials.taskSid = taskSid;
  
  return conversationCredentials;
}

public ConversationCredentials JoinConversation( string conversationSid, string name )
{
  var identity = name + "_" + DateTime.Now.ToString( "HHmmss" ); // Makes sure the user is unique, in case it's an employee joining more than one chat session)
  TwilioClient.Init( _twilioAccountSid,_twilioAuthToken );

  var participant = ParticipantResource.Create(
    pathConversationSid: conversationSid,
    identity: identity
  );

  var user = UserResource.Update(
    pathSid: identity,
    friendlyName: name
  );

  var token = GetJWT( _twilioConversationServiceSid, name );  // Conversation Service Sid

  var conversationCredentials = new ConversationCredentials();
  
  conversationCredentials.token = token;
  conversationCredentials.conversationSid = conversationSid;
  conversationCredentials.participantSid = participant.Sid;
  conversationCredentials.participantName = name;
  conversationCredentials.participantIdentity = participant.Identity;

  return conversationCredentials;
}

public string CreateTask( string program, string conversationSid, string memberId )
{

  TwilioClient.Init( _twilioAccountSid, _twilioAuthToken );

  var attributes = JsonConvert.SerializeObject( new Dictionary<string,Object>()
  {
    {"conversationSid", conversationSid },
    {"memberId",        memberId        },
    {"program",         program         },
    {"call_sid",        "CHAT"          }
  }, Formatting.Indented);

  var task = TaskResource.Create(
    attributes: attributes,
    workflowSid: _twilioWorkflowSid,
    pathWorkspaceSid: _twilioWorkspaceSid_Nurses,
    taskChannel: "Default"
  );

  return task.Sid;

}
/***********************************************************************************************************
This code is browser-side using TaskRouter.js
NOTE: This handles both voice (works fine) and conversations (the part in question)
***********************************************************************************************************/
registerTaskRouterCallbacks( _this ) : void {
this.worker.on('ready', function(worker) {
  _this.updateButton( worker.activityName, "" );
});

this.worker.on("reservation.created", function(reservation) {
  if ( reservation.task.attributes.type != "CHAT" )
  {
    _this.updateButton( "Call", reservation.task.attributes.from.replace( "+1", "" ) );
    reservation.dequeue();
  } else {
    _this.updateButton( "Chat", reservation.task.attributes.memberId );
    confirm("You have an incoming chat!");
    reservation.accept();
    // This is where the chat window would pop-up
  }
});

this.worker.on("reservation.accepted", function(reservation) {
  _this.worker.update({"ActivitySid": _this.activitySids["Busy"][0].sid});
  _this.updateButton( "Busy", "" );
});

這篇文章中提到的“出隊”錯誤是基於這些腳本外部的現有分配回調。 刪除 URL 並將 reservation.dequeue 移至此代碼后,錯誤就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM