Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

129 lines (105 sloc) 3.941 kb
# Description:
# Track arbitrary karma
#
# Dependencies:
# None
#
# Configuration:
# KARMA_ALLOW_SELF
#
# Commands:
# <thing>++ - give thing some karma
# <thing>-- - take away some of thing's karma
# hubot karma <thing> - check thing's karma (if <thing> is omitted, show the top 5)
# hubot karma empty <thing> - empty a thing's karma
# hubot karma best - show the top 5
# hubot karma worst - show the bottom 5
#
# Author:
# stuartf
class Karma
constructor: (@robot) ->
@cache = {}
@increment_responses = [
"+1!", "gained a level!", "is on the rise!", "leveled up!"
]
@decrement_responses = [
"took a hit! Ouch.", "took a dive.", "lost a life.", "lost a level."
]
@robot.brain.on 'loaded', =>
if @robot.brain.data.karma
@cache = @robot.brain.data.karma
kill: (thing) ->
delete @cache[thing]
@robot.brain.data.karma = @cache
increment: (thing) ->
@cache[thing] ?= 0
@cache[thing] += 1
@robot.brain.data.karma = @cache
decrement: (thing) ->
@cache[thing] ?= 0
@cache[thing] -= 1
@robot.brain.data.karma = @cache
incrementResponse: ->
@increment_responses[Math.floor(Math.random() * @increment_responses.length)]
decrementResponse: ->
@decrement_responses[Math.floor(Math.random() * @decrement_responses.length)]
selfDeniedResponses: (name) ->
@self_denied_responses = [
"Hey everyone! #{name} is a narcissist!",
"I might just allow that next time, but no.",
"I can't do that #{name}."
]
get: (thing) ->
k = if @cache[thing] then @cache[thing] else 0
return k
sort: ->
s = []
for key, val of @cache
s.push({ name: key, karma: val })
s.sort (a, b) -> b.karma - a.karma
top: (n = 5) ->
sorted = @sort()
sorted.slice(0, n)
bottom: (n = 5) ->
sorted = @sort()
sorted.slice(-n).reverse()
module.exports = (robot) ->
robot.logger.warning "karma.coffee has merged with plusplus.coffee and moved from hubot-scripts to its own package. Remove it from your hubot-scripts.json and see https://github.com/ajacksified/hubot-plusplus for upgrade instructions"
karma = new Karma robot
allow_self = process.env.KARMA_ALLOW_SELF or "true"
robot.hear /(\S+[^+:\s])[: ]*\+\+(\s|$)/, (msg) ->
subject = msg.match[1].toLowerCase()
if allow_self is true or msg.message.user.name.toLowerCase() != subject
karma.increment subject
msg.send "#{subject} #{karma.incrementResponse()} (Karma: #{karma.get(subject)})"
else
msg.send msg.random karma.selfDeniedResponses(msg.message.user.name)
robot.hear /(\S+[^-:\s])[: ]*--(\s|$)/, (msg) ->
subject = msg.match[1].toLowerCase()
if allow_self is true or msg.message.user.name.toLowerCase() != subject
karma.decrement subject
msg.send "#{subject} #{karma.decrementResponse()} (Karma: #{karma.get(subject)})"
else
msg.send msg.random karma.selfDeniedResponses(msg.message.user.name)
robot.respond /karma empty ?(\S+[^-\s])$/i, (msg) ->
subject = msg.match[1].toLowerCase()
if allow_self is true or msg.message.user.name.toLowerCase() != subject
karma.kill subject
msg.send "#{subject} has had its karma scattered to the winds."
else
msg.send msg.random karma.selfDeniedResponses(msg.message.user.name)
robot.respond /karma( best)?$/i, (msg) ->
verbiage = ["The Best"]
for item, rank in karma.top()
verbiage.push "#{rank + 1}. #{item.name} - #{item.karma}"
msg.send verbiage.join("\n")
robot.respond /karma worst$/i, (msg) ->
verbiage = ["The Worst"]
for item, rank in karma.bottom()
verbiage.push "#{rank + 1}. #{item.name} - #{item.karma}"
msg.send verbiage.join("\n")
robot.respond /karma (\S+[^-\s])$/i, (msg) ->
match = msg.match[1].toLowerCase()
if match != "best" && match != "worst"
msg.send "\"#{match}\" has #{karma.get(match)} karma."
Jump to Line
Something went wrong with that request. Please try again.