0

hubotに付いているcoffeeが古くてPromiseが動かない

起こった問題


hubotにごはんを選んでもらうをPromiseで書きなおして、Herokuで動かしているhubotの中で使ったら

[TypeError: Object http://ja.wikipedia.org/wiki/Category:料理 has no method ‘then’]


というエラーがでてNodeプロセスが死んで困っていた。ローカルでは動いている。

hubot-gohan/gohan.coffee at be90c1c25219c66295b1c1a10be507c9731cbfaf · shokai/hubot-gohan

  getGohan: ->
debug 'getting Gohan..'
@getPagesCached "#{@baseUrl}/wiki/Category:料理" ## ここでエラー
.then (pages) =>
return new Promise (resolve) =>
categories = _.filter pages, (page) -> /^\/wiki\/Category:/.test page.link
category = _.sample categories
resolve category
.then (category) =>
@getPagesCached "#{@baseUrl}#{category.link}"
.then (pages) =>
return new Promise (resolve) =>
pages = _.filter pages, (page) ->
!(/^\/wiki\/Category:/.test page.link) and
/^\/wiki\/.+/.test(page.link) and
page.title?
debug "got #{pages.length} pages"
gohan = _.sample pages
resolve {url: "#{@baseUrl}#{gohan.link}", title: gohan.title}


解決方法

hubot –createでhubotのテンプレを作ると付属しているcoffee-script npmが1.6.3なので動かない。

新しいcoffee (1.8.x)を入れるとちゃんとPromiseが動くようになる。
% hubot --create my-hubot
% cd my-hubot/
% npm install coffee-script -save

0

Jawbone Up24の(enter|exit)_sleep_modeイベントが復活した

Up24のボタン長押しでsleepモードと通常モードを切り替えた時に送られてくるexit_sleep_modeとenter_sleep_modeイベントが復活した。

6月ごろからイベントがwebhookでpushされて来なくなってたんだけど、昨日になって復活してるのに気づいた。

俺APIからのイベントをhubotで受けとってこういう風に通知がだせる。起きたらhue電球つけるとか寝たら消すとかも簡単にできると思う。




config =
url: 'https://ore-api.herokuapp.com'
slack:
room: "#ore"

module.exports = (robot) ->

socket = require('socket.io-client').connect config.url

socket.on 'exit_sleep_mode', (event) ->
robot.send config.slack, "@#{event.screen_name} が眠りから覚めました"


socket.on 'enter_sleep_mode', (event) ->
robot.send config.slack, "@#{event.screen_name} が眠りにつきました"

0

Jawbone Up24の運動ログをHubot経由でSlackに流す

前:Web+DB Press vol.82にJawbone Up24について書いた

先月末に発売されたWeb+DB Press vol.82で、コードが長すぎてページが足りなくて入りきらなかったネタ


研究室でにわかにjawbone up24が流行り始めていて、slackの#newsというチャットルームに「起きた(5時間寝た、3回二度寝した)」とかログが流れてくる。

そこに「何歩歩いた」あるいは「活発に活動中」というログも流すようにした。


これは記事の中に書いた俺APIというJawbone APIのプロキシを使ってる。Bluetooth LEで自動同期できるup24がちょっと歩く毎にガンガンwebhookでpushしてくるのを俺APIが受信して、さらにそこからsocket.ioでhubotに再配信してくれる。
JawboneのAPIはOAuth2で認証しないと使えないんだけど、もっと細かくてどうでもいい事に気軽に使いたかったのでAPIプロキシを立てた。あと俺が起きてるか寝てるかなんて認証かける必要なく公開されてていいと思った。ので作った。


hubot-ore-api.coffee

ちょっと長いけど、こういうhubot scriptを書いておけばチャットに運動の通知が流せる。(実際使ってるやつから抜粋してきた)
歩いた時は〜〜歩歩いたってslackに流れるし、歩かずにデスクワークしている時もpush来るので「活発に活動中」とかslackに通知するようにしている。

俺APIでoauth2認証しておけば色々なところからjawboneのイベントが使えるようになるので便利だと思う。

hubot-ore-api.coffee
debug = require('debug')('hubot-ore-api')

config =
url: 'https://ore-api.herokuapp.com'
slack:
room: "#news"

module.exports = (robot) ->

socket = require('socket.io-client').connect config.url

## jawboneから動いたイベントがpushされてくる
socket.on 'move', (event) ->
debug "move - #{JSON.stringify event}"
if event.action is 'updation'
notify_move event

last_notify_at = {}
## 動いた事を通知する
notify_move = (event) ->
if Date.now() - (last_notify_at[event.screen_name] or 0) < 1000*60*60 # 1時間毎に間引く
debug "throttled #{event.screen_name}'s notify_move"
return
last_notify_at[event.screen_name] = Date.now()
get_activity "moves", event.screen_name, event.event_xid, (err, move) ->
if err or move.details?.steps < 1
debug 'no steps data in event'
return
current_steps = move.details.steps
last_steps = robot.brain.get("steps_#{event.screen_name}") or 0
robot.brain.set("steps_#{event.screen_name}", current_steps)
if last_steps > current_steps
last_steps = 0
new_steps = current_steps - last_steps
if new_steps > 0
txt = "@#{event.screen_name} が#{new_steps}歩運動しました (本日合計#{current_steps}歩 #{move.details.km}km)"
else
txt = "@#{event.screen_name} が活発に活動しています"
robot.send config.slack, txt

## ore-api.herokuappにあるJawbone APIプロキシを使う
get_activity = (type, screen_name, xid, callback = ->) ->
robot.http("#{config.url}/#{screen_name}/#{type}.json?xid=#{xid}").get() (err, res, body) ->
if err
callback err
return
try
data = JSON.parse body
catch err
callback err
return
debug data
callback null, data.data
return

0

hubot-sfc-busに湘南台19系統を追加した

綾瀬車庫〜慶応大学〜湘南台駅という路線が増えたので、追加した。


土曜13時台、本館前発は0分/20分/41分しかないが、慶応大学発(郵便局横のバス停)は13分がある。これが新しく増えた19系統

  • 綾瀬車庫発なので、本館前は通らない
  • 湘南台駅西口からは4番乗り場から出る


あと、わりと賢くオプションを解釈するようになった。

インストール方法:hubotでSFCのバス時刻表を見る

0

hubotにごはんを選んでもらう

推薦ではなく、思いもよらない料理を見る事で発想を豊かにしたかったのでhubot scriptを作った。

https://www.npmjs.org/package/hubot-gohan

npmでインストールして、「hubot ごはん」で実行する。


wikipediaのCategory:料理から2つ下までたどると、色々な料理が見つかる。その中からランダムに返すようになっている。

wikipediaなので作り方とか素材・調味料などのリンクも辿っていけて面白い。
普通に暮らしてると知らないようなアフリカの炊き込みご飯とか、ギリシャの焼き鳥みたいなのとか出てくる。

たまに調理器具とか調理学校を食えとか言われるけどそれはそれで面白いのでいいと思う

あとまあ、チャットで使えるので、食生活豊かな都内の会社の人とかは今日の晩飯どうするとかこれで決めればいいのではないか