From 2700844318c370fda20bb39327620014d27dddf0 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 11 Jul 2015 20:02:57 +0200 Subject: Readd top10 --- top/main.go | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 top/main.go (limited to 'top/main.go') diff --git a/top/main.go b/top/main.go new file mode 100644 index 0000000..e5b0737 --- /dev/null +++ b/top/main.go @@ -0,0 +1,79 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "regexp" + "sort" + "encoding/gob" +) + +const ( + logfile = `/home/demon/irclogs/RusNet/#lor.log` + gobfile = `score.gob` +) + +var ( + re = regexp.MustCompile(`[^ ]+ <.([^ ]+)> .*`) + score = make(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 newScore(m map[string]int) (s Scores) { + for k, v := range m { + s = append(s, Score{ + Nick: k, + Count: v, + }) + } + sort.Sort(sort.Reverse(s)) + if len(s) > 10 { + s = s[:10] + } + return +} + +func main() { + fd, err := os.Open(logfile) + if err != nil { + log.Fatal(err) + } + defer fd.Close() + + scanner := bufio.NewScanner(fd) + for scanner.Scan() { + m := re.FindAllStringSubmatch(scanner.Text(), -1) + if m != nil { + user := m[0][1] + score[user]++ + } + } + if err := scanner.Err(); err != nil { + log.Fatal(err) + } + + for n, s := range newScore(score) { + fmt.Printf("%2d %v (%v)\n", n+1, s.Nick, s.Count) + } + + gd, err := os.Create(gobfile) + if err != nil { + log.Fatal(err) + } + defer gd.Close() + + g := gob.NewEncoder(gd) + g.Encode(score) +} -- cgit v1.2.3