如何通过直接线路从机器人对话 (c#) 向客户端 (angular) 发送 activity
How to send an activity from a bot dialog (c#) trough direct line to a client (angular)
当我在某个对话中时,我正在尝试将事件 activity 从机器人发送到客户端,但我无法让它工作...任何建议或代码我可以看看样品吗?
此外,我已经尝试创建一个反向通道并且它可以工作,但据我所知,它在机器人端只能在消息控制器中工作。
编辑*
很抱歉没有提供任何细节,上周我很匆忙。
所以我正在制作一个机器人,它将为用户填写 "report",机器人提出问题,用户给出答案。对于第一个问题,当我在第一个对话框中时,我必须在我的 angular 应用程序中调用一个函数,即在根对话框之后,它将检查用户输入和 return 一个 "Account" 如果帐户存在,则反对机器人,如果不存在,则它 return 为空...(而且我知道只创建一个 API 并直接连接到机器人,但我必须使用 angular)
我正在像这样使用后台频道:
botConnection.activity$
.filter( activity => {
// tslint:disable-next-line:max-line-length
return (activity.type === 'message' && activity.from['id'] === 'VisitReportV3' && activity.text === 'Please select an account...') ||
(activity.type === 'message' && activity.from['id'] === 'user' && this.accountFlag)
})
.subscribe(activity => {
if (activity.from['id'] === 'VisitReportV3' && activity.text === 'Please select an account...') {
console.log('"account" received');
this.accountFlag = true;
postAccountInfo();
} else if (activity.from['id'] === 'user' && this.accountFlag) {
console.log('"account" flag recieved');
this.accountFlag = false;
}
});
这可能是完全错误的,但我不知道该怎么做..
tl;博士:
所以简而言之,我需要检查我是否在第一个对话框(或要求我提供帐户的对话框)中,如果我在然后等待下一个用户输入并调用 angular 函数来检查输入并查看是否有匹配的帐户,如果不匹配 return null 如果匹配 return 将序列化对象发送给机器人进行更多处理...我希望这能解释一些更多
在您的消息控制器中,您可能只将带有消息类型的活动转发到您的对话框。如果你使用默认的机器人模板,你可能有类似
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.GetActivityType() == ActivityTypes.Message)
{
await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
您需要更改为
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.GetActivityType() == ActivityTypes.Message || activity.GetActivityType() == ActivityTypes.Event)
{
await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
这会将消息和事件发送到您的对话框。请记住,您现在需要在每个对话框方法中检查它们,特别是当您期待事件时,因为用户可以在您的事件发送之前键入并发送消息。
编辑
您无法从 activity.from['id']
获取对话框名称。但是,在您的对话框中,您可以创建一个 Activity 回复并将名称设置为其他名称。例如在你的对话中,
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
Activity activity = await result as Activity;
Activity reply = activity.CreateReply();
reply.Text = "Please select an account...";
reply.Name = "VisitReportV3";
await context.PostAsync(reply);
}
然后在您的后台频道 JavaScript 中,您将从检查是否 activity.from['id'] === "VisitReportV3"
更改为 activity.name === "VisitReportV3"
。
当我在某个对话中时,我正在尝试将事件 activity 从机器人发送到客户端,但我无法让它工作...任何建议或代码我可以看看样品吗?
此外,我已经尝试创建一个反向通道并且它可以工作,但据我所知,它在机器人端只能在消息控制器中工作。
编辑*
很抱歉没有提供任何细节,上周我很匆忙。
所以我正在制作一个机器人,它将为用户填写 "report",机器人提出问题,用户给出答案。对于第一个问题,当我在第一个对话框中时,我必须在我的 angular 应用程序中调用一个函数,即在根对话框之后,它将检查用户输入和 return 一个 "Account" 如果帐户存在,则反对机器人,如果不存在,则它 return 为空...(而且我知道只创建一个 API 并直接连接到机器人,但我必须使用 angular)
我正在像这样使用后台频道:
botConnection.activity$
.filter( activity => {
// tslint:disable-next-line:max-line-length
return (activity.type === 'message' && activity.from['id'] === 'VisitReportV3' && activity.text === 'Please select an account...') ||
(activity.type === 'message' && activity.from['id'] === 'user' && this.accountFlag)
})
.subscribe(activity => {
if (activity.from['id'] === 'VisitReportV3' && activity.text === 'Please select an account...') {
console.log('"account" received');
this.accountFlag = true;
postAccountInfo();
} else if (activity.from['id'] === 'user' && this.accountFlag) {
console.log('"account" flag recieved');
this.accountFlag = false;
}
});
这可能是完全错误的,但我不知道该怎么做..
tl;博士:
所以简而言之,我需要检查我是否在第一个对话框(或要求我提供帐户的对话框)中,如果我在然后等待下一个用户输入并调用 angular 函数来检查输入并查看是否有匹配的帐户,如果不匹配 return null 如果匹配 return 将序列化对象发送给机器人进行更多处理...我希望这能解释一些更多
在您的消息控制器中,您可能只将带有消息类型的活动转发到您的对话框。如果你使用默认的机器人模板,你可能有类似
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.GetActivityType() == ActivityTypes.Message)
{
await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
您需要更改为
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.GetActivityType() == ActivityTypes.Message || activity.GetActivityType() == ActivityTypes.Event)
{
await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
这会将消息和事件发送到您的对话框。请记住,您现在需要在每个对话框方法中检查它们,特别是当您期待事件时,因为用户可以在您的事件发送之前键入并发送消息。
编辑
您无法从 activity.from['id']
获取对话框名称。但是,在您的对话框中,您可以创建一个 Activity 回复并将名称设置为其他名称。例如在你的对话中,
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
Activity activity = await result as Activity;
Activity reply = activity.CreateReply();
reply.Text = "Please select an account...";
reply.Name = "VisitReportV3";
await context.PostAsync(reply);
}
然后在您的后台频道 JavaScript 中,您将从检查是否 activity.from['id'] === "VisitReportV3"
更改为 activity.name === "VisitReportV3"
。