2017-07-27 12 views
0

PromptDialog.Choice()を使用して会話を積極的に開始することが期待どおりに機能していないことがわかりました。私が何か間違っているのか、それともボットフレームワークの問題なのだろうかと思います。PromptDialog.Choice()のメッセージ処理が正しくありませんか?

私はこのような私のルートダイアログのプロンプトを使用しています:

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

問題は、ルートダイアログのために複数のメッセージが到着することです。少なくとも2つの「会話が更新されました」というメッセージがあります.1つはボットを追加するメッセージ、もう1つはユーザーを追加するメッセージです。

プロンプトダイアログでは、それらを回答として解釈しますが、利用可能なプロンプトの選択肢と一致しません。したがって、プロンプト・ダイアログはもう一度試行し、再度表示します。その結果、私は会話の開始時に常に複数のプロンプトを表示します。

私はそれを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:のチェックを使ってdialogを投げてconversationUpdateをフィルタリングするだけで、Idは' message.Recipient.Id'と違ってボットを除外する必要があります。だから私はあなたのMessageControllerのコードを尋ねた;) –

答えて

0

コメントの回答では、userが会話に参加していることが通知された場合にのみ、PromptChoiceを含むダイアログを起動することができます。

あなたはconversationUpdateメッセージ内MemberAdded情報をチェックして、追加されたメンバーは、ボットない場合にのみ、あなたのダイアログを起動することができ、その場合には、そのメンバーの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が異なるかどうかをチェックする必要があるため、重複してください。 –

関連する問題