有没有办法使用Conversation以便将发送给用户的IMessageActivity返回给调用者而不是发送回用户uri?
我想要完成的是处理自己的传入和传出消息,虽然我可以创建一个要提供给Conversation对象的活动,但我无法读取并使用IMessageActivity回复。
更具体地说,我想知道我是否可以替换
Conversation.SendAsync(IMessageActivity, Func<IDialog<object>>);
有一些东西让我处理回复。
谢谢。
答案 0 :(得分:0)
回复应由传递给SendAsync
方法的对话框处理。
在对话框中,您通常会有一个接收上下文和用户发送的消息的方法。例如:
public async virtual Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
}
在对话框的StartAsync
方法中,您必须将此方法设置为用户向机器人发送消息后将调用的方法
public async Task StartAsync(IDialogContext context)
{
context.Wait(this.MessageReceivedAsync);
}
然后,由您决定在收到消息后该做什么。
您要使用PromptDialog
,例如确认一个?您可以,只需实例化对话框,调用它并使用ResumeAfter<bool>
方法获得结果。
PromptDialog.Confirm(context, ResumeAfterPrompt, "prompt dialogue", "retry dialog", 3);
private async Task ResumeAfterPrompt(IDialogContext context, IAwaitable<bool> result)
{
try
{
// try get user response
bool response = await result;
await context.PostAsync($"You said: {result}");
}
catch (TooManyAttemptsException)
{
// handle error
}
// wait for another message from the user. Could be the same method or a new one following the same signature.
context.Wait(this.MessageReceivedAsync);
}
您想使用FormFlow吗?您也可以实例化FormDialog
并在您定义的ResumeAfter<T>
方法中获得结果。
使用多个对话框时,它总是相同的模式(提示和表单是对话框!):调用对话框,在ResumeAfter方法中获取结果并等待新的用户消息。
所有这些概念都得到了很好的解释,并在Multi-Dialogs sample中得到了证明。阅读自述文件和代码库,您将了解我的解释。该示例显示了提示,FormFlow,自定义对话框等。Here还有一些详细信息。