@@ -7,16 +7,29 @@ package main
77import (
88 "encoding/json"
99 "fmt"
10+ "sort"
1011 "strings"
1112
1213 "github.com/danryan/hal"
1314)
1415
16+ // DevKarma contains fields for user karma information.
1517type DevKarma struct {
1618 Name string `json:"name"`
1719 Karma int `json:"karma"`
1820}
1921
22+ func (d DevKarma ) String () string {
23+ return fmt .Sprintf ("%s: %d\n " , d .Name , d .Karma )
24+ }
25+
26+ // ByKarma implements sort.Interface for []DevKarma based on the Karma field.
27+ type ByKarma []DevKarma
28+
29+ func (a ByKarma ) Len () int { return len (a ) }
30+ func (a ByKarma ) Swap (i , j int ) { a [i ], a [j ] = a [j ], a [i ] }
31+ func (a ByKarma ) Less (i , j int ) bool { return a [i ].Karma < a [j ].Karma }
32+
2033var karmaHandler = hear (`(.+)(\+\+|\-\-)` , "(nickname)++ or (nickname)--" , "Increases or Decreases a persons karma" , func (res * hal.Response ) error {
2134 nick := res .Match [1 ]
2235 sign := res .Match [2 ]
@@ -49,6 +62,8 @@ var karmaHandler = hear(`(.+)(\+\+|\-\-)`, "(nickname)++ or (nickname)--", "Incr
4962 return err
5063 }
5164
65+ updateDevsWithKarma (key , res )
66+
5267 err = res .Send (fmt .Sprintf ("Karma for %s has been updated" , nick ))
5368 return err
5469})
@@ -78,3 +93,81 @@ var karmaStatsHandler = hear(`karma stats(.*)`, "karma stats (username)", "Shows
7893 err = res .Send (fmt .Sprintf ("User %s currently has %d karma" , nick , dev .Karma ))
7994 return err
8095})
96+
97+ var karmaRankingHandler = hear (`karma ranking(\s(top|lowest)\s\d*)?` , "karma ranking" , "Shows the current karma standings, with optional top/lowest standings" , func (res * hal.Response ) error {
98+ var devs []DevKarma
99+ names := getDevKarmaList (res )
100+ hal .Logger .Debugf ("Value of names: %#v" , names )
101+
102+ for _ , v := range names {
103+ var dev DevKarma
104+ val , err := res .Robot .Store .Get ("Karma::" + v )
105+ if err != nil {
106+ hal .Logger .Errorf ("couldn't fetch karma details: %v" , err )
107+ err = res .Reply ("Sorry, I couldn't fetch karma ratings" )
108+ return err
109+ }
110+ json .Unmarshal (val , & dev )
111+
112+ devs = append (devs , dev )
113+ }
114+ hal .Logger .Debugf ("Value of devs: %#v" , devs )
115+
116+ if len (devs ) == 0 {
117+ }
118+
119+ sort .Sort (sort .Reverse (ByKarma (devs )))
120+ hal .Logger .Debugf ("Sorted devs list: %#v" , devs )
121+
122+ ranking := []string {
123+ "Current rankings:\n " ,
124+ }
125+
126+ for _ , val := range devs {
127+ ranking = append (ranking , val .String ())
128+ }
129+
130+ var msg string
131+ for _ , m := range ranking {
132+ msg = msg + m
133+ }
134+ msg , err := sprungeSend (msg )
135+ if err != nil {
136+ hal .Logger .Error (err )
137+ err = res .Reply ("Sorry, I had some unexpected difficulties posting the rankings" )
138+ return err
139+ }
140+
141+ err = res .Reply (fmt .Sprintf ("The current rankings can be found here %s" , msg ))
142+ return err
143+ })
144+
145+ func updateDevsWithKarma (name string , r * hal.Response ) {
146+ names := getDevKarmaList (r )
147+ if ! inSlice (names , name ) {
148+ if len (names ) == 0 || names [0 ] == "" {
149+ names [0 ] = name
150+ } else {
151+ names = append (names , name )
152+ }
153+ }
154+ list := strings .Join (names , "," )
155+ r .Robot .Store .Set ("KarmaList" , []byte (list ))
156+ }
157+
158+ func getDevKarmaList (r * hal.Response ) []string {
159+ val , _ := r .Robot .Store .Get ("KarmaList" )
160+ list := string (val )
161+ names := strings .Split (list , "," )
162+
163+ return names
164+ }
165+
166+ func inSlice (n []string , name string ) bool {
167+ for _ , val := range n {
168+ if val == name {
169+ return true
170+ }
171+ }
172+ return false
173+ }
0 commit comments