github社製ããããã¬ã¼ã ã¯ã¼ã¯ãhubotãIRCãããã¨ãã¦å°å ¥ãã話(ä¿®æ£ãã
ä¿®æ£: 2/10
node-cronã使ã£ãã³ã¼ãã®ä¾ãééã£ã¦ããã®ã§ä¿®æ£ã
github社製ã®ããããã¬ã¼ã ã¯ã¼ã¯ãhubotãIRCãããã¨ãã¦å°å ¥ãã話ã
ã¤ã³ã¹ãã¼ã«
hubotã¯node.jsã¨coffescriptã§æ¸ãããgithub社製ã®ããããã¬ã¼ã ã¯ã¼ã¯ãIRCã«éãããcampfireãtwitterãªã©ããã¤ãã®ã¢ããã¿ã«å¯¾å¿ãã¦ããããããã§ã¯IRCã§å©ç¨ããããã®å°å ¥æé ãè¨ãã
ãããããnode.jsã¨npmãã¤ã³ã¹ãã¼ã«ãã¦ããã¦ãhubotãã¤ã³ã¹ãã¼ã«ããã
$ git clone git://github.com/github/hubot.git $ cd hubot $ npm install
hubotã¯ãããããæ±ããã¼ã¿ãæ°¸ç¶åããããã«redisã¨ããKVSãå©ç¨ãããredisãå ¥ã£ã¦ããªãæã¯ã¨ã©ã¼ã«ãªãã®ã§åããåã«ã¤ã³ã¹ãã¼ã«ããã
ã¡ãã£ã¨è©¦ãã¦ã¿ãããã©redisã¾ã§å ¥ããã®ã¯é¢åã¨ããæã¯ãhubot/hubot-scripts.jsonãã "redis-brain.coffee" ãåãé¤ãã
$ cat hubot-script.json ["redis-brain.coffee", "tweet.coffee", "shipit.coffee"] $ vim hubot-script.json $ cat hubot-script.json ["tweet.coffee", "shipit.coffee"]
ããã§ãã¡ãã¨ã¤ã³ã¹ãã¼ã«ã§ãããã©ãã試ãããã«ä»¥ä¸ã¿ããã«hubotãèµ·åãã¦ã¿ãã
$ cd hubot $ ./bin/hubot Hubot>
ãã®ã³ãã³ãã©ã¤ã³ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ã主ã«ãããã°ç¨ãåä½ç¢ºèªç¨ã«å©ç¨ãããç¹ã«ã¨ã©ã¼ãåºãªããã°æåãæåããå©ç¨ã§ããã³ãã³ãã®ä¸è¦§ã¯hubot helpã§è¦ãã
Hubot> hubot help Hubot> <keyword> tweet - Returns a link to a tweet about <keyword> <user> is a badass guitarist - assign a role to a user <user> is not a badass guitarist - remove a role from a user (ä¸ç¥) who is <user> - see what roles a user has youtube me <query> - Searches YouTube for the query and returns the video
試ãã«hubot img hogeã¨ããã£ã¦ã¿ãã¨ãhogeã§æ¤ç´¢ãã¦åºã¦ããç»åã®urlã帰ã£ã¦ããã
Hubot> hubot img hoge http://www.wrapupp.com/wp-content/uploads/2011/08/DM_090513_NFL_HOGEonTAYLOR.jpg#.png
hubotç¨ã®ã¹ã¯ãªããã¯hubot-scriptsã¨ããå¥ã®ãªãã¸ããªã«ããããåãããã¦ããã®ã§é©å½ã«ç©è²ããã
IRCã¢ããã¿ã®å°å ¥
次ã¯hubotãIRCãã£ã³ãã«ä¸ã§åããããã®ã¢ããã¿ãå°å ¥ããã
IRCç¨ã®ã¢ããã¿ã¯githubã®å¥ã®ãªãã¸ããªã«公開されているã®ã§ãそれのインストール手順ã«å¾ã£ã¦ãhubot/package.jsonã®ä¾åé¢ä¿ã«hubot-ircã追å ãã¦npm installããã¨å°å ¥ã§ããã
$ cd hubot $ cat package.json | tail -n 8 "dependencies": { "hubot": "2.1.0", "hubot-scripts": "2.0.2", "optparse": "1.0.3", "hubot-irc": "0.0.6" // 追å } } $ npm install
ã©ã®IRCãµã¼ãã¨ãã£ã³ãã«ã§å©ç¨ããããªã©ã®è¨å®ãå«ãã 以ä¸ã®ãããªèµ·åã¹ã¯ãªãããæ¸ãã
#!/bin/bash # runhubot export HUBOT_IRC_NICK="hubot" export HUBOT_IRC_ROOMS="#all,#hoge,#fuga" export HUBOT_IRC_SERVER="irc.example.com" export HUBOT_IRC_PASSWORD="hoge" /path/to/hubot/bin/hubot -a irc
èµ·åã
$ ./runhubot &
IRCãã£ã³ãã«ã確èªãã¦hubotãããã°æåã
hubotã使ã£ã¦ã³ãã³ããæ¸ã
hubotã¯ããããã¬ã¼ã ã¯ã¼ã¯ã§ããã®ã§ãé©å½ã«èªåã§ãªããã³ãã³ããä½ããã¨ãåºæ¥ããæã£åãæ©ãä½ãã³ãã³ããä½ãå ´åã¯ãhubot/scirptsãã£ã¬ã¯ããªä»¥ä¸ã«.coffeeãã¡ã¤ã«ã.jsãã¡ã¤ã«ãç½®ãã¨èµ·åæã«èªã¿è¾¼ãã§ãããã
以ä¸ã¯ãhello worldã¨ãã£ããã«æ¸ãã¨ãããã«ã¡ã¯ä¸ç!ãã¨è¿ãã¦ãããã³ãã³ãã®ä¾ãã¤ã³ã¹ãã¼ã«ããå ã®hubot/scripts以ä¸ã«ã¯ãã§ã«ããã©ã«ãã§å©ç¨ã§ããã³ãã³ããããããããã®ã§ããããè¦ã¤ã¤ã³ãã³ããä½ã£ã¦ããã¨è¯ãã
# helloworld.coffee module.exports = (robot) -> robot.hear /hello world/, (msg) -> msg.send "ããã«ã¡ã¯ä¸ç!"
hubotãåèµ·åãã¦è©¦ãã¦ã¿ãã
$ ./bin/hubot Hubot> hello world Hubot> ããã«ã¡ã¯ä¸ç!
coffeescript使ããããªããã¨ããã人ã¯æ®éã«JavaScriptã§ãæ¸ããã
// hoge.js module.exports = function(robot) { robot.hear(/hoge/, function(msg) { msg.send('hogehoge-'); }); };
ãããã®ãã¼ã¿ãæ°¸ç¶åãã
hubotãèµ·åããªããã¦ãã以åã®ãã¼ã¿ãä¿æãç¶ãããå ´åã¯ã以ä¸ã¿ããã«robot.brain.data以ä¸ã«ãã¼ã¿ãç»é²ãã¦ãrobot.brain.save()ããã¨ãã¼ã¿ãæ°¸ç¶åãããã
module.exports = (robot) -> robot.hear /hoge/, (msg) -> unless robot.brain.data.hoge robot.brain.data.hoge = '' robot.brain.data.hoge += "hogehoge" robot.brain.save msg.send robot.brain.data.hoge
試ãã¦ã¿ãã®ã以ä¸ã
$ ./bin/hubot Hubot> hoge hogehoge Hubot> hoge hogehogehogehoge Hubot> exit $ ./bin/hubot Hubot> hoge hogehogehogehogehogehoge
åèµ·åãã¦ããã¼ã¿ãæ¶ãã¦ããªããã¨ããããã
å®æçã«ãªã«ãåã£ã¦ãããããã«node-cronãå°å ¥ãã
hubotã ã¨ãä»ã®ã¨ããä½ããã®ã¦ã¼ã¶å´ã®çºè¨ãç¡ããã°ä½ãã¢ã¯ã·ã§ã³ãèµ·ããã¦ãããªãããããã«æã®æ¨æ¶ããããå®æçã«ä½ãã®URLãæµããããã¦æ¬²ããã£ãã®ã§node-cronãå°å ¥ããã
$ cd hubot $ npm install cron
ãã§ãå®æçã«ä½ããåãããä¾ã以ä¸ããããã¾ãhubot/scripts以ä¸ã«ç½®ãã
cron = require('cron').CronJob module.exports = (robot) -> # utility function send = (room, msg) -> (new robot.Response(robot, {user : {id : -1, name : room}, text : "none", done : false}, [])).send msg cron '0 0 11 * * *', () -> send "#all", "11æã§ããã¼"
ããã§ãããããå®æçã«æ¨æ¶ãã¦ãããããã«ãªã£ãã
æ¥æ¬èªç°å¢ã§hubotãIRCãããã¨ãã¦å©ç¨ããéã®æ³¨æ
node.jsèªä½ããUTF-8以å¤ã®æåã³ã¼ããæ±ãã®ããã¾ãå¾æãããªãããããISO-2022-JPã§IRCãã£ã³ãã«ãå©ç¨ãã¦ããã¨ããã§hubotãåããã¨æååã®æ±ãããããããªããã£ã¦ãããæ®éã«æååããããããã¯hubot-ircãUTF-8以å¤ã®æååãå ¨ãèæ ®ãã¦ããªããããªã®ã§ãã¨ããããã®è§£æ±ºçã¨ãã¦ISO-2022-JPã§åããããå ´åã¯tiarraãªã©ã®IRCããã¯ã·ãç«ã¦ã¦ãããçµç±ãããã®ãè³¢æãããããªãã
çµãã
ãã®è¨äºã§ã¯ãgithub社製ã®ããããã¬ã¼ã ã¯ã¼ã¯ã§ããhubotãIRCãããã¨ãã¦å°å ¥ããããã®æé ãªã©ãæ¸ãããIRCã¯éçºè éã®ã³ãã¥ãã±ã¼ã·ã§ã³ã®ã¤ã³ãã©ã¨ãã¦å©ç¨ã§ããããã®IRCããã便å©ã«æ±ãããã«IRCããããikachanãIRCBot Consoleãªã©ã®å¨è¾ºãã¼ã«ãå°å ¥ãããã¨ã¯ãéçºè éã®ã³ãã¥ãã±ã¼ã·ã§ã³ãããä¿é²ãã¦ããããã®ã¨æããããã¾ãã