Skip to content
This repository was archived by the owner on Sep 4, 2019. It is now read-only.

Commit 4f521ae

Browse files
committed
Add initial support for karma ranking
Add initial support for karma rankings, posting to sprunge.us as a pastebin service. Signed-off-by: Adam Jimerson <[email protected]>
1 parent ea3d58e commit 4f521ae

File tree

3 files changed

+122
-2
lines changed

3 files changed

+122
-2
lines changed

karma.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,29 @@ package main
77
import (
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.
1517
type 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+
2033
var 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+
}

main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ var selfHandler = hear(`who are you`, "self", "", func(res *hal.Response) error
4242
})
4343

4444
var quitHandler = hear(`(.*)+/quit(.*)+`, "quit", "", func(res *hal.Response) error {
45-
name := res.UserName()
46-
return res.Send(fmt.Sprintf("No! Bad %s!", name))
45+
return res.Send(fmt.Sprintf("No! Bad %s!", res.UserName()))
4746
})
4847

4948
var helpHandler = hear(`help`, "help", "Displays this message", func(res *hal.Response) error {
@@ -127,6 +126,7 @@ func run() int {
127126
devlunchRSVPHandler,
128127
karmaHandler,
129128
karmaStatsHandler,
129+
karmaRankingHandler,
130130
)
131131

132132
if err := robot.Run(); err != nil {

sprunge.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"net/http"
7+
"net/url"
8+
)
9+
10+
func sprungeSend(t string) (string, error) {
11+
resp, err := http.PostForm("http://sprunge.us",
12+
url.Values{"sprunge": {t}})
13+
if err != nil {
14+
return "", fmt.Errorf("unable to POST to sprunge.us server: %v", err)
15+
}
16+
defer resp.Body.Close()
17+
18+
if resp.StatusCode != 200 {
19+
return "", fmt.Errorf("response from the server: %s", resp.Status)
20+
}
21+
body, err := ioutil.ReadAll(resp.Body)
22+
if err != nil {
23+
return "", fmt.Errorf("unable to parse response from the server: %v", err)
24+
}
25+
26+
return string(body), nil
27+
}

0 commit comments

Comments
 (0)