SlackなどのチャットサービスをRSSリーダーにできるhubotスクリプトであるhubot-rss-readerにRSSを探す機能を付けた
v0.5.3になった。
えらい人のはてブとかを読み込んだチャンネルをSlackにいろいろ作って、それをみんなでウォッチしたりできる。
RSSを探す
RSSではない、ふつうのwebページのURLを追加しようとするとRSSを探すようになった。
nikezono君の
find-rssを使ったら簡単だった。
callbackを全部Promiseで書きなおした
ちゃんとテスト書いてあれば、mochaならcatchを自動的にやってくれるしcallbackからpromiseへの書き直しすんなりできると思う。hubot-rss-readerの他にも1つ全体を書きなおしたのがあるけど特にハマる所は無かった。
bluebirdを使った。
bluebirdはpromisifyAllにオブジェクトを渡すとそれが持っているメソッドを全部Promise化してくれるし、1つの関数だけ提供しているfind-rssなんかもpromisifyでPromise化して使える。
FindRSS = Promise.promisify require 'find-rss'
これが
robot.respond /rss\s+(add|register)\s+(https?:\/\/[^\s]+)/im, (msg) ->
url = msg.match[2].trim()
last_state_is_error[url] = false
debug "add #{url}"
checker.addFeed msg.message.room, url, (err, res) ->
if err
msg.send err
return
msg.send res
checker.fetch url, (err, entries) ->
unless err
for entry in entries
msg.send entry.toString()
return
msg.send err
if err.message is 'Not a feed'
checker.deleteFeed msg.message.room, url
RSSFinder url, (err, feeds) ->
return if err or feeds?.length < 1
msg.send _.flatten([
"found some Feeds from #{url}"
feeds.map (i) -> " * #{i.url}"
]).join '\n'
return
こう書けてすっきりした
robot.respond /rss\s+(add|register)\s+(https?:\/\/[^\s]+)/im, (msg) ->
url = msg.match[2].trim()
last_state_is_error[url] = false
debug "add #{url}"
checker.addFeed msg.message.room, url
.then (res) ->
new Promise (resolve) ->
msg.send res
resolve url
.then (url) ->
checker.fetch {url: url, room: msg.message.room}
.then (entries) ->
for entry in entries
msg.send entry.toString()
, (err) ->
msg.send "[ERROR] #{err}"
return if err.message isnt 'Not a feed'
checker.deleteFeed msg.message.room, url
.then ->
FindRSS url
.then (feeds) ->
return if feeds?.length < 1
msg.send _.flatten([
"found some Feeds from #{url}"
feeds.map (i) -> " * #{i.url}"
]).join '\n'
.catch (err) ->
msg.send "[ERROR] #{err}"
debug err.stack