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);