diff --git a/onionr/api.py b/onionr/api.py index fa7833fe..a10a9163 100755 --- a/onionr/api.py +++ b/onionr/api.py @@ -143,9 +143,9 @@ class PublicAPI: @app.route('/pex') def peerExchange(): - response = ','.join(clientAPI._core.listAdders()) + response = ','.join(clientAPI._core.listAdders(recent=3600)) if len(response) == 0: - response = 'none' + response = '' return Response(response) @app.route('/announce', methods=['post']) diff --git a/onionr/communicator2.py b/onionr/communicator2.py index d63bb9db..0458aa74 100755 --- a/onionr/communicator2.py +++ b/onionr/communicator2.py @@ -107,7 +107,7 @@ class OnionrCommunicatorDaemon: netCheckTimer = OnionrCommunicatorTimers(self, self.daemonTools.netCheck, 600) if config.get('general.security_level') == 0: - announceTimer = OnionrCommunicatorTimers(self, self.daemonTools.announceNode, 86400, requiresPeer=True, maxThreads=1) + announceTimer = OnionrCommunicatorTimers(self, self.daemonTools.announceNode, 3600, requiresPeer=True, maxThreads=1) announceTimer.count = (announceTimer.frequency - 120) else: logger.debug('Will not announce node.') diff --git a/onionr/core.py b/onionr/core.py index 3a09f758..35e9bb11 100644 --- a/onionr/core.py +++ b/onionr/core.py @@ -405,7 +405,7 @@ class Core: return - def listAdders(self, randomOrder=True, i2p=True): + def listAdders(self, randomOrder=True, i2p=True, recent=0): ''' Return a list of addresses ''' @@ -417,8 +417,17 @@ class Core: addresses = c.execute('SELECT * FROM adders;') addressList = [] for i in addresses: + if len(i[0].strip()) == 0: + continue addressList.append(i[0]) conn.close() + testList = list(addressList) # create new list to iterate + for address in testList: + try: + if recent > 0 and (self._utils.getEpoch() - self.getAddressInfo(address, 'lastConnect')) > recent: + raise TypeError # If there is no last-connected date or it was too long ago, don't add peer to list if recent is not 0 + except TypeError: + addressList.remove(address) return addressList def listPeers(self, randomOrder=True, getPow=False, trust=0): diff --git a/onionr/onionrpeers.py b/onionr/onionrpeers.py index e4793dfb..e0a509c4 100644 --- a/onionr/onionrpeers.py +++ b/onionr/onionrpeers.py @@ -28,6 +28,7 @@ class PeerProfiles: self.friendSigCount = 0 self.success = 0 self.failure = 0 + self.connectTime = None if not isinstance(coreInst, core.Core): raise TypeError("coreInst must be a type of core.Core") @@ -35,6 +36,7 @@ class PeerProfiles: assert isinstance(self.coreInst, core.Core) self.loadScore() + self.getConnectTime() return def loadScore(self): @@ -44,7 +46,13 @@ class PeerProfiles: except (TypeError, ValueError) as e: self.success = 0 self.score = self.success - + + def getConnectTime(self): + try: + self.connectTime = self.coreInst.getAddressInfo(self.address, 'lastConnect') + except KeyError: + pass + def saveScore(self): '''Save the node's score to the database''' self.coreInst.setAddressInfo(self.address, 'success', self.score) @@ -61,14 +69,21 @@ def getScoreSortedPeerList(coreInst): peerList = coreInst.listAdders() peerScores = {} + peerTimes = {} for address in peerList: # Load peer's profiles into a list profile = PeerProfiles(address, coreInst) peerScores[address] = profile.score + if not isinstance(profile.connectTime, type(None)): + peerTimes[address] = profile.connectTime + else: + peerTimes[address] = 9000 - # Sort peers by their score, greatest to least + # Sort peers by their score, greatest to least, and then last connected time peerList = sorted(peerScores, key=peerScores.get, reverse=True) + peerList = sorted(peerTimes, key=peerTimes.get, reverse=True) + print(peerList) return peerList def peerCleanup(coreInst):