From ef5ab7daa6a5df7794ed0b19a2092009e4adbaf8 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 15 Aug 2015 14:56:21 +0200 Subject: Add common word count --- flood.go | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'flood.go') diff --git a/flood.go b/flood.go index 59949e7..9ba541e 100644 --- a/flood.go +++ b/flood.go @@ -8,10 +8,34 @@ import ( irc "github.com/fluffle/goirc/client" ) -func MedianLength(v []string) int { - if len(v) == 0 { - return 0 +func Flood(s string) bool { + if s == "" { + return false + } + v := strings.Fields(s) + if CommonWord(v) >= len(v)/2 { + return true + } + if len(v) >= 10 && MedianLength(v) == 1 { + return true + } + 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) @@ -21,10 +45,8 @@ func MedianLength(v []string) int { } func DetectFlood(conn *irc.Conn, line *irc.Line) { - if f := strings.Fields(line.Text()); len(f) > 8 { - if m := MedianLength(f); m < 2 { - log.Println("flood", line.Nick) - conn.Kick(*room, line.Nick, "flood") - } + if Flood(line.Text()) { + log.Println("flood", line.Nick) + conn.Kick(*room, line.Nick, "flood") } } -- cgit v1.2.3