Skip to content
Snippets Groups Projects
bubble.py 1.08 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jarrod Pas's avatar
    Jarrod Pas committed
    def bubble(self, packet, state):
        ''''''
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        if 'bubble_lp' not in packet.stats:
            packet.stats = {
                f'bubble_{reason}': 0
                for reason in ['direct', 'lp', 'gp']
            }
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
        stats = packet.stats
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        dest = packet.destination
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        community = self.network.community
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        def send(to, reason):
            stats[f'bubble_{reason}'] += 1
            self.send(to, packet, reason=reason)
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        if dest in self.links:
            send(dest, 'direct')
            return True
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        lp = lambda n: community.get_lp(n)
        gp = lambda n: community.get_gp(n)
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        local_community = [
            met for met in self.links if met in self.community
        ]
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        not_local_community = [
            met for met in self.links if met not in self.community
        ]
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        if local_community:
            max_lp = max(local_community, key=lp)
            if lp(max_lp) > lp(self):
                send(max_lp, 'lp')
    
    Jarrod Pas's avatar
    Jarrod Pas committed
                return True
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        elif not_local_community:
            max_gp = max(not_local_community, key=gp)
            if gp(max_gp) > gp(self):
                send(max_gp, 'gp')
    
    Jarrod Pas's avatar
    Jarrod Pas committed
                return True
    
        return False