package main import ( "log" "math" "sort" "strings" "unicode/utf8" irc "github.com/fluffle/goirc/client" ) func Entropy(s string) (e float64) { n := make(map[rune]float64) for _, r := range s { n[r] += 1 / float64(len(s)) } for _, v := range n { e -= v * math.Log2(v) } return } func Flood(s string) bool { if utf8.RuneCountInString(s) <= 6 { return false } if v := strings.Fields(s); len(v) >= 6 { return CommonWord(v) >= len(v)/2 } return Entropy(s) <= 1 } 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 DetectFlood(conn *irc.Conn, line *irc.Line) { if Flood(line.Text()) { log.Println("flood", line.Nick) conn.Kick(*room, line.Nick, "flood") } }