mirror of
https://github.com/HugeFrog24/go-telegram-bot.git
synced 2026-03-02 08:24:34 +00:00
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"time"
|
|
|
|
"golang.org/x/time/rate"
|
|
)
|
|
|
|
type userLimiter struct {
|
|
hourlyLimiter *rate.Limiter
|
|
dailyLimiter *rate.Limiter
|
|
lastReset time.Time
|
|
banUntil time.Time
|
|
}
|
|
|
|
func (b *Bot) checkRateLimits(userID int64) bool {
|
|
b.userLimitersMu.Lock()
|
|
defer b.userLimitersMu.Unlock()
|
|
|
|
limiter, exists := b.userLimiters[userID]
|
|
if !exists {
|
|
limiter = &userLimiter{
|
|
hourlyLimiter: rate.NewLimiter(rate.Every(time.Hour/time.Duration(b.config.MessagePerHour)), b.config.MessagePerHour),
|
|
dailyLimiter: rate.NewLimiter(rate.Every(24*time.Hour/time.Duration(b.config.MessagePerDay)), b.config.MessagePerDay),
|
|
lastReset: time.Now(),
|
|
}
|
|
b.userLimiters[userID] = limiter
|
|
}
|
|
|
|
now := time.Now()
|
|
|
|
if now.Before(limiter.banUntil) {
|
|
return false
|
|
}
|
|
|
|
if now.Sub(limiter.lastReset) >= 24*time.Hour {
|
|
limiter.dailyLimiter = rate.NewLimiter(rate.Every(24*time.Hour/time.Duration(b.config.MessagePerDay)), b.config.MessagePerDay)
|
|
limiter.lastReset = now
|
|
}
|
|
|
|
if !limiter.hourlyLimiter.Allow() || !limiter.dailyLimiter.Allow() {
|
|
banDuration, _ := time.ParseDuration(b.config.TempBanDuration)
|
|
limiter.banUntil = now.Add(banDuration)
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|