summaryrefslogtreecommitdiff
path: root/floodstop.go
diff options
context:
space:
mode:
Diffstat (limited to 'floodstop.go')
-rw-r--r--floodstop.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/floodstop.go b/floodstop.go
new file mode 100644
index 0000000..ad4af0f
--- /dev/null
+++ b/floodstop.go
@@ -0,0 +1,47 @@
+package main
+
+import (
+ "time"
+)
+
+type Floodstop struct {
+ ask chan chan bool
+ stop chan struct{}
+}
+
+func NewFloodstop(reset time.Duration, countMax int) (fs *Floodstop) {
+ fs = &Floodstop{
+ ask: make(chan chan bool),
+ stop: make(chan struct{}),
+ }
+
+ ticker := time.NewTicker(reset)
+ counter := 0
+
+ go func() {
+ defer ticker.Stop()
+ for {
+ select {
+ case <-fs.stop:
+ return
+ case retCh := <-fs.ask:
+ counter++
+ retCh <- (counter < countMax)
+ case <-ticker.C:
+ counter = 0
+ }
+ }
+ }()
+
+ return
+}
+
+func (fs *Floodstop) Stop() {
+ fs.stop <- struct{}{}
+}
+
+func (fs *Floodstop) Ask() bool {
+ ch := make(chan bool)
+ fs.ask <- ch
+ return <-ch
+}