From a0c782f83d7349cb5abda92647545e9a78b41502 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 6 Jul 2019 20:06:11 +0200 Subject: autoban --- internal/flood/flood.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'internal/flood') diff --git a/internal/flood/flood.go b/internal/flood/flood.go index fce81ae..c737e8f 100644 --- a/internal/flood/flood.go +++ b/internal/flood/flood.go @@ -5,6 +5,8 @@ import ( "sort" "strings" "unicode/utf8" + + lru "github.com/hashicorp/golang-lru" ) const ( @@ -15,18 +17,42 @@ const ( type Kicker interface { Kick(nick string, message ...string) + Ban(nick string) } type Check struct { - k Kicker + k Kicker + cache *lru.Cache } func New(k Kicker) *Check { - return &Check{k: k} + cache, _ := lru.New(100) + return &Check{k: k, cache: cache} +} + +func (c Check) get(nick string) (int, bool) { + if n, ok := c.cache.Get(nick); ok { + return n.(int), true + } + return 0, false +} + +func (c Check) del(nick string) { + c.cache.Remove(nick) +} + +func (c Check) set(nick string, n int) { + c.cache.Add(nick, n) } func (c Check) Check(text, nick string) { if isFlood(text) { + count, _ := c.get(nick) + c.set(nick, count+1) + if count >= 3 { + c.k.Ban(nick) + c.del(nick) + } c.k.Kick(nick) } } -- cgit v1.2.3