Created
August 16, 2016 20:20
-
-
Save johnny5th/5f6d0a2873773d95f68104ba71bbbf5f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ cat scripts/karma.coffee | |
# 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) -> | |
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." |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment