summaryrefslogtreecommitdiff
path: root/top/main.go
blob: 6632b8eaef4510d9bdb60e3a75656106dda207c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package main

import (
	"bufio"
	"encoding/gob"
	"fmt"
	"log"
	"os"
	"regexp"
	"sort"
)

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)
}