Webot
webot.set(pattern, handler, [, replies])
添加回复规则.
webot.set(pattern, handler, replies)
// or
webot.set({
name: 'rule name',
pattern: function(info) { ... },
handler: function(info, next) {
}
})
我们建议你给每条规则都命名,以方便规则之间互相调用。
webot.set('rule A', {
pattern: /ruleA/,
handler: function() {
},
});
// webot.get('rule A') 即可获得刚才定义的规则
// 可以省略第二个参数里的 pattern ,
// 则规则名会被转换为一个用于匹配的正则
webot.set('你好', function() {
// 随机回复一句话
return ['你也好', '你好', '很高兴认识你'];
});
// 更简单地
webot.set('你好', ['你也好', '你好', '很高兴认识你']);
// 如果 handler 是一个 object ,也会直接作为 reply 返回
webot.set('test music message', {
type: 'music',
url: 'http://example.com/a.mp3'
});
你甚至还可以直接传入一个 Object ,其 key 为 pattern , value 为 handler(只要里面不包括 'handler' 这个 key):
webot.set({
'你好': function() {
// 随机回复一句话
return ['你也好', '你好', '很高兴认识你'];
},
'你是谁': '我是你的小天使呀'
});
webot.delete(ruleName);
你可以根据rule的名字动态的删除一个rule,
webot.delete('rule1');
webot.update(name,{})
你可以根据rule的名字动态的更新rule,参数和set方法的参数一致
webot.update('rule1', {
pattern: 'hello',
handler: function(info) {
info.reply = 'hello';
}
});
有关 replies
的使用,请参考 rule.replies 。
webot.get(ruleName)
根据它的名字获取规则。ruleName
必须是一个字符串。
webot.waitRule(name, [handler])
给 info.wait
设置等规。必须提供一个有效的name
.如果处理器未响应,尝试获得那个名字的等待规则.
等待规则
即只在等待用户回复时才执行的规则。等待规则,在返回结果后结束。如果不想结束请使用info.rewait()
;
// 定义一个 wait rule
webot.waitRule('wait_guess', function(info) {
var r = Number(info.text);
// 用户不想玩了...
if (isNaN(r)) {
info.resolve();
return null;
}
var num = info.session.guess_answer;
if (r === num) {
return '你真聪明!';
}
var rewaitCount = info.session.rewait_count || 0;
if (rewaitCount >= 2) {
return '怎么这样都猜不出来!答案是 ' + num + ' 啊!';
}
//重试
info.rewait();
return (r > num ? '大了': '小了') +',还有' + (2 - rewaitCount) + '次机会,再猜.';
});
webot.set('guess number', {
description: '发送: game , 玩玩猜数字的游戏吧',
pattern: /(?:game|玩?游戏)\s*(\d*)/,
handler: function(info){
//等待下一次回复
var num = Number(info.param[1]) || _.random(1,9);
verbose('answer is: ' + num);
info.session.guess_answer = num;
info.wait('wait_guess');
return '玩玩猜数字的游戏吧, 1~9,选一个';
}
});
webot.beforeReply(handler)
添加预处理规则。 每次在检测回复规则之前 rule.handler
将被调用。
预处理规则,可以对发来的消息进行预处理,比如从数据库取出用户等。
webot.beforeReply(function load_user(info, next) {
User.get(info.uid, function(err, user) {
if (err) return next(err);
info.user = user; // attach this user object to Info.
next();
});
});
webot.afterReply()
添加后回复规则。每次获得回复后 rule.handler
将被调用。
获得回复内容或对消息再处理,比如简繁转化。
webot.domain(pattern, handler, replies)
添加指定的域规则,规则组的中间件。
实例:
webot.domain('domain-1', function require_user(info) {
if (!info.user) {
return 'Must login first';
}
});
webot.set('domain-1 act-1', {
domain: 'domain-1',
pattern: /some pattern/,
handler: function()..
});
webot.set('domain-1 act-2', {
domain: 'domain-1',
pattern: /another pattern/,
handler: function()..
});
所以 /some pattern/
和 /another pattern/
被匹配时, 机器人将首先运行 domain-1
中间件,检测用户是否登陆。
webot.loads(file1, [file2, ...])
载入 nodejs 模块作为 webot 的回复规则,以方便你在比较复杂的项目中组织文件。
file1, file2 是相对于调用此方法的文件所在目录的文件名。
webot.loads('./rules/a', './rules.b');
在文件 ./rules/a.js
和 ./rules/b.js
里是:
module.exports = function(webot) {
webot.set('rule_a', function(info, next) {
// ...
});
webot.set('rule_a_1', 'some reply');
};
或者使用简的规则定义
module.exports = {
pattern: /some pattern/,
handler: function(info, next) {
// ...
},
};
webot.dialog(file1, [file2, ...])
增加对话规则
webot.dialog({
'hello': '哈哈哈',
'hi': ['好吧', '你好']
});
// 或者
webot.dialog('./rules/foo.js', './rules/bar.js');
在文件 rules/foo.js
里:
module.exports = {
'hello': '哈哈哈',
'hi': ['好吧', '你好']
};
使用YAML
你也可以在你的项目中 require('js-yaml')
,
采用简洁的 yaml 语法来定义纯文本的对话规则:
在 package.json
里:
"dependencies": {
...
"js-yaml": "~2.0.3"
...
}
在你得 app.js
:
require('js-yaml');
webot.dialog('./rules/abc.yaml');
在 rules/abc.yaml
里:
直接回复
hi: 'hi,I am robot'
随机回复一个
hello:
- 你好
- fine
- how are you
匹配组替换
/key (.*)/i: '你输入了: {1}, \{1}这样写就不会被替换'
也可以是一个rule定义;如果没有定义pattern,自动使用key
yaml:
name: 'test_yaml_object'
handler: '这是一个yaml的object配置'
webot.reset()
重置所有规则, 当应用在运行中你可以重载规则.
webot.watch(app, [options])
添加标准中间件到express应用中. 包括:
- options.verify: 验证请. 默认: 始终通过.
- options.parser: 解析请求体. 默认: 使用
req.body
. - options.send: to send reply. 默认: use
res.json
. - options.sessionStore: 存储机器人对话, 就像express的 cookieSession.
- options.path: 监测哪里. 默认: "/".
- options.prop:
req
或者res
的属性名附加分析和应答的数据. 默认: "webot_data".
中间件布局将是:
app.get(path, verify);
app.post(path, verify, parser, function(req, res, next) {
webot.reply(req[prop], function(err, info) {
res[prop] = info;
next();
});
}, send);