Remove usage of squeak_core from squeak_store (#2029)

* Remove usage of squeak_core from squeak_store

* Remove default peer port arg from controller constructor
This commit is contained in:
Jonathan Zernik 2022-03-26 18:42:00 -07:00 committed by GitHub
parent 844ba41f0d
commit bd15c653aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 200 additions and 344 deletions

View file

@ -703,7 +703,7 @@ class SqueakAdminServerHandler(object):
author_profile_id,
),
)
self.squeak_controller.decrypt_private_squeak(
self.squeak_controller.unlock_squeak(
squeak_hash=squeak_hash,
author_profile_id=author_profile_id,
recipient_profile_id=recipient_profile_id,

View file

@ -26,7 +26,6 @@ from squeak.core.keys import SqueakPublicKey
from squeaknode.client.peer_downloader import RangeDownloader
from squeaknode.client.peer_downloader import SingleDownloader
from squeaknode.node.squeak_store import SqueakStore
logger = logging.getLogger(__name__)
@ -38,11 +37,11 @@ class NetworkController:
def __init__(
self,
squeak_store: SqueakStore,
squeak_controller,
proxy_host: Optional[str],
proxy_port: Optional[int],
):
self.squeak_store = squeak_store
self.squeak_controller = squeak_controller
self.proxy_host = proxy_host
self.proxy_port = proxy_port
@ -50,14 +49,14 @@ class NetworkController:
self,
interest_block_interval: int,
) -> None:
max_block = self.squeak_store.get_latest_block()
max_block = self.squeak_controller.get_latest_block()
min_block = max(0, max_block - interest_block_interval)
followed_public_keys = self.squeak_store.get_followed_public_keys()
peers = self.squeak_store.get_autoconnect_peers()
followed_public_keys = self.squeak_controller.get_followed_public_keys()
peers = self.squeak_controller.get_autoconnect_peers()
for peer in peers:
downloader = RangeDownloader(
peer,
self.squeak_store,
self.squeak_controller,
self.proxy_host,
self.proxy_port,
min_block,
@ -69,11 +68,11 @@ class NetworkController:
def download_pubkey_squeaks_async(self, pubkey: SqueakPublicKey) -> None:
min_block = 0 # TODO
max_block = 999999999999 # TODO
peers = self.squeak_store.get_autoconnect_peers()
peers = self.squeak_controller.get_autoconnect_peers()
for peer in peers:
downloader = RangeDownloader(
peer,
self.squeak_store,
self.squeak_controller,
self.proxy_host,
self.proxy_port,
min_block,
@ -83,11 +82,11 @@ class NetworkController:
downloader.download_async()
def download_single_squeak(self, squeak_hash: bytes) -> None:
peers = self.squeak_store.get_autoconnect_peers()
peers = self.squeak_controller.get_autoconnect_peers()
for peer in peers:
downloader = SingleDownloader(
peer,
self.squeak_store,
self.squeak_controller,
self.proxy_host,
self.proxy_port,
squeak_hash,

View file

@ -32,7 +32,6 @@ from squeak.core.keys import SqueakPublicKey
from squeaknode.client.peer_client import PeerClient
from squeaknode.core.squeak_peer import SqueakPeer
from squeaknode.core.squeaks import get_hash
from squeaknode.node.squeak_store import SqueakStore
logger = logging.getLogger(__name__)
@ -45,7 +44,7 @@ class PeerDownloader(ABC):
def __init__(
self,
peer: SqueakPeer,
squeak_store: SqueakStore,
squeak_controller,
proxy_host: Optional[str],
proxy_port: Optional[int],
):
@ -53,7 +52,7 @@ class PeerDownloader(ABC):
self.proxy_host = proxy_host
self.proxy_port = proxy_port
self.client = PeerClient(peer, proxy_host, proxy_port)
self.squeak_store = squeak_store
self.squeak_controller = squeak_controller
@abstractmethod
def get_hashes(self) -> List[bytes]:
@ -84,33 +83,33 @@ class PeerDownloader(ABC):
def get_squeak(self, squeak_hash: bytes) -> None:
# Download the squeak if not already owned.
if self.squeak_store.get_squeak(squeak_hash):
if self.squeak_controller.get_squeak(squeak_hash):
return
squeak = self.client.get_squeak(squeak_hash)
if squeak and self.is_squeak_wanted(squeak):
self.squeak_store.save_squeak(squeak)
self.squeak_controller.save_squeak(squeak)
def get_secret_key(self, squeak_hash: bytes) -> None:
# Get the squeak from the database.
squeak = self.squeak_store.get_squeak(squeak_hash)
squeak = self.squeak_controller.get_squeak(squeak_hash)
if squeak and self.is_squeak_wanted(squeak):
# Download the secret key is not already unlocked.
if self.squeak_store.get_squeak_secret_key(squeak_hash):
if self.squeak_controller.get_squeak_secret_key(squeak_hash):
return
secret_key = self.client.get_secret_key(squeak_hash)
if secret_key:
self.squeak_store.save_secret_key(squeak_hash, secret_key)
self.squeak_controller.save_secret_key(squeak_hash, secret_key)
def get_offer(self, squeak_hash: bytes) -> None:
# Get the squeak from the database.
squeak = self.squeak_store.get_squeak(squeak_hash)
squeak = self.squeak_controller.get_squeak(squeak_hash)
if squeak and self.is_squeak_wanted(squeak):
# Download the secret key is not already unlocked.
if self.squeak_store.get_squeak_secret_key(squeak_hash):
if self.squeak_controller.get_squeak_secret_key(squeak_hash):
return
offer = self.client.get_offer(squeak_hash)
if offer:
self.squeak_store.handle_offer(
self.squeak_controller.handle_offer(
squeak,
offer,
self.peer.address,
@ -122,14 +121,14 @@ class RangeDownloader(PeerDownloader):
def __init__(
self,
peer: SqueakPeer,
squeak_store: SqueakStore,
squeak_controller,
proxy_host: Optional[str],
proxy_port: Optional[int],
min_block: int,
max_block: int,
pubkeys: List[SqueakPublicKey],
):
super().__init__(peer, squeak_store, proxy_host, proxy_port)
super().__init__(peer, squeak_controller, proxy_host, proxy_port)
self.min_block = min_block
self.max_block = max_block
self.pubkeys = pubkeys
@ -152,12 +151,12 @@ class SingleDownloader(PeerDownloader):
def __init__(
self,
peer: SqueakPeer,
squeak_store: SqueakStore,
squeak_controller,
proxy_host: Optional[str],
proxy_port: Optional[int],
squeak_hash: bytes,
):
super().__init__(peer, squeak_store, proxy_host, proxy_port)
super().__init__(peer, squeak_controller, proxy_host, proxy_port)
self.squeak_hash = squeak_hash
def get_hashes(self) -> List[bytes]:

View file

@ -28,6 +28,7 @@ from squeak.core import CSqueak
from squeak.core.keys import SqueakPrivateKey
from squeak.core.keys import SqueakPublicKey
from squeaknode.client.network_controller import NetworkController
from squeaknode.core.download_result import DownloadResult
from squeaknode.core.lightning_address import LightningAddressHostPort
from squeaknode.core.offer import Offer
@ -36,6 +37,7 @@ from squeaknode.core.peer_address import PeerAddress
from squeaknode.core.received_offer import ReceivedOffer
from squeaknode.core.received_payment import ReceivedPayment
from squeaknode.core.received_payment_summary import ReceivedPaymentSummary
from squeaknode.core.sent_offer import SentOffer
from squeaknode.core.sent_payment import SentPayment
from squeaknode.core.sent_payment_summary import SentPaymentSummary
from squeaknode.core.squeak_core import SqueakCore
@ -61,20 +63,19 @@ class SqueakController:
squeak_store: SqueakStore,
squeak_core: SqueakCore,
payment_processor,
tweet_forwarder,
network_controller,
node_settings,
config,
default_port,
):
self.squeak_store = squeak_store
self.squeak_core = squeak_core
self.payment_processor = payment_processor
self.tweet_forwarder = tweet_forwarder
self.network_controller = network_controller
self.node_settings = node_settings
self.config = config
self.default_port = default_port
def save_squeak(self, squeak: CSqueak) -> Optional[bytes]:
# Get the block header.
block_header = self.squeak_core.get_block_header(squeak)
return self.squeak_store.save_squeak(squeak, block_header)
def make_squeak(
self,
@ -101,17 +102,74 @@ class SqueakController:
replyto_hash,
recipient_profile=recipient_profile if recipient_profile_id else None,
)
inserted_squeak_hash = self.squeak_store.save_squeak(squeak)
inserted_squeak_hash = self.save_squeak(squeak)
if inserted_squeak_hash is None:
raise Exception("Failed to save squeak.")
self.squeak_store.save_secret_key(inserted_squeak_hash, secret_key)
if squeak.is_private_message:
self.squeak_store.unlock_squeak(
self.unlock_squeak(
inserted_squeak_hash,
author_profile_id=profile_id,
)
else:
self.unlock_squeak(
inserted_squeak_hash,
)
return inserted_squeak_hash
def save_secret_key(self, squeak_hash: bytes, secret_key: bytes):
squeak = self.squeak_store.get_squeak(squeak_hash)
if squeak is None:
raise Exception("Squeakdoes not exist.")
self.squeak_store.save_secret_key(squeak_hash, secret_key)
if not squeak.is_private_message:
self.unlock_squeak(squeak_hash)
def unlock_squeak(
self,
squeak_hash: bytes,
author_profile_id: Optional[int] = None,
recipient_profile_id: Optional[int] = None,
):
squeak = self.squeak_store.get_squeak(squeak_hash)
secret_key = self.squeak_store.get_squeak_secret_key(squeak_hash)
if squeak is None:
raise Exception("Squeakdoes not exist.")
if secret_key is None:
raise Exception("Secret key does not exist.")
if recipient_profile_id:
recipient_profile = self.squeak_store.get_squeak_profile(
recipient_profile_id)
if recipient_profile is None:
raise Exception("Recipient profile does not exist.")
decrypted_content = self.squeak_core.get_decrypted_content(
squeak,
secret_key,
recipient_profile=recipient_profile,
)
elif author_profile_id:
author_profile = self.squeak_store.get_squeak_profile(
author_profile_id)
if author_profile is None:
raise Exception("Author profile does not exist.")
decrypted_content = self.squeak_core.get_decrypted_content(
squeak,
secret_key,
author_profile=author_profile,
)
else:
decrypted_content = self.squeak_core.get_decrypted_content(
squeak,
secret_key,
)
self.squeak_store.set_decrypted_content(
squeak_hash,
decrypted_content,
)
logger.info("Unlocked squeak content: {}".format(
squeak_hash.hex(),
))
def pay_offer(self, received_offer_id: int) -> int:
received_offer = self.squeak_store.get_received_offer(
received_offer_id,
@ -120,6 +178,11 @@ class SqueakController:
raise Exception("Received offer with id {} not found.".format(
received_offer_id,
))
squeak = self.squeak_store.get_squeak(received_offer.squeak_hash)
if squeak is None:
raise Exception("Squeak for received offer with id {} not found.".format(
received_offer_id,
))
logger.info("Paying received offer: {}".format(received_offer))
sent_payment = self.squeak_core.pay_offer(received_offer)
sent_payment_id = self.squeak_store.save_sent_payment(sent_payment)
@ -130,6 +193,8 @@ class SqueakController:
received_offer.squeak_hash,
sent_payment.secret_key,
)
if not squeak.is_private_message:
self.unlock_squeak(received_offer.squeak_hash)
return sent_payment_id
def get_packaged_offer(
@ -147,24 +212,53 @@ class SqueakController:
price_msat = self.get_sell_price_msat()
if price_msat == 0:
return None
return self.squeak_store.get_packaged_offer(
# return self.squeak_store.get_packaged_offer(
# squeak_hash,
# peer_address,
# price_msat,
# lnd_external_address,
# )
sent_offer = self.get_sent_offer_for_peer(
squeak_hash,
peer_address,
price_msat,
)
if sent_offer is None:
return None
return self.squeak_core.package_offer(
sent_offer,
lnd_external_address,
)
def decrypt_private_squeak(
def get_sent_offer_for_peer(
self,
squeak_hash: bytes,
author_profile_id: Optional[int],
recipient_profile_id: Optional[int],
):
self.squeak_store.unlock_squeak(
peer_address: PeerAddress,
price_msat: int,
) -> Optional[SentOffer]:
# Check if there is an existing offer for the hash/peer_address combination
sent_offer = self.squeak_store.get_sent_offer_by_squeak_hash_and_peer(
squeak_hash,
author_profile_id=author_profile_id,
recipient_profile_id=recipient_profile_id,
peer_address,
)
if sent_offer:
return sent_offer
squeak = self.squeak_store.get_squeak(squeak_hash)
secret_key = self.squeak_store.get_squeak_secret_key(squeak_hash)
if squeak is None or secret_key is None:
return None
try:
sent_offer = self.squeak_core.create_offer(
squeak,
secret_key,
peer_address,
price_msat,
)
except Exception:
logger.exception("Failed to create offer.")
return None
self.squeak_store.save_sent_offer(sent_offer)
return sent_offer
def get_squeak(self, squeak_hash: bytes) -> Optional[CSqueak]:
return self.squeak_store.get_squeak(squeak_hash)
@ -220,6 +314,9 @@ class SqueakController:
def get_squeak_profile_private_key(self, profile_id: int) -> bytes:
return self.squeak_store.get_squeak_profile_private_key(profile_id)
def get_followed_public_keys(self) -> List[SqueakPublicKey]:
return self.squeak_store.get_followed_public_keys()
def create_peer(self, peer_name: str, peer_address: PeerAddress):
return self.squeak_store.create_peer(peer_name, peer_address)
@ -247,6 +344,14 @@ class SqueakController:
def delete_peer(self, peer_id: int):
return self.squeak_store.delete_peer(peer_id)
def handle_offer(self, squeak: CSqueak, offer: Offer, peer_address: PeerAddress):
received_offer = self.squeak_core.unpack_offer(
squeak,
offer,
peer_address,
)
self.squeak_store.save_received_offer(received_offer)
def get_received_offers(self, squeak_hash: bytes) -> List[ReceivedOffer]:
return self.squeak_store.get_received_offers(squeak_hash)
@ -297,7 +402,12 @@ class SqueakController:
return self.squeak_store.get_squeak_entry(squeak_hash)
def download_single_squeak(self, squeak_hash: bytes) -> DownloadResult:
self.network_controller.download_single_squeak(squeak_hash)
network_controller = NetworkController(
self,
self.config.tor.proxy_ip,
self.config.tor.proxy_port,
)
network_controller.download_single_squeak(squeak_hash)
return DownloadResult(1, 1, 0, 9999)
def get_timeline_squeak_entries(
@ -340,7 +450,12 @@ class SqueakController:
) -> List[SqueakEntry]:
# TODO: remove this temporary hack, after converting this to websockets.
logger.info('Start downloading pubkey squeaks...')
self.network_controller.download_pubkey_squeaks_async(public_key)
network_controller = NetworkController(
self,
self.config.tor.proxy_ip,
self.config.tor.proxy_port,
)
network_controller.download_pubkey_squeaks_async(public_key)
logger.info('Finished downloading pubkey squeaks.')
return self.squeak_store.get_squeak_entries_for_public_key(
public_key,
@ -451,7 +566,7 @@ class SqueakController:
)
def get_default_peer_port(self) -> int:
return self.default_port
return 0 # TODO: maybe remove this method.
def set_sell_price_msat(self, sell_price_msat: int) -> None:
self.node_settings.set_sell_price_msat(sell_price_msat)
@ -474,7 +589,7 @@ class SqueakController:
profile_id,
bearer_token,
)
self.update_twitter_stream()
# self.update_twitter_stream()
return twitter_account_id
def get_twitter_accounts(self) -> List[TwitterAccountEntry]:
@ -482,7 +597,10 @@ class SqueakController:
def delete_twitter_account(self, twitter_account_id: int) -> None:
self.squeak_store.delete_twitter_account(twitter_account_id)
self.update_twitter_stream()
# self.update_twitter_stream()
def update_twitter_stream(self) -> None:
self.tweet_forwarder.start_processing()
# def update_twitter_stream(self) -> None:
# self.tweet_forwarder.start_processing()
def get_latest_block(self) -> int:
return self.squeak_core.get_best_block_height()

View file

@ -63,9 +63,9 @@ class SqueakNode:
self.create_squeak_core()
self.create_squeak_store()
self.create_payment_processor()
self.create_twitter_forwarder()
self.create_network_controller()
self.create_squeak_controller()
self.create_network_controller()
self.create_twitter_forwarder()
self.create_peer_handler()
self.create_peer_web_server()
@ -144,7 +144,6 @@ class SqueakNode:
def create_squeak_store(self):
self.squeak_store = SqueakStore(
self.squeak_db,
self.squeak_core,
self.config.node.max_squeaks,
self.config.node.max_squeaks_per_public_key_per_block,
self.config.node.squeak_retention_s,
@ -161,28 +160,25 @@ class SqueakNode:
def create_twitter_forwarder(self):
self.twitter_forwarder = TwitterForwarder(
self.squeak_store,
self.squeak_controller,
self.squeak_core,
self.config.twitter.forward_tweets_retry_s,
)
def create_network_controller(self):
self.network_controller = NetworkController(
self.squeak_store,
self.config.tor.proxy_ip,
self.config.tor.proxy_port,
)
def create_squeak_controller(self):
self.squeak_controller = SqueakController(
self.squeak_store,
self.squeak_core,
self.payment_processor,
self.twitter_forwarder,
self.network_controller,
self.node_settings,
self.config,
squeak.params.params.DEFAULT_PORT,
)
def create_network_controller(self):
self.network_controller = NetworkController(
self.squeak_controller,
self.config.tor.proxy_ip,
self.config.tor.proxy_port,
)
def create_admin_handler(self):

View file

@ -25,14 +25,13 @@ from typing import Iterator
from typing import List
from typing import Optional
from bitcoin.core import CBlockHeader
from squeak.core import CheckSqueak
from squeak.core import CheckSqueakSecretKey
from squeak.core import CSqueak
from squeak.core.keys import SqueakPrivateKey
from squeak.core.keys import SqueakPublicKey
from squeaknode.core.lightning_address import LightningAddressHostPort
from squeaknode.core.offer import Offer
from squeaknode.core.peer_address import PeerAddress
from squeaknode.core.peers import create_saved_peer
from squeaknode.core.profiles import create_contact_profile
@ -44,7 +43,6 @@ from squeaknode.core.received_payment_summary import ReceivedPaymentSummary
from squeaknode.core.sent_offer import SentOffer
from squeaknode.core.sent_payment import SentPayment
from squeaknode.core.sent_payment_summary import SentPaymentSummary
from squeaknode.core.squeak_core import SqueakCore
from squeaknode.core.squeak_entry import SqueakEntry
from squeaknode.core.squeak_peer import SqueakPeer
from squeaknode.core.squeak_profile import SqueakProfile
@ -63,7 +61,6 @@ class SqueakStore:
def __init__(
self,
squeak_db: SqueakDb,
squeak_core: SqueakCore,
max_squeaks,
max_squeaks_per_public_key_per_block,
squeak_retention_s,
@ -71,7 +68,6 @@ class SqueakStore:
sent_offer_retention_s,
):
self.squeak_db = squeak_db
self.squeak_core = squeak_core
self.max_squeaks = max_squeaks
self.max_squeaks_per_public_key_per_block = max_squeaks_per_public_key_per_block
self.squeak_retention_s = squeak_retention_s
@ -83,15 +79,12 @@ class SqueakStore:
self.new_follow_listener = EventListener()
self.twitter_stream_change_listener = EventListener()
def save_squeak(self, squeak: CSqueak) -> Optional[bytes]:
def save_squeak(self, squeak: CSqueak, block_header: CBlockHeader) -> Optional[bytes]:
# Check if the squeak is valid context free.
CheckSqueak(squeak)
# Get the block header.
block_header = self.squeak_core.get_block_header(squeak)
# Check if limit exceeded.
if self.squeak_db.get_number_of_squeaks() >= self.max_squeaks:
raise Exception("Exceeded max number of squeaks.")
# TODO: Check if limit per public key per block is exceeded.
# Check if limit per public key per block is exceeded.
if self.squeak_db.number_of_squeaks_with_public_key_with_block_height(
squeak.GetPubKey(),
squeak.nBlockHeight,
@ -124,54 +117,12 @@ class SqueakStore:
squeak_hash.hex(),
))
self.new_secret_key_listener.handle_new_item(squeak)
# Unlock the squeak if it is not private.
if not squeak.is_private_message:
self.unlock_squeak(squeak_hash)
def unlock_squeak(
self,
squeak_hash: bytes,
author_profile_id: Optional[int] = None,
recipient_profile_id: Optional[int] = None,
):
squeak = self.squeak_db.get_squeak(squeak_hash)
secret_key = self.squeak_db.get_squeak_secret_key(squeak_hash)
if squeak is None:
raise Exception("Squeakdoes not exist.")
if secret_key is None:
raise Exception("Secret key does not exist.")
if recipient_profile_id:
recipient_profile = self.squeak_db.get_profile(
recipient_profile_id)
if recipient_profile is None:
raise Exception("Recipient profile does not exist.")
decrypted_content = self.squeak_core.get_decrypted_content(
squeak,
secret_key,
recipient_profile=recipient_profile,
)
elif author_profile_id:
author_profile = self.squeak_db.get_profile(
author_profile_id)
if author_profile is None:
raise Exception("Author profile does not exist.")
decrypted_content = self.squeak_core.get_decrypted_content(
squeak,
secret_key,
author_profile=author_profile,
)
else:
decrypted_content = self.squeak_core.get_decrypted_content(
squeak,
secret_key,
)
def set_decrypted_content(self, squeak_hash: bytes, content: str):
self.squeak_db.set_squeak_decrypted_content(
squeak_hash,
decrypted_content,
content,
)
logger.info("Unlocked squeak content: {}".format(
squeak_hash.hex(),
))
def get_squeak(self, squeak_hash: bytes) -> Optional[CSqueak]:
return self.squeak_db.get_squeak(squeak_hash)
@ -191,56 +142,6 @@ class SqueakStore:
def save_sent_offer(self, sent_offer: SentOffer) -> int:
return self.squeak_db.insert_sent_offer(sent_offer)
def get_sent_offer_for_peer(
self,
squeak_hash: bytes,
peer_address: PeerAddress,
price_msat: int,
) -> Optional[SentOffer]:
# Check if there is an existing offer for the hash/peer_address combination
sent_offer = self.get_sent_offer_by_squeak_hash_and_peer(
squeak_hash,
peer_address,
)
if sent_offer:
return sent_offer
squeak = self.get_squeak(squeak_hash)
secret_key = self.get_squeak_secret_key(squeak_hash)
if squeak is None or secret_key is None:
return None
try:
sent_offer = self.squeak_core.create_offer(
squeak,
secret_key,
peer_address,
price_msat,
)
except Exception:
logger.exception("Failed to create offer.")
return None
self.save_sent_offer(sent_offer)
return sent_offer
# TODO: remove this method. Do this logic in squeakcontroller.
def get_packaged_offer(
self,
squeak_hash: bytes,
peer_address: PeerAddress,
price_msat: int,
lnd_external_address: Optional[LightningAddressHostPort],
) -> Optional[Offer]:
sent_offer = self.get_sent_offer_for_peer(
squeak_hash,
peer_address,
price_msat,
)
if sent_offer is None:
return None
return self.squeak_core.package_offer(
sent_offer,
lnd_external_address,
)
def create_signing_profile(self, profile_name: str) -> int:
squeak_profile = create_signing_profile(
profile_name,
@ -479,14 +380,6 @@ class SqueakStore:
self.new_received_offer_listener.handle_new_item(received_offer)
return received_offer_id
def handle_offer(self, squeak: CSqueak, offer: Offer, peer_address: PeerAddress):
received_offer = self.squeak_core.unpack_offer(
squeak,
offer,
peer_address,
)
self.save_received_offer(received_offer)
def get_followed_public_keys(self) -> List[SqueakPublicKey]:
followed_profiles = self.squeak_db.get_following_profiles()
return [profile.public_key for profile in followed_profiles]
@ -588,6 +481,3 @@ class SqueakStore:
def delete_twitter_account(self, twitter_account_id: int) -> None:
self.squeak_db.delete_twitter_account(twitter_account_id)
def get_latest_block(self) -> int:
return self.squeak_core.get_best_block_height()

View file

@ -25,7 +25,7 @@ from typing import Dict
from squeaknode.core.squeak_core import SqueakCore
from squeaknode.core.twitter_account_entry import TwitterAccountEntry
from squeaknode.node.squeak_store import SqueakStore
from squeaknode.node.squeak_controller import SqueakController
from squeaknode.twitter.twitter_stream import TwitterStream
@ -36,11 +36,11 @@ class TwitterForwarder:
def __init__(
self,
squeak_store: SqueakStore,
squeak_controller: SqueakController,
squeak_core: SqueakCore,
retry_s: int,
):
self.squeak_store = squeak_store
self.squeak_controller = squeak_controller
self.squeak_core = squeak_core
self.retry_s = retry_s
self.lock = threading.Lock()
@ -54,9 +54,9 @@ class TwitterForwarder:
del self.current_tasks[handle]
# Start new tasks.
for account in self.squeak_store.get_twitter_accounts():
for account in self.squeak_controller.get_twitter_accounts():
task = TwitterForwarderTask(
self.squeak_store,
self.squeak_controller,
self.squeak_core,
account,
self.retry_s,
@ -83,12 +83,12 @@ class TwitterForwarderTask:
def __init__(
self,
squeak_store: SqueakStore,
squeak_controller: SqueakController,
squeak_core: SqueakCore,
twitter_account: TwitterAccountEntry,
retry_s: int,
):
self.squeak_store = squeak_store
self.squeak_controller = squeak_controller
self.squeak_core = squeak_core
self.twitter_account = twitter_account
self.retry_s = retry_s
@ -166,7 +166,7 @@ class TwitterForwarderTask:
self.forward_tweet(tweet)
def make_squeak(self, profile_id: int, content_str: str):
squeak_profile = self.squeak_store.get_squeak_profile(profile_id)
squeak_profile = self.squeak_controller.get_squeak_profile(profile_id)
if squeak_profile is None:
raise Exception("Profile with id {} not found.".format(
profile_id,
@ -175,9 +175,10 @@ class TwitterForwarderTask:
squeak_profile,
content_str,
)
inserted_squeak_hash = self.squeak_store.save_squeak(
inserted_squeak_hash = self.squeak_controller.save_squeak(
squeak,
)
if inserted_squeak_hash is None:
return None
self.squeak_store.save_secret_key(inserted_squeak_hash, secret_key)
self.squeak_controller.save_secret_key(
inserted_squeak_hash, secret_key)

View file

@ -22,7 +22,6 @@
import mock
import pytest
from squeaknode.client.network_controller import NetworkController
from squeaknode.config.config import SqueaknodeConfig
from squeaknode.core.lightning_address import LightningAddressHostPort
from squeaknode.core.peer_address import Network
@ -32,7 +31,6 @@ from squeaknode.node.node_settings import NodeSettings
from squeaknode.node.payment_processor import PaymentProcessor
from squeaknode.node.squeak_controller import SqueakController
from squeaknode.node.squeak_store import SqueakStore
from squeaknode.twitter.twitter_forwarder import TwitterForwarder
@pytest.fixture
@ -94,46 +92,25 @@ def price_msat():
return 777
@pytest.fixture
def default_peer_port():
return 8765
@pytest.fixture
def payment_processor():
return mock.Mock(spec=PaymentProcessor)
@pytest.fixture
def twitter_forwarder():
return mock.Mock(spec=TwitterForwarder)
@pytest.fixture
def network_controller():
return mock.Mock(spec=NetworkController)
@pytest.fixture
def squeak_controller(
squeak_store,
squeak_core,
payment_processor,
twitter_forwarder,
network_controller,
node_settings,
config,
default_peer_port,
):
return SqueakController(
squeak_store,
squeak_core,
payment_processor,
twitter_forwarder,
network_controller,
node_settings,
config,
default_peer_port,
)
@ -142,21 +119,15 @@ def regtest_squeak_controller(
squeak_store,
squeak_core,
payment_processor,
twitter_forwarder,
network_controller,
node_settings,
regtest_config,
default_peer_port,
):
return SqueakController(
squeak_store,
squeak_core,
payment_processor,
twitter_forwarder,
network_controller,
node_settings,
regtest_config,
default_peer_port,
)

View file

@ -23,7 +23,6 @@ import mock
import pytest
from squeaknode.core.lightning_address import LightningAddressHostPort
from squeaknode.core.squeak_core import SqueakCore
from squeaknode.db.squeak_db import SqueakDb
from squeaknode.node.squeak_store import SqueakStore
@ -33,11 +32,6 @@ def squeak_db():
return mock.Mock(spec=SqueakDb)
@pytest.fixture
def squeak_core():
return mock.Mock(spec=SqueakCore)
@pytest.fixture
def lightning_host_port():
return LightningAddressHostPort(host="my_lightning_host", port=8765)
@ -81,7 +75,6 @@ def inserted_signing_profile_id(squeak_db, signing_profile):
@pytest.fixture
def squeak_store(
squeak_db,
squeak_core,
max_squeaks,
max_squeaks_per_public_key_per_block,
squeak_retention_s,
@ -90,7 +83,6 @@ def squeak_store(
):
return SqueakStore(
squeak_db,
squeak_core,
max_squeaks,
max_squeaks_per_public_key_per_block,
squeak_retention_s,
@ -99,31 +91,27 @@ def squeak_store(
)
def test_save_squeak(squeak_store, squeak_db, squeak_core, block_header, squeak, squeak_hash):
def test_save_squeak(squeak_store, squeak_db, block_header, squeak, squeak_hash):
with mock.patch.object(squeak_db, 'get_number_of_squeaks', autospec=True) as mock_get_number_of_squeaks, \
mock.patch.object(squeak_db, 'number_of_squeaks_with_public_key_with_block_height', autospec=True) as mock_number_of_squeaks_with_public_key_with_block_height, \
mock.patch.object(squeak_db, 'insert_squeak', autospec=True) as mock_insert_squeak, \
mock.patch.object(squeak_store.new_squeak_listener, 'handle_new_item', autospec=True) as mock_handle_new_squeak, \
mock.patch.object(squeak_core, 'get_block_header', autospec=True) as mock_get_block_header:
mock.patch.object(squeak_store.new_squeak_listener, 'handle_new_item', autospec=True) as mock_handle_new_squeak:
mock_get_number_of_squeaks.return_value = 0
mock_number_of_squeaks_with_public_key_with_block_height.return_value = 0
mock_get_block_header.return_value = block_header
mock_insert_squeak.return_value = squeak_hash
squeak_store.save_squeak(squeak)
squeak_store.save_squeak(squeak, block_header)
mock_insert_squeak.assert_called_once_with(squeak, block_header)
mock_handle_new_squeak.assert_called_once_with(squeak)
def test_save_squeak_above_max(squeak_store, squeak_db, squeak_core, block_header, squeak, squeak_hash, max_squeaks):
def test_save_squeak_above_max(squeak_store, squeak_db, block_header, squeak, squeak_hash, max_squeaks):
with mock.patch.object(squeak_db, 'get_number_of_squeaks', autospec=True) as mock_get_number_of_squeaks, \
mock.patch.object(squeak_db, 'number_of_squeaks_with_public_key_with_block_height', autospec=True) as mock_number_of_squeaks_with_public_key_with_block_height, \
mock.patch.object(squeak_db, 'insert_squeak', autospec=True) as mock_insert_squeak, \
mock.patch.object(squeak_store.new_squeak_listener, 'handle_new_item', autospec=True) as mock_handle_new_squeak, \
mock.patch.object(squeak_core, 'get_block_header', autospec=True) as mock_get_block_header:
mock.patch.object(squeak_store.new_squeak_listener, 'handle_new_item', autospec=True) as mock_handle_new_squeak:
mock_get_number_of_squeaks.return_value = max_squeaks + 1
mock_number_of_squeaks_with_public_key_with_block_height.return_value = 0
mock_get_block_header.return_value = block_header
mock_insert_squeak.return_value = squeak_hash
with pytest.raises(Exception):
@ -133,15 +121,13 @@ def test_save_squeak_above_max(squeak_store, squeak_db, squeak_core, block_heade
assert mock_handle_new_squeak.call_count == 0
def test_save_squeak_above_max_per_pubkey(squeak_store, squeak_db, squeak_core, block_header, squeak, squeak_hash, max_squeaks_per_public_key_per_block):
def test_save_squeak_above_max_per_pubkey(squeak_store, squeak_db, block_header, squeak, squeak_hash, max_squeaks_per_public_key_per_block):
with mock.patch.object(squeak_db, 'get_number_of_squeaks', autospec=True) as mock_get_number_of_squeaks, \
mock.patch.object(squeak_db, 'number_of_squeaks_with_public_key_with_block_height', autospec=True) as mock_number_of_squeaks_with_public_key_with_block_height, \
mock.patch.object(squeak_db, 'insert_squeak', autospec=True) as mock_insert_squeak, \
mock.patch.object(squeak_store.new_squeak_listener, 'handle_new_item', autospec=True) as mock_handle_new_squeak, \
mock.patch.object(squeak_core, 'get_block_header', autospec=True) as mock_get_block_header:
mock.patch.object(squeak_store.new_squeak_listener, 'handle_new_item', autospec=True) as mock_handle_new_squeak:
mock_get_number_of_squeaks.return_value = 0
mock_number_of_squeaks_with_public_key_with_block_height.return_value = max_squeaks_per_public_key_per_block + 1
mock_get_block_header.return_value = block_header
mock_insert_squeak.return_value = squeak_hash
with pytest.raises(Exception):
@ -151,10 +137,9 @@ def test_save_squeak_above_max_per_pubkey(squeak_store, squeak_db, squeak_core,
assert mock_handle_new_squeak.call_count == 0
def test_save_secret_key(squeak_store, squeak_db, squeak_core, squeak, squeak_hash, secret_key):
def test_save_secret_key(squeak_store, squeak_db, squeak, squeak_hash, secret_key):
with mock.patch.object(squeak_db, 'get_squeak', autospec=True) as mock_get_squeak, \
mock.patch.object(squeak_db, 'set_squeak_secret_key', autospec=True) as mock_set_squeak_secret_key, \
mock.patch.object(squeak_store, 'unlock_squeak', autospec=True) as mock_unlock_squeak, \
mock.patch.object(squeak_store.new_secret_key_listener, 'handle_new_item', autospec=True) as mock_handle_new_secret_key:
mock_get_squeak.return_value = squeak
squeak_store.save_secret_key(squeak_hash, secret_key)
@ -162,21 +147,6 @@ def test_save_secret_key(squeak_store, squeak_db, squeak_core, squeak, squeak_ha
mock_set_squeak_secret_key.assert_called_once_with(
squeak_hash, secret_key)
mock_handle_new_secret_key.assert_called_once_with(squeak)
mock_unlock_squeak.assert_called_once_with(squeak_hash)
def test_unlock_squeak(squeak_store, squeak_db, squeak_core, squeak, squeak_hash, secret_key, squeak_content):
with mock.patch.object(squeak_db, 'get_squeak', autospec=True) as mock_get_squeak, \
mock.patch.object(squeak_db, 'get_squeak_secret_key', autospec=True) as mock_get_squeak_secret_key, \
mock.patch.object(squeak_db, 'set_squeak_decrypted_content', autospec=True) as mock_set_squeak_decrypted_content, \
mock.patch.object(squeak_core, 'get_decrypted_content', autospec=True) as mock_get_decrypted_content:
mock_get_squeak.return_value = squeak
mock_get_squeak_secret_key.return_value = secret_key
mock_get_decrypted_content.return_value = squeak_content
squeak_store.unlock_squeak(squeak_hash)
mock_set_squeak_decrypted_content.assert_called_once_with(
squeak_hash, squeak_content)
# @pytest.fixture
@ -245,91 +215,3 @@ def test_get_received_offer(squeak_store, squeak_db, received_offer):
assert retrieved_received_offer == received_offer
mock_get_received_offer.assert_called_once_with(789)
# def test_get_free_secret_key(squeak_store, squeak_core, unlocked_squeak, secret_key, peer_address):
# unlocked_squeak_hash = get_hash(unlocked_squeak)
# secret_key_reply = squeak_store.get_secret_key_reply(
# unlocked_squeak_hash, peer_address, 0, None)
# assert secret_key_reply.squeak_hash == unlocked_squeak_hash
# assert secret_key_reply.secret_key == secret_key
# def test_get_offer_secret_key(squeak_store, squeak_core, unlocked_squeak, secret_key, peer_address, sent_offer, offer):
# with mock.patch.object(squeak_core, 'create_offer', autospec=True) as mock_create_offer, \
# mock.patch.object(squeak_core, 'package_offer', autospec=True) as mock_package_offer:
# mock_create_offer.return_value = sent_offer
# mock_package_offer.return_value = offer
# unlocked_squeak_hash = get_hash(unlocked_squeak)
# secret_key_reply = squeak_store.get_secret_key_reply(
# unlocked_squeak_hash, peer_address, 1000, None)
# assert secret_key_reply.squeak_hash == unlocked_squeak_hash
# assert secret_key_reply.offer == offer
# def test_pay_offer(
# squeak_store,
# squeak_db,
# squeak_core,
# unlocked_squeak,
# block_header,
# squeak_content,
# secret_key,
# peer_address,
# inserted_received_offer_id,
# sent_payment,
# ):
# with mock.patch.object(squeak_core, 'pay_offer', autospec=True) as mock_pay_offer, \
# mock.patch.object(squeak_core, 'get_block_header', autospec=True) as mock_get_block_header, \
# mock.patch.object(squeak_core, 'get_decrypted_content', autospec=True) as mock_get_decrypted_content:
# mock_pay_offer.return_value = sent_payment
# mock_get_block_header.return_value = block_header
# mock_get_decrypted_content.return_value = squeak_content
# sent_payment_id = squeak_store.pay_offer(inserted_received_offer_id)
# retrieved_sent_payment = squeak_db.get_sent_payment(
# sent_payment_id,
# )
# assert sent_payment_id is not None
# assert retrieved_sent_payment is not None
# def test_save_received_offer_already_unlocked(
# squeak_store,
# unlocked_squeak,
# offer,
# peer_address,
# ):
# received_offer_id = squeak_store.save_received_offer(
# offer,
# peer_address,
# )
# assert received_offer_id is None
# def test_save_received_offer(
# squeak_store,
# squeak_db,
# squeak_core,
# saved_squeak,
# offer,
# received_offer,
# peer_address,
# ):
# with mock.patch.object(squeak_core, 'unpack_offer', autospec=True) as mock_unpack_offer:
# mock_unpack_offer.return_value = received_offer
# received_offer_id = squeak_store.save_received_offer(
# offer,
# peer_address,
# )
# assert received_offer_id is not None
# retrieved_received_offer = squeak_db.get_received_offer(received_offer_id)
# assert retrieved_received_offer == received_offer._replace(
# received_offer_id=received_offer_id,
# )