def __init__(self): self.logger = logging.getLogger('group_leader') self.peers = set() self.music = mpd.music.get_hashes() address = network.parse_address(network.get_group_address()) self.logger.info('starting group leader server on {}'.format(address)) super().__init__(address, GroupLeaderHandler) self.thread = threading.Thread(target=self.serve_forever, daemon=True) self.thread.start()
def __init__(self, leader): self.logger = logging.getLogger('group_peer') self.leader = leader self.music = mpd.music.get_hashes() self.peers = set() self.join_pending = True # start server for group messages address = network.get_group_address() self.logger.info('starting peer server on {}'.format(address)) super().__init__(network.parse_address(address), GroupPeerHandler) self.thread = threading.Thread(target=self.serve_forever, daemon=True) self.thread.start() # try to contact group leader with GroupJoin self.logger.debug('contacting leader at {}'.format(leader)) self.send_leader(proto.GroupJoin(network.get_group_port()))
def group_ping(): if data.ping_id in self.state['group_pings']: # We've seen this ping, do nothing self.logger.debug('known ping -> ignore') else: # We've not seen this ping, flood self.state['group_pings'][data.ping_id] = peer data.ttl -= 1 for p in self.state['neighbours']: if p != peer: p.send(data) if self.state['group']: # We're in a group, so we should answer self.logger.debug('reply with group pong to {}'.format( peer.address)) music = self.state['group'].music if isinstance(self.state['group'], GroupLeader): m = proto.GroupPong(data.ping_id, network.get_group_address(), music) elif isinstance(self.state['group'], GroupPeer): m = proto.GroupPong(data.ping_id, self.state['group'].leader, music) peer.send(m)
def remove_peer(self, a, p): peer = '{}:{}'.format(a, p) self.peers.remove(peer) m = proto.GroupInfo(network.get_group_address(), self.peers) self.send_all(m)
def update_peers(self, ps): self.peers = ps - {network.get_group_address()} self.logger.debug('updating peers: {}'.format(self.peers))