lbry-sdk/lbrynet/lbrynet_console/plugins/BlindRepeater/__init__.py
2015-08-20 11:27:15 -04:00

128 lines
No EOL
6.2 KiB
Python

import leveldb
import os
from lbrynet.lbrynet_console import LBRYPlugin
from twisted.internet import defer, threads
from lbrynet.conf import MIN_VALUABLE_BLOB_HASH_PAYMENT_RATE, MIN_VALUABLE_BLOB_INFO_PAYMENT_RATE
from BlindRepeater import BlindRepeater
from BlindInfoManager import BlindInfoManager
from BlindRepeaterSettings import BlindRepeaterSettings
from BlindRepeaterControlHandlers import StartRepeaterFactory, StopRepeaterFactory, UpdateMaxSpaceFactory
from BlindRepeaterControlHandlers import AddApprovedPeerFactory, DeleteApprovedPeerFactory, RepeaterStatusFactory
from BlindRepeaterControlHandlers import ShowApprovedPeersFactory, ModifyRepeaterOptionsFactory
from ValuableBlobQueryHandler import ValuableBlobLengthQueryHandlerFactory
from ValuableBlobQueryHandler import ValuableBlobHashQueryHandlerFactory
from PaymentRateManager import BlindRepeaterPaymentRateManager
class BlindRepeaterPlugin(LBRYPlugin.LBRYPlugin):
def __init__(self):
LBRYPlugin.LBRYPlugin.__init__(self)
self.blind_info_manager = None
self.valuable_blob_length_query_handler = None
self.valuable_blob_hash_query_handler = None
self.repeater = None
self.control_handlers = None
self.payment_rate_manager = None
self.settings = None
self.db = None
def setup(self, lbry_console):
lbry_session = lbry_console.session
d = threads.deferToThread(self._setup_db, lbry_session.db_dir)
d.addCallback(lambda _: self._setup_settings())
d.addCallback(lambda _: self._get_payment_rate_manager(lbry_session.base_payment_rate_manager))
d.addCallback(lambda _: self._setup_blind_info_manager(lbry_session.peer_manager))
d.addCallback(lambda _: self._setup_blind_repeater(lbry_session))
d.addCallback(lambda _: self._setup_valuable_blob_query_handler(lbry_session))
d.addCallback(lambda _: self._create_control_handlers(lbry_session))
d.addCallback(lambda _: self._restore_repeater_status(lbry_session))
d.addCallback(lambda _: self._add_to_lbry_console(lbry_console))
return d
def _setup_db(self, db_dir):
self.db = leveldb.LevelDB(os.path.join(db_dir, "valuable_blobs.db"))
def _setup_settings(self):
self.settings = BlindRepeaterSettings(self.db)
def _get_payment_rate_manager(self, default_payment_rate_manager):
d1 = self.settings.get_data_payment_rate()
d2 = self.settings.get_valuable_info_payment_rate()
d3 = self.settings.get_valuable_hash_payment_rate()
dl = defer.DeferredList([d1, d2, d3])
def get_payment_rate_manager(rates):
data_rate = rates[0][1] if rates[0][0] is True else None
info_rate = rates[1][1] if rates[1][0] is True else None
info_rate = info_rate if info_rate is not None else MIN_VALUABLE_BLOB_INFO_PAYMENT_RATE
hash_rate = rates[2][1] if rates[2][0] is True else None
hash_rate = hash_rate if hash_rate is not None else MIN_VALUABLE_BLOB_HASH_PAYMENT_RATE
self.payment_rate_manager = BlindRepeaterPaymentRateManager(default_payment_rate_manager,
info_rate, hash_rate,
blob_data_rate=data_rate)
dl.addCallback(get_payment_rate_manager)
return dl
def _setup_blind_info_manager(self, peer_manager):
self.blind_info_manager = BlindInfoManager(self.db, peer_manager)
return self.blind_info_manager.setup()
def _setup_valuable_blob_query_handler(self, lbry_session):
self.valuable_blob_length_query_handler = ValuableBlobLengthQueryHandlerFactory(lbry_session.blob_manager,
lbry_session.wallet,
self.payment_rate_manager)
self.valuable_blob_hash_query_handler = ValuableBlobHashQueryHandlerFactory(lbry_session.peer_finder,
lbry_session.wallet,
self.payment_rate_manager)
def _setup_blind_repeater(self, lbry_session):
self.repeater = BlindRepeater(lbry_session.peer_finder, lbry_session.rate_limiter,
lbry_session.blob_manager, self.blind_info_manager,
lbry_session.wallet, self.payment_rate_manager)
return self.repeater.setup()
def _restore_repeater_status(self, lbry_session):
d = self.settings.get_saved_max_space()
def set_max_space(max_space):
self.repeater.set_max_space(max_space)
d.addCallback(set_max_space)
d.addCallback(lambda _: self.settings.get_approved_peers())
def set_approved_peers(peers):
for host, port in peers:
peer = lbry_session.peer_manager.get_peer(host, int(port))
self.repeater.add_approved_peer(peer)
d.addCallback(set_approved_peers)
d.addCallback(lambda _: self.settings.get_repeater_saved_status())
def restore_running(running):
if running:
return self.repeater.start()
else:
return defer.succeed(True)
d.addCallback(restore_running)
return d
def _create_control_handlers(self, lbry_session):
category = "Blind Repeater"
control_handlers = [StartRepeaterFactory(self.repeater, self.settings),
StopRepeaterFactory(self.repeater, self.settings),
RepeaterStatusFactory(self.repeater),
ShowApprovedPeersFactory(self.repeater),
ModifyRepeaterOptionsFactory(self.repeater, lbry_session, self.settings)]
self.control_handlers = zip([category] * len(control_handlers), control_handlers)
def _add_to_lbry_console(self, lbry_console):
lbry_console.add_control_handlers(self.control_handlers)
lbry_console.add_query_handlers([self.valuable_blob_length_query_handler,
self.valuable_blob_hash_query_handler])