如何为从 WebChat 组件触发的 conversationUpdate 事件更新 channelData?
How can I update channelData for conversationUpdate Event being triggered from WebChat component?
我正在尝试使用 Angular 客户端连接到机器人服务。
我能够连接到 Bot 服务,但是一旦我 post 一条消息 Activity,WebChat 客户端就会向 Bot 发送一个 conversationUpdate 事件,因此我从机器人。 (如果我从客户端将 firstMessage 的 channelData 中的 userToken 发送到 Bot Service,我将不会获得登录卡)。
我正在尝试在 channelData 中发送带有 userToken 的 activity,但是 conversationUpdate 事件在我的消息 activity 之前到达 Bot 服务并且我收到了一张登录卡。
我需要发送自定义 channelData 以及从客户端发送的 conversationUpdate 事件。
使用反向通道机制,我能够为 posting 活动发送自定义 channelData,但是这个 conversationUpdate 事件是从 websocket 内部触发的,我需要拦截这个事件触发器。
代码详情如下:
Index.html
<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
<script src="https://unpkg.com/simple-update-in/dist/simple-update-in.production.min.js"></script>
app.component.ts
// after response from https://directline.botframework.com/v3/directline/conversations
createDirectLine(response: any) {
this.directLine = window.WebChat.createDirectLine({
token: response.token,
webSocket: true,
streamUrl: response.streamUrl,
conversationId: response.conversationId
});
}
this.store = window.WebChat.createStore({},
({dispatch}) => next => action => {
if (action.type === 'DIRECT_LINE/POST_ACTIVITY') {
// add custom channelData to every postActivity
action = window.simpleUpdateIn(action, ['payload', 'activity', 'channelData', 'UserToken'], function () { return this.userToken; });
}
if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
// Send event to bot with custom data
dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
activity: {
type : 'conversationUpdate',
channelData : { 'UserToken : this.userToken}
}
}
})
}
return next(action);
});
renderWebChat() {
window.WebChat.renderWebChat(
{
directLine: this.directLine,
store: this.store
},
this.botWindowElement.nativeElement
);
}
P.S。这不是完整的代码,我只添加了一些片段。
您不应尝试使用网络聊天来直接操纵由 Direct Line 生成的对话更新活动。您可以在创建对话时通过提供用户 ID 来影响这些活动,但其余的都不在您的手中。尝试将令牌嵌入用户 ID 可能不是一个好主意,但您可以将令牌托管在机器人可以使用用户 ID 查找它的地方。
我认为您真正想要做的是向机器人发送一个事件 activity 以指示连接成功,然后使用该事件而不是对话更新。您似乎已经在正确的轨道上,因为您正在尝试响应中间件中的 DIRECT_LINE/CONNECT_FULFILLED 操作。只需尝试按照此处的示例操作:https://github.com/microsoft/BotFramework-WebChat/tree/master/samples/04.api/a.welcome-event
我正在尝试使用 Angular 客户端连接到机器人服务。 我能够连接到 Bot 服务,但是一旦我 post 一条消息 Activity,WebChat 客户端就会向 Bot 发送一个 conversationUpdate 事件,因此我从机器人。 (如果我从客户端将 firstMessage 的 channelData 中的 userToken 发送到 Bot Service,我将不会获得登录卡)。
我正在尝试在 channelData 中发送带有 userToken 的 activity,但是 conversationUpdate 事件在我的消息 activity 之前到达 Bot 服务并且我收到了一张登录卡。
我需要发送自定义 channelData 以及从客户端发送的 conversationUpdate 事件。
使用反向通道机制,我能够为 posting 活动发送自定义 channelData,但是这个 conversationUpdate 事件是从 websocket 内部触发的,我需要拦截这个事件触发器。
代码详情如下:
Index.html
<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
<script src="https://unpkg.com/simple-update-in/dist/simple-update-in.production.min.js"></script>
app.component.ts
// after response from https://directline.botframework.com/v3/directline/conversations
createDirectLine(response: any) {
this.directLine = window.WebChat.createDirectLine({
token: response.token,
webSocket: true,
streamUrl: response.streamUrl,
conversationId: response.conversationId
});
}
this.store = window.WebChat.createStore({},
({dispatch}) => next => action => {
if (action.type === 'DIRECT_LINE/POST_ACTIVITY') {
// add custom channelData to every postActivity
action = window.simpleUpdateIn(action, ['payload', 'activity', 'channelData', 'UserToken'], function () { return this.userToken; });
}
if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
// Send event to bot with custom data
dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
activity: {
type : 'conversationUpdate',
channelData : { 'UserToken : this.userToken}
}
}
})
}
return next(action);
});
renderWebChat() {
window.WebChat.renderWebChat(
{
directLine: this.directLine,
store: this.store
},
this.botWindowElement.nativeElement
);
}
P.S。这不是完整的代码,我只添加了一些片段。
您不应尝试使用网络聊天来直接操纵由 Direct Line 生成的对话更新活动。您可以在创建对话时通过提供用户 ID 来影响这些活动,但其余的都不在您的手中。尝试将令牌嵌入用户 ID 可能不是一个好主意,但您可以将令牌托管在机器人可以使用用户 ID 查找它的地方。
我认为您真正想要做的是向机器人发送一个事件 activity 以指示连接成功,然后使用该事件而不是对话更新。您似乎已经在正确的轨道上,因为您正在尝试响应中间件中的 DIRECT_LINE/CONNECT_FULFILLED 操作。只需尝试按照此处的示例操作:https://github.com/microsoft/BotFramework-WebChat/tree/master/samples/04.api/a.welcome-event