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