2017-07-27 85 views
0

我注意到,使用PromptDialog.Choice()主動開始對話並不像預期的那樣工作,並想知道我是否做錯了什麼或者它是否是bot框架中的問題。PromptDialog.Choice()的消息處理不正確?

我使用的提示在我的根對話是這樣的:

public async Task StartAsync(IDialogContext context) 
{ 
    PromptDialog.Choice(...); 
} 

的問題是根對話多個消息到達。至少有兩個「對話更新」消息,一個用於添加機器人,另一個用於添加用戶。

提示對話框將這些解釋爲答案,當然它們與可用的提示選項不匹配。因此,提示對話框再次嘗試並再次顯示。因此,我總是會在對話開始時收到多個提示。

我將其追蹤到dialog中的消息處理程序,並且看到它不檢查消息類型。作爲一種變通方法我已經創建了自己的提示對話框而忽略所有的非消息類型的活動,現在它按預期工作:

[Serializable] 
public class CustomPromptDialog : PromptChoice<string> 
{ 
    public CustomPromptDialog(string title, params string [] buttons) : base(
     new PromptOptions<string>(prompt: title, retry: "", tooManyAttempts: "", options: new List<string>(buttons), attempts: 2, promptStyler: null)) 
    { 
    } 

    protected async override Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> message) 
    { 
     var activity = await message; 

     // This is what is IMHO missing in the built-in version. 
     if(activity.Type != ActivityTypes.Message) 
     { 
      return; 
     } 

     await base.MessageReceivedAsync(context, message); 
    } 
} 

我使用提示錯誤或者是在框架中的錯誤?

+0

你可以添加你的MessageController的代碼嗎?您不應該將ConversationUpdate消息路由到您的對話框 –

+0

嗯,這是事情:如果我想主動顯示選擇對話框,我必須對_something_做出反應,這意味着對話更新;我不想等待第一個傳入的用戶消息。我真的不得不在_last_傳入會話更新中顯示提示對話框,但我怎麼知道有多少人? – Krumelur

+1

您只需通過使用'message.MembersAdded:'上的一個檢查來篩選conversationUpdate對話框,該id應該與'message.Recipient.Id'不同以排除機器人。這就是爲什麼我要求你的MessageController的代碼;) –

回答

0

正如評論中所回答的那樣,您的案例解決方案僅在您收到user加入對話時才啓動包含PromptChoice的對話框。

對於這種情況,你可以檢查MemberAdded信息裏面conversationUpdate消息,只有當新增加的成員是不是機器人啓動您的對話,也就是會員的ID不等於機器人的ID,這是message.Recipient.Id

private Activity HandleSystemMessage(Activity message) 
{ 
    if (message.Type == ActivityTypes.ConversationUpdate) 
    { 
     if (message.MembersAdded.Any(o => o.Id != message.Recipient.Id)) 
     { 
      // Your PromptChoiceDialog here   
     } 
    } 
    return message; 
} 
+0

該問題被標記爲重複,爲什麼添加了答案? –

+0

@EzequielJadib它不在答案的時候,即使我標記了它(我不確定它最終會被標記爲重複),我添加了答案,因爲與答案相比也有一個小的變化重複的,因爲測試必須檢查Id是否不同,不相等。 –