Sobes.tech
Middle — Senior
27

Как реализовать логику автоотклонения звонков при более чем 10 звонках за 15 минут от пользователя?

Компании, где спрашивали
AvitoAvito

Ответ от нейросети

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