hubot-cage
Version:
Recite stories from Cage's 'Indeterminacy'.
70 lines (61 loc) • 1.86 kB
text/coffeescript
select = require('soupselect').select
htmlparser = require('htmlparser')
http = require('http')
sys = require('sys')
Entities = require('html-entities').XmlEntities;
Iconv = require('iconv').Iconv
nodeToText = (node) ->
if node.type is 'tag'
return (nodeToText(child) for child in node.children).join(' ') if node.children
else if node.type is 'text'
return node.raw
return ''
cageMe = (n, callback) ->
path = "/indeterminacy/s/#{n}"
host = 'www.lcdf.org'
options =
host: host,
port: 80,
path: path,
method: 'GET'
request = http.request options, (response) =>
response.setEncoding 'utf-8'
body = ''
response.on 'data', (chunk) =>
body = body + chunk
response.on 'end', =>
body = body.replace(/ /g, " ")
parser = new htmlparser.Parser(new htmlparser.DefaultHandler((err, dom) =>
if not err
paras = select dom, 'p'
left_paras = paras.filter (p) ->
return false if not p.attribs
return p.attribs.align is 'left'
text = (nodeToText(child) for child in left_paras[1].children).join('')
entities = new Entities();
iconv = new Iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE')
text = iconv.convert(entities.decode(text)).toString()
callback text))
parser.parseComplete body
request.end()
memoized = {}
module.exports = (robot) ->
robot.respond /CAGE\s+ME(\s+(\d+))?$/i, (msg) ->
number = (msg.match[2] or Math.floor(180 * Math.random())) % 180 + 1
if memoized[number]
msg.send memoized[number]
else
cageMe number, (text) =>
memoized[number] = text
msg.send text