2
2
#
3
3
# <thing>++ - give thing some karma
4
4
# <thing>-- - take away some of thing's karma
5
- # karma <thing> - check thing's karma, if <thing> is ommitted get top and bottom 3
5
+ # karma <thing> - check thing's karma (if <thing> is omitted, show the top 5)
6
+ # karma empty <thing> - empty a thing's karma
7
+ # karma best - show the top 5
8
+ # karma worst - show the bottom 5
6
9
class Karma
7
10
8
11
constructor : (@robot ) ->
@@ -19,7 +22,11 @@ class Karma
19
22
@robot .brain .on ' loaded' , =>
20
23
if @robot .brain .data .karma
21
24
@cache = @robot .brain .data .karma
22
-
25
+
26
+ kill : (thing ) ->
27
+ delete @cache [thing]
28
+ @robot .brain .data .karma = @cache
29
+
23
30
increment : (thing ) ->
24
31
@cache [thing] ?= 0
25
32
@cache [thing] += 1
@@ -40,16 +47,20 @@ class Karma
40
47
k = if @cache [thing] then @cache [thing] else 0
41
48
return k
42
49
43
- summary : ->
50
+ sort : ->
44
51
s = []
45
- for key,val of @cache
46
- s .push ({name : key, karma : val})
47
- s .sort (a,b) -> b .karma - a .karma
48
- if s .length >= 6
49
- return [s[0 ], s[1 ], s[2 ], s[s .length - 3 ], s[s .length - 2 ], s[s .length - 1 ]]
50
- else
51
- return s
52
-
52
+ for key, val of @cache
53
+ s .push ({ name : key, karma : val })
54
+ s .sort (a, b) -> b .karma - a .karma
55
+
56
+ top : (n = 5 ) ->
57
+ sorted = @ sort ()
58
+ sorted .slice (0 , n)
59
+
60
+ bottom : (n = 5 ) ->
61
+ sorted = @ sort ()
62
+ sorted .slice (- n).reverse ()
63
+
53
64
module .exports = (robot ) ->
54
65
karma = new Karma robot
55
66
robot .hear / (\S + [^ +\s ] )\+\+ (\s | $ )/ , (msg ) ->
@@ -62,18 +73,25 @@ module.exports = (robot) ->
62
73
karma .decrement subject
63
74
msg .send " #{ subject} #{ karma .decrementResponse ()} (Karma: #{ karma .get (subject)} )"
64
75
65
- robot .respond / karma ? (\S + [^ -\s ] )? $ / i , (msg ) ->
66
- if msg .match [1 ]
67
- match = msg .match [1 ].toLowerCase ()
76
+ robot .respond / karma empty ? (\S + [^ -\s ] )$ / i , (msg ) ->
77
+ subject = msg .match [1 ].toLowerCase ()
78
+ karma .kill subject
79
+ msg .send " #{ subject} has had its karma scattered to the winds."
80
+
81
+ robot .respond / karma( best)? $ / i , (msg ) ->
82
+ verbiage = [" The Best" ]
83
+ for item, rank in karma .top ()
84
+ verbiage .push " #{ rank + 1 } . #{ item .name } - #{ item .karma } "
85
+ msg .send verbiage .join (" \n " )
86
+
87
+ robot .respond / karma worst$ / i , (msg ) ->
88
+ verbiage = [" The Worst" ]
89
+ for item, rank in karma .bottom ()
90
+ verbiage .push " #{ rank + 1 } . #{ item .name } - #{ item .karma } "
91
+ msg .send verbiage .join (" \n " )
92
+
93
+ robot .respond / karma (\S + [^ -\s ] )$ / i , (msg ) ->
94
+ match = msg .match [1 ].toLowerCase ()
95
+ if match != " best" && match != " worst"
68
96
msg .send " \" #{ match} \" has #{ karma .get (match)} karma."
69
- else
70
- s = karma .summary ()
71
- if s .length >= 3
72
- msg .send " Highest karma: \" #{ s[0 ].name } \" (#{ s[0 ].karma } ), " +
73
- " \" #{ s[1 ].name } \" (#{ s[1 ].karma } ), and \" #{ s[2 ].name } \" " +
74
- " (#{ s[2 ].karma } ). Lowest karma: \" #{ s[s .length - 1 ].name } \" " +
75
- " (#{ s[s .length - 1 ].karma } ), \" #{ s[s .length - 2 ].name } \" " +
76
- " (#{ s[s .length - 2 ].karma } ), and \" #{ s[s .length - 3 ].name } \" " +
77
- " (#{ s[s .length - 3 ].karma } )."
78
- else
79
- msg .send " There aren't enough items with karma to give a top and bottom 3"
97
+
0 commit comments