68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
package senders
|
|
|
|
import (
|
|
"net"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/gopatchy/artmap/config"
|
|
)
|
|
|
|
type SenderInfo struct {
|
|
Universe config.Universe `json:"universe"`
|
|
IP string `json:"ip"`
|
|
}
|
|
|
|
type senderKey struct {
|
|
protocol config.Protocol
|
|
universe uint16
|
|
ip string
|
|
}
|
|
|
|
type UniverseSenders struct {
|
|
mu sync.Mutex
|
|
entries map[senderKey]time.Time
|
|
}
|
|
|
|
func New() *UniverseSenders {
|
|
return &UniverseSenders{
|
|
entries: map[senderKey]time.Time{},
|
|
}
|
|
}
|
|
|
|
func (s *UniverseSenders) Record(u config.Universe, ip net.IP) {
|
|
key := senderKey{
|
|
protocol: u.Protocol,
|
|
universe: u.Number,
|
|
ip: ip.String(),
|
|
}
|
|
s.mu.Lock()
|
|
s.entries[key] = time.Now()
|
|
s.mu.Unlock()
|
|
}
|
|
|
|
func (s *UniverseSenders) Expire(maxAge time.Duration) {
|
|
cutoff := time.Now().Add(-maxAge)
|
|
s.mu.Lock()
|
|
for k, t := range s.entries {
|
|
if t.Before(cutoff) {
|
|
delete(s.entries, k)
|
|
}
|
|
}
|
|
s.mu.Unlock()
|
|
}
|
|
|
|
func (s *UniverseSenders) GetAll() []SenderInfo {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
|
|
result := make([]SenderInfo, 0, len(s.entries))
|
|
for k := range s.entries {
|
|
result = append(result, SenderInfo{
|
|
Universe: config.Universe{Protocol: k.protocol, Number: k.universe},
|
|
IP: k.ip,
|
|
})
|
|
}
|
|
return result
|
|
}
|