package main import ( "log" "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() defer w.Unlock() log.Println(w.list[nick], "clear", nick) delete(w.list, nick) }() } log.Println(w.list[nick], "hit", nick) if w.list[nick] > w.n { kick <- nick } w.list[nick]++ }