我有以下代码尝试在聊天会话期间设置用户名。例如。如果用户写入消息“嗨,我的名字是Bob”,机器人将通过用他的名字问候用户来回应,但前提是该名称被标记为“名称”实体。
问题在于,名称是针对当前与机器人聊天的每个用户全局设置的,而不是仅针对当前用户。换句话说,在这种情况下,机器人将呼叫当前正在与Bob聊天的每个用户。
var intents = new builder.IntentDialog({ recognizers: [recognizer] })
// Check if the message user sent matches LUIS intent "greetingsWithName"
.matches('greetingsWithName', (session, args) => {
// Attempt to set content of LUIS entity "name" to variable "name"
name = builder.EntityRecognizer.findEntity(args.entities, 'navn');
// Check whether the name was successfully set or not
if (!name) {
session.send('Sorry, I didn't catch your name.')');
} else {
session.userData.userName = name.entity;
session.send('Hi, ' + session.userData.userName);
});
稍后我会检查代码是否在会话期间用户是否已将其名称提供给机器人。如果是这样,那么用他的名字告别用户:
.matches('goodBye', (session) => {
if (!session.userData.userName) {
session.send('Good bye!');
} else {
session.send('Good bye, ' + session.userData.userName);
}
})
bot.dialog('/', intents);
以下是启动网络聊天会话的文件中的HTML代码:
<!DOCTYPE html>
<html>
<head>
<link href="https://cdn.botframework.com/botframework-webchat/latest/botchat.css" rel="stylesheet" />
</head>
<body>
<div id="bot"/>
<script src="https://cdn.botframework.com/botframework-webchat/latest/botchat.js"></script>
<script>
BotChat.App({
directLine: { secret: direct_line_secret },
user: { id: 'userid' },
bot: { id: 'botid' },
resize: 'detect'
}, document.getElementById("bot"));
</script>
</body>
</html>
答案 0 :(得分:1)
您将用户的名称存储在userData
中,这是合乎逻辑的。
但是在您的测试人员中,您为每个网络聊天用户设置了相同的用户ID:
user: { id: 'userid' }
因此,每个用户都会指向相同的userData
,因为密钥是渠道名称和用户ID的组合(C#中的activity.ChannelId
,activity.From.Id
。
您可以通过为每个网络聊天用户生成唯一标识符来避免这种情况,例如使用https://www.npmjs.com/package/uuid-random
在这种情况下,user: { id: uuid() }
。
此外,如果您需要设置显示名称,请将name: '...'
添加到用户定义:user: { id: uuid(), name: 'You' }
。