Skip to content

Instantly share code, notes, and snippets.

@williamherry
Last active April 1, 2016 16:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save williamherry/c780affc9108634b785c to your computer and use it in GitHub Desktop.
Save williamherry/c780affc9108634b785c to your computer and use it in GitHub Desktop.
Hubot Explore

安装

Hubot需要Node和npm的比较新的版本,Mac os x安装非常简单,从nodejs.org下载安装就可以了

➜  node --version
v0.12.4
➜  npm --version
2.10.1

如果你的系统版本比较旧,可能需要升级一下,升级和安装一样,从nodejs.org下载从新安装就可以了

Hubot现在用generator来生成要使用的项目,而不是之前的直接clone它的代码

➜  npm install -g yo generator-hubot
➜  mkdir myhubot
➜  cd myhubot
➜  yo hubot

执行yo hubot的时候会需要配置一个参数,直接回车就可以了

执行完之后就可以启动hubot了

➜  cd myhubot
➜  ./bin/hubot
myhubot>
myhubot> myhubot ping
PONG

注意: 由于执行yo hubot进行配置的使用Bot name默认是目录的名字即myhubot我们没有改,所以输命令的时候前面的前导也需要是myhubot,可以编辑bin/hubot文件改成自己喜欢的名字

exec node_modules/.bin/hubot --name "myhubot" "$@"

编写Script

Hubot Script使用CoffeeScript,放在scripts目录下会自动加载.该目录下还有个example.coffee里面好多的例子,基本涵盖了所以的语法

先看一个最简单的例子

module.exports = (robot) ->
  robot.respond /PING$/i, (msg) ->
    msg.send "PONG"
    
  robot.respond /ADAPTER$/i, (msg) ->
    msg.send robot.adapterName

非常简单,不用解释都能看明白,这里类似robot.respond中的respond的东西主要有三个: hear, respondrouter

hearrespond的区别可以简单理解成hear是模糊匹配,respond是精确匹配,用respond有隐含的条件就是后面的正则表达式是包含^的,像ping的例子,实际的匹配正则是/^PING$/, ping只能是紧跟在Bot name即(myhubot)后面才行,而如果改成hear

module.exports = (robot) ->
  robot.hear /PING$/i, (msg) ->
    msg.send "PONG"

那么只要你发的消息以ping结尾(注意还有个$表示结尾)都可以触发这个Script

router可以用来匹配http请求,和bearychat的集成就是用的这个,集成到简聊(bearychat)的hook代码.example.coffee里也有例子,一般的情况应该用不到

类似msg.sendsend的东西还有reply, emote,会有一些细微的差别如,reply会直接回复给发命令的人(可能是@那个人,具体不知道),但由于和bearychat的集成现在还使用很挫的方法,好多东西不支持.所以简单说用send就好了

如果你的script需要保存一些数据,可以用brain,例子一看就懂

robot.respond /have a soda/i, (res) ->
  # Get number of sodas had (coerced to a number).
  sodasHad = robot.brain.get('totalSodas') * 1 or 0

  if sodasHad > 4
    res.reply "I'm too fizzy.."

  else
    res.reply 'Sure!'
  
    robot.brain.set 'totalSodas', sodasHad+1

简单的调试也是可以的

module.exports = (robot) ->
  robot.respond /PING$/i, (msg) ->
    robot.logger.warning "PONG"
    msg.send "PONG"
hubot> hubot ping
[Wed Jun 10 2015 07:03:45 GMT+0800 (CST)] WARNING PONG
PONG
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment