Middle — Senior
Колдонуучудан 15 мүнөттүн ичинде 10дон ашык чалуу болсо, автоматтык четке кагуу логикасын кантип ишке ашыруу керек?
sobes.tech AI
AIден жооп
Для реализации логики автоотклонения звонков при более чем 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, если нужно отклонить. Такой подход позволяет эффективно контролировать количество звонков за заданный промежуток времени и реализовать автоотклонение.