summaryrefslogtreecommitdiff
path: root/top/main.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 /top/main.go
parentcd75246ecebd59ec661c79c9ee713313e2e62414 (diff)
Readd top10
Diffstat (limited to 'top/main.go')
-rw-r--r--top/main.go79
1 files changed, 79 insertions, 0 deletions
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)
+}