When merging clients, merge also error count
This commit is contained in:
parent
5bb4748056
commit
dc9f836932
|
@ -36,8 +36,8 @@ class Hazelnut:
|
||||||
# See https://fr.wikipedia.org/wiki/Adresse_IPv6_mappant_IPv4
|
# See https://fr.wikipedia.org/wiki/Adresse_IPv6_mappant_IPv4
|
||||||
address = "::ffff:" + socket.getaddrinfo(address, None, socket.AF_INET)[0][4][0]
|
address = "::ffff:" + socket.getaddrinfo(address, None, socket.AF_INET)[0][4][0]
|
||||||
|
|
||||||
self.addresses = list()
|
self.addresses = set()
|
||||||
self.addresses.append((address, port))
|
self.addresses.add((address, port))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def potential(self) -> bool:
|
def potential(self) -> bool:
|
||||||
|
@ -53,7 +53,7 @@ class Hazelnut:
|
||||||
A client can have multiple addresses.
|
A client can have multiple addresses.
|
||||||
We contact it only on one of them.
|
We contact it only on one of them.
|
||||||
"""
|
"""
|
||||||
return self.addresses[0]
|
return list(self.addresses)[0]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def banned(self) -> bool:
|
def banned(self) -> bool:
|
||||||
|
@ -68,6 +68,19 @@ class Hazelnut:
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return repr(self)
|
return repr(self)
|
||||||
|
|
||||||
|
def merge(self, other: "Hazelnut") -> "Hazelnut":
|
||||||
|
"""
|
||||||
|
Merge the hazelnut data with one other.
|
||||||
|
The symmetric and active properties are kept from the original client.
|
||||||
|
"""
|
||||||
|
self.errors = max(self.errors, other.errors)
|
||||||
|
self.last_hello_time = max(self.last_hello_time, other.last_hello_time)
|
||||||
|
self.last_long_hello_time = max(self.last_hello_time, other.last_long_hello_time)
|
||||||
|
self.addresses.update(self.addresses)
|
||||||
|
self.addresses.update(other.addresses)
|
||||||
|
self.id = self.id if self.id > 0 else other.id
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
class Squirrel(Hazelnut):
|
class Squirrel(Hazelnut):
|
||||||
"""
|
"""
|
||||||
|
@ -686,19 +699,13 @@ class Squirrel(Hazelnut):
|
||||||
if addr in self.hazelnuts:
|
if addr in self.hazelnuts:
|
||||||
# Merge with the previous hazel
|
# Merge with the previous hazel
|
||||||
old_hazel = self.hazelnuts[addr]
|
old_hazel = self.hazelnuts[addr]
|
||||||
for other_addr in old_hazel.addresses:
|
hazelnut.merge(old_hazel)
|
||||||
if other_addr not in hazelnut.addresses:
|
|
||||||
hazelnut.addresses.append(other_addr)
|
|
||||||
self.hazelnuts[other_addr] = hazelnut
|
|
||||||
self.hazelnuts[addr] = hazelnut
|
self.hazelnuts[addr] = hazelnut
|
||||||
|
|
||||||
for other_hazel in list(self.hazelnuts.values()):
|
for other_hazel in list(self.hazelnuts.values()):
|
||||||
if other_hazel.id == hazelnut.id > 0 and other_hazel != hazelnut:
|
if other_hazel.id == hazelnut.id > 0 and other_hazel != hazelnut:
|
||||||
# The hazelnut with the same id is known as a different address. We merge everything
|
# The hazelnut with the same id is known as a different address. We merge everything
|
||||||
for addr in other_hazel.addresses:
|
hazelnut.merge(other_hazel)
|
||||||
self.hazelnuts[addr] = hazelnut
|
|
||||||
if addr not in hazelnut.addresses:
|
|
||||||
hazelnut.addresses.append(addr)
|
|
||||||
|
|
||||||
def send_neighbours(self) -> None:
|
def send_neighbours(self) -> None:
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue