我正在尝试使用Javascript将新的wit.ai Bot Engine连接到hubot。 不幸的是,我不是JS开发人员所以我很挣扎。
这是我的代码:
'use strict';
const Wit = require('../../../node-wit').Wit;
const firstEntityValue = (entities, entity) => {
const val = entities && entities[entity] &&
Array.isArray(entities[entity]) &&
entities[entity].length > 0 &&
entities[entity][0].value
;
if (!val) {
return null;
}
return typeof val === 'object' ? val.value : val;
};
const actions = {
say: (sessionId, msg, cb) => {
console.log(msg);
cb();
},
merge: (context, entities, cb) => {
const loc = firstEntityValue(entities, "location");
if (loc) context.loc = loc;
cb(context);
},
error: (sessionId, msg) => {
console.log('Oops, I don\'t know what to do.');
},
'fetch-weather': (context, cb) => {
// Here should go the api call, e.g.:
// context.forecast = apiCall(context.loc)
context.forecast = 'sunny';
cb(context);
},
};
const client = new Wit('MY_TOKEN_HERE', actions);
client.interactive();
module.exports = function(robot) {
robot.respond(/hey\s+(.+$)/i, function(msg){
var match = msg.match[1];
msg.send("I've heared: " + match);
console.log(match)
process.stdout.write(match);
});
}
脚本侦听“hey botname”并输出此后写的内容。我的问题是我不知道如何将此输入发送到机智客户端。在没有hubot的情况下在bash中使用这个脚本可以正常运行,因为这是基于wit.ai的快速启动示例。
我面临的另一个问题是,我希望hubot在每个用户的私有频道中收听并让它响应每条没有前缀的消息。正如节点示例在控制台中所做的那样。
帮助很高兴!
答案 0 :(得分:1)
好的,经过一段时间的努力,我完成了这项工作。 这是我的hubot脚本现在的样子:
'use strict';
const Wit = require('../../../node-wit').Wit;
var room;
const firstEntityValue = (entities, entity) => {
const val = entities && entities[entity] &&
Array.isArray(entities[entity]) &&
entities[entity].length > 0 &&
entities[entity][0].value
;
if (!val) {
return null;
}
return typeof val === 'object' ? val.value : val;
};
const actions = {
say: (sessionId, msg, cb) => {
console.log(msg);
room.send(msg)
cb();
},
merge: (context, entities, cb) => {
const loc = firstEntityValue(entities, "location");
if (loc) context.loc = loc;
cb(context);
},
error: (sessionId, msg) => {
console.log('Oops, I don\'t know what to do.');
room.send('Oops, I don\'t know what to do.')
},
};
const client = new Wit('MY_TOKEN_HERE', actions);
//client.interactive();
module.exports = function(robot) {
robot.listen(function(msg) {
var userID = msg.user.id;
var roomID = msg.user.room;
// is this a direct chat(private room)?
if(roomID.indexOf(userID) >= 0){
if(typeof msg.text == "string"){
client.pxMessage(msg.text);
}
}
return true;
},
function(response){
// save room for replys
room = response;
});
}
另外,我做了一个糟糕的黑客知识来完成这项工作。我添加了以下函数,因为我无法使用可用的方法来实现此功能。基本上回调和会话让我退缩:
this.pxMessage = (message) => {
const sessionId = uuid.v1();
const context = {};
const steps = 5;
this.runActions(
sessionId,
message,
context,
(error, context) => {
if (error) {
l.error(error);
}
rl.prompt();
},
steps
);
}
如果有人会更进一步并正确实施,我很乐意看到结果。这个黑客工作,我们现在有一个非常聪明的机器人在我们的rocket.chat谁理解自然语言和每天学习。
答案 1 :(得分:0)
您可以直接使用此模块,它似乎运行良好:https://www.npmjs.com/package/hubot-wit
我刚刚完成整合。您只需要提供环境变量WIT_TOKEN
,它就能很好地工作!