Sobes.tech
Middle — Senior

Come implementare la logica di rifiuto automatico delle chiamate quando ci sono più di 10 chiamate in 15 minuti da parte di un utente?

sobes.tech AI

Risposta dell'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, если нужно отклонить. Такой подход позволяет эффективно контролировать количество звонков за заданный промежуток времени и реализовать автоотклонение.