Middle — Senior
Foydalanuvchidan 15 daqiqada 10 dan ortiq qo'ng'iroq bo'lsa, avtomatik rad etish logikasini qanday amalga oshirish mumkin?
sobes.tech AI
AIdan javob
Для реализации логики автоотклонения звонков при более чем 10 звонках за 15 минут от одного пользователя можно использовать скользящее окно времени и счетчик вызовов. Основная идея — хранить временные метки звонков пользователя и при новом звонке проверять, сколько звонков было за последние 15 минут.
Пример на Go:
package main
import (
"fmt"
"sync"
"time"
)
type CallTracker struct {
mu sync.Mutex
callsMap map[string][]time.Time // ключ — ID пользователя, значение — срез временных меток звонков
}
func NewCallTracker() *CallTracker {
return &CallTracker{
callsMap: make(map[string][]time.Time),
}
}
func (ct *CallTracker) RegisterCall(userID string) bool {
ct.mu.Lock()
defer ct.mu.Unlock()
now := time.Now()
windowStart := now.Add(-15 * time.Minute)
calls := ct.callsMap[userID]
// Оставляем только звонки в окне 15 минут
var recentCalls []time.Time
for _, t := range calls {
if t.After(windowStart) {
recentCalls = append(recentCalls, t)
}
}
if len(recentCalls) >= 10 {
// Автоотклонение
return false
}
// Добавляем текущий звонок
recentCalls = append(recentCalls, now)
ct.callsMap[userID] = recentCalls
return true
}
func main() {
tracker := NewCallTracker()
userID := "user123"
for i := 0; i < 12; i++ {
allowed := tracker.RegisterCall(userID)
if allowed {
fmt.Println("Звонок принят")
} else {
fmt.Println("Звонок отклонён")
}
time.Sleep(1 * time.Minute)
}
}
В этом примере RegisterCall возвращает true, если звонок можно принять, и false, если нужно отклонить. Такой подход позволяет эффективно контролировать количество звонков за заданный промежуток времени и реализовать автоотклонение.