Onionr/src/gossip/client/announce.py

51 lines
1.5 KiB
Python

from time import sleep
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .. import Peer
import logger
from ..commands import GossipCommands, command_to_byte
import onionrplugins
def do_announce(peer_set):
"Announce with N peers of each identified transport"
def _announce(announce_peer: 'Peer', our_transport_address: str):
try:
our_transport_address = our_transport_address.encode('utf-8')
except AttributeError:
pass
sock = announce_peer.get_socket(12)
sock.sendall(
command_to_byte(GossipCommands.ANNOUNCE) + our_transport_address)
if int.from_bytes(sock.recv(1), 'big') != 1:
logger.warn(
f"Could not announce with {announce_peer.transport_address}")
sock.close()
while not len(peer_set):
sleep(1)
per_transport = 3
peer_types = {}
count_for_peer = 0
for peer in peer_set:
try:
count_for_peer = peer_types[peer.__class__]
except KeyError:
count_for_peer = peer_types[peer.__class__] = 0
if count_for_peer == per_transport:
continue
# Plugin for the transport associated with the peer will call _announce
# with the peer and *our* transport address
onionrplugins.events.event(
'get_our_transport',
data={'callback': _announce, 'peer': peer},
threaded=True)
peer_types[peer.__class__] += 1