package main import ( "log" "sort" "strings" irc "github.com/fluffle/goirc/client" ) func Flood(s string) bool { if s == "" { return false } v := strings.Fields(s) if len(v) >= 4 { return CommonWord(v) >= len(v)/2 || MedianLength(v) == 1 } return false } func CommonWord(v []string) int { m := make(map[string]int) for _, w := range v { m[w]++ } l := make([]int, len(m)) for _, n := range m { l = append(l, n) } sort.Sort(sort.Reverse(sort.IntSlice(l))) return l[0] } func MedianLength(v []string) int { l := make([]int, len(v)) for i, s := range v { l[i] = len(s) } sort.Sort(sort.IntSlice(l)) return l[len(l)/2] } func DetectFlood(conn *irc.Conn, line *irc.Line) { if Flood(line.Text()) { log.Println("flood", line.Nick) conn.Kick(*room, line.Nick, "flood") } }