summaryrefslogtreecommitdiff
path: root/score.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-07-11 20:02:57 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-07-11 20:02:57 +0200
commit2700844318c370fda20bb39327620014d27dddf0 (patch)
treed662d99faf7fd3e38c928ef0c40544baa07b1763 /score.go
parentcd75246ecebd59ec661c79c9ee713313e2e62414 (diff)
Readd top10
Diffstat (limited to 'score.go')
-rw-r--r--score.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/score.go b/score.go
new file mode 100644
index 0000000..c449c9a
--- /dev/null
+++ b/score.go
@@ -0,0 +1,91 @@
+package main
+
+import (
+ "encoding/gob"
+ "fmt"
+ "log"
+ "os"
+ "sort"
+ "time"
+)
+
+const gobfile = `score.gob`
+
+var score map[string]int
+
+type Score struct {
+ Nick string
+ Count int
+}
+
+type Scores []Score
+
+func (s Scores) Len() int { return len(s) }
+func (s Scores) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
+func (s Scores) Less(i, j int) bool { return s[i].Count < s[j].Count }
+
+func NewScores() (s Scores) {
+ for k, v := range score {
+ s = append(s, Score{
+ Nick: k,
+ Count: v,
+ })
+ }
+ sort.Sort(sort.Reverse(s))
+ if len(s) > 10 {
+ s = s[:10]
+ }
+ return
+}
+
+func loadScore() map[string]int {
+ m := make(map[string]int)
+ fd, err := os.Open(gobfile)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer fd.Close()
+ decoder := gob.NewDecoder(fd)
+ if err := decoder.Decode(&m); err != nil {
+ log.Fatal(err)
+ }
+ return m
+}
+
+func saveScore(m map[string]int) {
+ fd, err := os.Create(gobfile)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer fd.Close()
+ encoder := gob.NewEncoder(fd)
+ if err := encoder.Encode(m); err != nil {
+ log.Fatal(err)
+ }
+}
+
+func (s Score) String() string {
+ return fmt.Sprintf("%v (%v)", s.Nick, s.Count)
+}
+
+func (s Scores) String() (ret string) {
+ for n, sc := range s {
+ ret += fmt.Sprintf("%3d. %v", n+1, sc)
+ }
+ return
+}
+
+func init() {
+ score = loadScore()
+}
+
+func Count(nick string) {
+ score[nick]++
+}
+
+func autoSave() {
+ for {
+ saveScore(score)
+ time.Sleep(time.Minute)
+ }
+}