Middle — Senior
Kā īstenot automātiskās zvanu noraidīšanas loģiku, ja lietotājs saņem vairāk nekā 10 zvanus 15 minūšu laikā?
sobes.tech AI
Atbilde no AI
Automātiskas zvanu noraidīšanas loģikas īstenošana var tikt veikta, izmantojot slidenu logu un zvanu skaitītāju, ja viens lietotājs vairāk nekā 10 reizes ir zvanījis pēdējās 15 minūtēs. Galvenā ideja ir saglabāt lietotāja zvanu laika zīmes un pārbaudīt, cik zvanu bija pēdējās 15 minūtēs.
Piemērs Go valodā:
package main
import (
"fmt"
"sync"
"time"
)
type CallTracker struct {
mu sync.Mutex
callsMap map[string][]time.Time // atslēga — lietotāja ID, vērtība — zvanu laika zīmju saraksts
}
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]
// Saglabā tikai pēdējo 15 minūšu zvanu laika zīmes
var recentCalls []time.Time
for _, t := range calls {
if t.After(windowStart) {
recentCalls = append(recentCalls, t)
}
}
if len(recentCalls) >= 10 {
// Automātiska noraidīšana
return false
}
// Pievienojam pašreizējo zvanu
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("Zvana pieņemšana")
} else {
fmt.Println("Zvana noraidīšana")
}
time.Sleep(1 * time.Minute)
}
}
Šajā piemērā RegisterCall atgriež true, ja zvanu var pieņemt, un false, ja nē. Šī pieeja ļauj efektīvi kontrolēt zvanu skaitu noteiktā laika posmā un īstenot automātisku noraidīšanu.