58 lines
975 B
Go
58 lines
975 B
Go
package dht
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/anacrolix/dht/krpc"
|
|
)
|
|
|
|
type nodeKey struct {
|
|
addr Addr
|
|
id int160
|
|
}
|
|
|
|
type node struct {
|
|
nodeKey
|
|
announceToken string
|
|
readOnly bool
|
|
|
|
lastGotQuery time.Time
|
|
lastGotResponse time.Time
|
|
|
|
consecutiveFailures int
|
|
}
|
|
|
|
func (n *node) hasAddrAndID(addr Addr, id int160) bool {
|
|
return id == n.id && n.addr.String() == addr.String()
|
|
}
|
|
|
|
func (n *node) IsSecure() bool {
|
|
return NodeIdSecure(n.id.AsByteArray(), n.addr.UDPAddr().IP)
|
|
}
|
|
|
|
func (n *node) idString() string {
|
|
return n.id.ByteString()
|
|
}
|
|
|
|
func (n *node) NodeInfo() (ret krpc.NodeInfo) {
|
|
ret.Addr = n.addr.KRPC()
|
|
if n := copy(ret.ID[:], n.idString()); n != 20 {
|
|
panic(n)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Per the spec in BEP 5.
|
|
func (n *node) IsGood() bool {
|
|
if n.id.IsZero() {
|
|
return false
|
|
}
|
|
if time.Since(n.lastGotResponse) < 15*time.Minute {
|
|
return true
|
|
}
|
|
if !n.lastGotResponse.IsZero() && time.Since(n.lastGotQuery) < 15*time.Minute {
|
|
return true
|
|
}
|
|
return false
|
|
}
|