hubot-bingo
Version:
A hubot script that plays Buzzword bingo
45 lines (33 loc) • 1.39 kB
text/coffeescript
_ = require('lodash')
util = require('util')
rules = require('./bullshit')
Bingo = require('./bingo')
class HubotBingoAdapter
constructor: (@robot) ->
@userBingos = {}
@robot.hear(/.*/i, @handleMessage)
@robot.respond(/scores/i, @showScores)
getUsername: (userId) ->
@robot.brain.userForId(userId).name
toUserScores: (bingo, user) =>
_.extend(bingo.getScores(), name: @getUsername(user))
getUserScores: ->
scores = _.map(@userBingos, @toUserScores)
_.sortBy(scores, _.method('totalScores'))
formatUserScores: (scores) ->
currentMatches = scores.currentMatches()
currentScores = if not _.isEmpty(currentMatches) then "| currently: [#{currentMatches.join(', ')}]" else ''
"#{scores.name}: #{scores.wins} bingos #{currentScores}"
showScores: (res) =>
scores = @getUserScores()
res.send("Scores:\n #{scores.map(@formatUserScores).join('\n')}")
formatReply: (buzzwords, name) ->
"#{name.toUpperCase()} BINGO! (#{buzzwords.join(', ')})"
handleMessage: (res) =>
user = res.message.user
bingo = @userBingos[user.id] = @userBingos[user.id] or new Bingo(rules)
wonBingos = bingo.play(res.message.text)
if not _.isEmpty(wonBingos)
bingoMessages = _.map(wonBingos, @formatReply)
res.send("@#{user.name}: #{bingoMessages.join('\n')}")
module.exports = (robot) -> new HubotBingoAdapter(robot)