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