2022-11-23 13:51:55 -07:00
|
|
|
package peerfinder
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"time"
|
2022-12-19 10:50:38 -07:00
|
|
|
|
|
|
|
"github.com/keys-pub/keys/json"
|
|
|
|
"github.com/sour-is/ev/pkg/es/event"
|
|
|
|
"github.com/sour-is/ev/pkg/set"
|
2022-11-23 13:51:55 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
type Time time.Time
|
|
|
|
|
|
|
|
func (t *Time) UnmarshalJSON(b []byte) error {
|
|
|
|
time, err := time.Parse(`"2006-01-02 15:04:05"`, string(b))
|
|
|
|
*t = Time(time)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
func (t *Time) MarshalJSON() ([]byte, error) {
|
|
|
|
if t == nil {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
i := *t
|
|
|
|
return time.Time(i).MarshalJSON()
|
|
|
|
}
|
|
|
|
|
|
|
|
type ipFamily string
|
|
|
|
|
|
|
|
const (
|
|
|
|
ipFamilyV4 ipFamily = "IPv4"
|
|
|
|
ipFamilyV6 ipFamily = "IPv6"
|
|
|
|
ipFamilyBoth ipFamily = "both"
|
|
|
|
ipFamilyNone ipFamily = "none"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (t *ipFamily) UnmarshalJSON(b []byte) error {
|
|
|
|
i, err := strconv.Atoi(strings.Trim(string(b), `"`))
|
|
|
|
switch i {
|
|
|
|
case 1:
|
|
|
|
*t = ipFamilyV4
|
|
|
|
case 2:
|
|
|
|
*t = ipFamilyV6
|
|
|
|
case 3:
|
|
|
|
*t = ipFamilyBoth
|
|
|
|
default:
|
|
|
|
*t = ipFamilyNone
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
type peerType []string
|
|
|
|
|
|
|
|
func (t *peerType) UnmarshalJSON(b []byte) error {
|
2022-12-19 10:50:38 -07:00
|
|
|
var bs string
|
|
|
|
json.Unmarshal(b, &bs)
|
|
|
|
*t = strings.Split(bs, ",")
|
2022-11-23 13:51:55 -07:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type Peer struct {
|
|
|
|
ID string `json:"peer_id,omitempty"`
|
|
|
|
Owner string `json:"peer_owner"`
|
|
|
|
Nick string `json:"peer_nick"`
|
|
|
|
Name string `json:"peer_name"`
|
|
|
|
Country string `json:"peer_country"`
|
|
|
|
Note string `json:"peer_note"`
|
|
|
|
Family ipFamily `json:"peer_family"`
|
|
|
|
Type peerType `json:"peer_type"`
|
|
|
|
Created Time `json:"peer_created"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Peer) CanSupport(ip string) bool {
|
|
|
|
addr := net.ParseIP(ip)
|
|
|
|
if addr == nil {
|
|
|
|
return false
|
|
|
|
}
|
2022-12-19 10:50:38 -07:00
|
|
|
if !(addr.IsGlobalUnicast() || addr.IsLoopback() || addr.IsPrivate()) {
|
2022-11-23 13:51:55 -07:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
switch p.Family {
|
|
|
|
case ipFamilyV4:
|
|
|
|
return addr.To4() != nil
|
|
|
|
case ipFamilyV6:
|
|
|
|
return addr.To16() != nil
|
|
|
|
case ipFamilyNone:
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
2022-12-19 10:50:38 -07:00
|
|
|
|
|
|
|
type PeerResults struct {
|
|
|
|
set.Set[string]
|
|
|
|
event.AggregateRoot
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PeerResults) ApplyEvent(lis ...event.Event) {
|
|
|
|
for _, e := range lis {
|
|
|
|
switch e := e.(type) {
|
|
|
|
case *ResultSubmitted:
|
|
|
|
if p.Set == nil {
|
|
|
|
p.Set = set.New[string]()
|
|
|
|
}
|
|
|
|
p.Set.Add(e.RequestID)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|