PyBitmessage/src/knownnodes.py

64 lines
1.6 KiB
Python
Raw Normal View History

2017-10-19 06:52:44 +00:00
import os
2018-05-03 10:05:49 +00:00
import pickle
import threading
import state
2018-05-03 10:05:49 +00:00
from bmconfigparser import BMConfigParser
knownNodesLock = threading.Lock()
knownNodes = {}
knownNodesTrimAmount = 2000
2017-10-19 06:52:44 +00:00
# forget a node after rating is this low
knownNodesForgetRating = -0.5
2018-05-03 10:05:49 +00:00
def saveKnownNodes(dirName=None):
if dirName is None:
dirName = state.appdata
with knownNodesLock:
2017-10-19 06:52:44 +00:00
with open(os.path.join(dirName, 'knownnodes.dat'), 'wb') as output:
pickle.dump(knownNodes, output)
2018-05-03 10:05:49 +00:00
def increaseRating(peer):
increaseAmount = 0.1
maxRating = 1
with knownNodesLock:
for stream in knownNodes.keys():
try:
2018-05-03 10:05:49 +00:00
knownNodes[stream][peer]["rating"] = min(
knownNodes[stream][peer]["rating"] + increaseAmount,
maxRating
)
except KeyError:
pass
2018-05-03 10:05:49 +00:00
def decreaseRating(peer):
decreaseAmount = 0.1
minRating = -1
with knownNodesLock:
for stream in knownNodes.keys():
try:
2018-05-03 10:05:49 +00:00
knownNodes[stream][peer]["rating"] = max(
knownNodes[stream][peer]["rating"] - decreaseAmount,
minRating
)
except KeyError:
pass
2018-05-03 10:05:49 +00:00
def trimKnownNodes(recAddrStream=1):
if len(knownNodes[recAddrStream]) < \
BMConfigParser().safeGetInt("knownnodes", "maxnodes"):
return
with knownNodesLock:
2018-05-03 10:05:49 +00:00
oldestList = sorted(
knownNodes[recAddrStream],
key=lambda x: x['lastseen']
)[:knownNodesTrimAmount]
for oldest in oldestList:
del knownNodes[recAddrStream][oldest]