From 2700844318c370fda20bb39327620014d27dddf0 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 11 Jul 2015 20:02:57 +0200 Subject: Readd top10 --- score.go | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 score.go (limited to 'score.go') 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) + } +} -- cgit v1.2.3