Sobes.tech
Middle — Senior

Ako implementovať logiku automatického odmietnutia hovorov pri viac ako 10 hovoroch za 15 minút od používateľa?

sobes.tech AI

Odpoveď od AI

Na implementáciu logiky automatického odmietnutia hovorov, keď je viac ako 10 hovorov za 15 minút od jedného používateľa, možno použiť pohyblivé časové okno a čítač hovorov. Hlavná myšlienka je uložiť časové značky hovorov používateľa a pri novom hovore skontrolovať, koľko hovorov bolo za posledných 15 minút.

Príklad v Go:

package main

import (
    "fmt"
    "sync"
    "time"
)

type CallTracker struct {
    mu       sync.Mutex
    callsMap map[string][]time.Time // kľúč — ID používateľa, hodnota — reťazec časových značiek hovorov
}

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]
    // Uchovávať iba hovory v okne 15 minút
    var recentCalls []time.Time
    for _, t := range calls {
        if t.After(windowStart) {
            recentCalls = append(recentCalls, t)
        }
    }

    if len(recentCalls) >= 10 {
        // Automatické odmietnutie
        return false
    }

    // Pridať aktuálny hovor
    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("Hovor prijatý")
        } else {
            fmt.Println("Hovor odmietnutý")
        }
        time.Sleep(1 * time.Minute)
    }
}