From fc1b0999a35bba9760d9d58395fb04581784c160 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 25 Dec 2016 16:45:15 +0100 Subject: watchlist --- main.go | 3 +++ rate.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/main.go b/main.go index e2fd650..c884fe5 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "strings" + "time" irc "github.com/fluffle/goirc/client" ) @@ -40,6 +41,7 @@ func kicker(conn *irc.Conn, channel string) chan string { func privmsg(note, kick chan string) irc.HandlerFunc { last := NewLast(10) links := linker(note) + wl := NewWatchList(3, 5*time.Second) return func(conn *irc.Conn, line *irc.Line) { switch t := line.Text(); { case isFlood(t): @@ -59,6 +61,7 @@ func privmsg(note, kick chan string) irc.HandlerFunc { default: links <- t last.Push(line.Time, line.Nick, t) + wl.Add(kick, line.Nick) } } } diff --git a/rate.go b/rate.go index c4c9668..a4b630e 100644 --- a/rate.go +++ b/rate.go @@ -1,3 +1,37 @@ package main +import ( + "sync" + "time" +) + // TODO rate limiting + +type WatchList struct { + sync.Mutex + n int + d time.Duration + list map[string]int +} + +func NewWatchList(n int, d time.Duration) WatchList { + return WatchList{n: n, d: d, list: make(map[string]int)} +} + +func (w WatchList) Add(kick chan string, nick string) { + w.Lock() + defer w.Unlock() + if _, ok := w.list[nick]; !ok { + go func() { + <-time.After(w.d) + w.Lock() + delete(w.list, nick) + w.Unlock() + }() + } + w.list[nick]++ + if w.list[nick] > w.n { + kick <- nick + } + return +} -- cgit v1.2.3