Merge pull request #3399 from lbryio/better-error-logging
Less verbose error logs, only log tracebacks for errors not defined in `lbry.error`
This commit is contained in:
commit
c109895848
4 changed files with 105 additions and 9 deletions
|
@ -61,6 +61,10 @@ Code | Name | Message
|
||||||
431 | ServerPaymentInvalidAddress | Invalid address from wallet server: '{address}' - skipping payment round.
|
431 | ServerPaymentInvalidAddress | Invalid address from wallet server: '{address}' - skipping payment round.
|
||||||
432 | ServerPaymentWalletLocked | Cannot spend funds with locked wallet, skipping payment round.
|
432 | ServerPaymentWalletLocked | Cannot spend funds with locked wallet, skipping payment round.
|
||||||
433 | ServerPaymentFeeAboveMaxAllowed | Daily server fee of {daily_fee} exceeds maximum configured of {max_fee} LBC.
|
433 | ServerPaymentFeeAboveMaxAllowed | Daily server fee of {daily_fee} exceeds maximum configured of {max_fee} LBC.
|
||||||
|
434 | WalletNotLoaded | Wallet {wallet_id} is not loaded.
|
||||||
|
435 | WalletAlreadyLoaded | Wallet {wallet_path} is already loaded.
|
||||||
|
436 | WalletNotFound | Wallet not found at {wallet_path}.
|
||||||
|
437 | WalletAlreadyExists | Wallet {wallet_path} already exists, use `wallet_add` to load it.
|
||||||
**5xx** | Blob | **Blobs**
|
**5xx** | Blob | **Blobs**
|
||||||
500 | BlobNotFound | Blob not found.
|
500 | BlobNotFound | Blob not found.
|
||||||
501 | BlobPermissionDenied | Permission denied to read blob.
|
501 | BlobPermissionDenied | Permission denied to read blob.
|
||||||
|
|
|
@ -271,6 +271,34 @@ class ServerPaymentFeeAboveMaxAllowedError(WalletError):
|
||||||
super().__init__(f"Daily server fee of {daily_fee} exceeds maximum configured of {max_fee} LBC.")
|
super().__init__(f"Daily server fee of {daily_fee} exceeds maximum configured of {max_fee} LBC.")
|
||||||
|
|
||||||
|
|
||||||
|
class WalletNotLoadedError(WalletError):
|
||||||
|
|
||||||
|
def __init__(self, wallet_id):
|
||||||
|
self.wallet_id = wallet_id
|
||||||
|
super().__init__(f"Wallet {wallet_id} is not loaded.")
|
||||||
|
|
||||||
|
|
||||||
|
class WalletAlreadyLoadedError(WalletError):
|
||||||
|
|
||||||
|
def __init__(self, wallet_path):
|
||||||
|
self.wallet_path = wallet_path
|
||||||
|
super().__init__(f"Wallet {wallet_path} is already loaded.")
|
||||||
|
|
||||||
|
|
||||||
|
class WalletNotFoundError(WalletError):
|
||||||
|
|
||||||
|
def __init__(self, wallet_path):
|
||||||
|
self.wallet_path = wallet_path
|
||||||
|
super().__init__(f"Wallet not found at {wallet_path}.")
|
||||||
|
|
||||||
|
|
||||||
|
class WalletAlreadyExistsError(WalletError):
|
||||||
|
|
||||||
|
def __init__(self, wallet_path):
|
||||||
|
self.wallet_path = wallet_path
|
||||||
|
super().__init__(f"Wallet {wallet_path} already exists, use `wallet_add` to load it.")
|
||||||
|
|
||||||
|
|
||||||
class BlobError(BaseError):
|
class BlobError(BaseError):
|
||||||
"""
|
"""
|
||||||
**Blobs**
|
**Blobs**
|
||||||
|
|
|
@ -36,7 +36,7 @@ from lbry.blob_exchange.downloader import download_blob
|
||||||
from lbry.dht.peer import make_kademlia_peer
|
from lbry.dht.peer import make_kademlia_peer
|
||||||
from lbry.error import (
|
from lbry.error import (
|
||||||
DownloadSDTimeoutError, ComponentsNotStartedError, ComponentStartConditionNotMetError,
|
DownloadSDTimeoutError, ComponentsNotStartedError, ComponentStartConditionNotMetError,
|
||||||
CommandDoesNotExistError
|
CommandDoesNotExistError, BaseError, WalletNotFoundError, WalletAlreadyLoadedError, WalletAlreadyExistsError
|
||||||
)
|
)
|
||||||
from lbry.extras import system_info
|
from lbry.extras import system_info
|
||||||
from lbry.extras.daemon import analytics
|
from lbry.extras.daemon import analytics
|
||||||
|
@ -702,7 +702,10 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
raise
|
raise
|
||||||
except Exception as e: # pylint: disable=broad-except
|
except Exception as e: # pylint: disable=broad-except
|
||||||
self.failed_request_metric.labels(method=function_name).inc()
|
self.failed_request_metric.labels(method=function_name).inc()
|
||||||
|
if not isinstance(e, BaseError):
|
||||||
log.exception("error handling api request")
|
log.exception("error handling api request")
|
||||||
|
else:
|
||||||
|
log.error("error handling api request: %s", e)
|
||||||
return JSONRPCError.create_command_exception(
|
return JSONRPCError.create_command_exception(
|
||||||
command=function_name, args=_args, kwargs=_kwargs, exception=e, traceback=format_exc()
|
command=function_name, args=_args, kwargs=_kwargs, exception=e, traceback=format_exc()
|
||||||
)
|
)
|
||||||
|
@ -1107,6 +1110,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
if not stream:
|
if not stream:
|
||||||
raise DownloadSDTimeoutError(uri)
|
raise DownloadSDTimeoutError(uri)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
log.warning("Error downloading %s: %s", uri, str(e))
|
log.warning("Error downloading %s: %s", uri, str(e))
|
||||||
return {"error": str(e)}
|
return {"error": str(e)}
|
||||||
return stream
|
return stream
|
||||||
|
@ -1273,9 +1277,9 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
wallet_path = os.path.join(self.conf.wallet_dir, 'wallets', wallet_id)
|
wallet_path = os.path.join(self.conf.wallet_dir, 'wallets', wallet_id)
|
||||||
for wallet in self.wallet_manager.wallets:
|
for wallet in self.wallet_manager.wallets:
|
||||||
if wallet.id == wallet_id:
|
if wallet.id == wallet_id:
|
||||||
raise Exception(f"Wallet at path '{wallet_path}' already exists and is loaded.")
|
raise WalletAlreadyLoadedError(wallet_path)
|
||||||
if os.path.exists(wallet_path):
|
if os.path.exists(wallet_path):
|
||||||
raise Exception(f"Wallet at path '{wallet_path}' already exists, use 'wallet_add' to load wallet.")
|
raise WalletAlreadyExistsError(wallet_path)
|
||||||
|
|
||||||
wallet = self.wallet_manager.import_wallet(wallet_path)
|
wallet = self.wallet_manager.import_wallet(wallet_path)
|
||||||
if not wallet.accounts and create_account:
|
if not wallet.accounts and create_account:
|
||||||
|
@ -1308,9 +1312,9 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
wallet_path = os.path.join(self.conf.wallet_dir, 'wallets', wallet_id)
|
wallet_path = os.path.join(self.conf.wallet_dir, 'wallets', wallet_id)
|
||||||
for wallet in self.wallet_manager.wallets:
|
for wallet in self.wallet_manager.wallets:
|
||||||
if wallet.id == wallet_id:
|
if wallet.id == wallet_id:
|
||||||
raise Exception(f"Wallet at path '{wallet_path}' is already loaded.")
|
raise WalletAlreadyLoadedError(wallet_path)
|
||||||
if not os.path.exists(wallet_path):
|
if not os.path.exists(wallet_path):
|
||||||
raise Exception(f"Wallet at path '{wallet_path}' was not found.")
|
raise WalletNotFoundError(wallet_path)
|
||||||
wallet = self.wallet_manager.import_wallet(wallet_path)
|
wallet = self.wallet_manager.import_wallet(wallet_path)
|
||||||
if self.ledger.network.is_connected:
|
if self.ledger.network.is_connected:
|
||||||
for account in wallet.accounts:
|
for account in wallet.accounts:
|
||||||
|
@ -1495,7 +1499,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Unsupported address: '{address}'")
|
raise ValueError(f"Unsupported address: '{address}'") # TODO: use error from lbry.error
|
||||||
|
|
||||||
tx = await Transaction.create(
|
tx = await Transaction.create(
|
||||||
[], outputs, accounts, account
|
[], outputs, accounts, account
|
||||||
|
@ -1773,8 +1777,10 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
from_account = wallet.get_account_or_default(from_account)
|
from_account = wallet.get_account_or_default(from_account)
|
||||||
amount = self.get_dewies_or_error('amount', amount) if amount else None
|
amount = self.get_dewies_or_error('amount', amount) if amount else None
|
||||||
if not isinstance(outputs, int):
|
if not isinstance(outputs, int):
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError("--outputs must be an integer.")
|
raise ValueError("--outputs must be an integer.")
|
||||||
if everything and outputs > 1:
|
if everything and outputs > 1:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError("Using --everything along with --outputs is not supported.")
|
raise ValueError("Using --everything along with --outputs is not supported.")
|
||||||
return from_account.fund(
|
return from_account.fund(
|
||||||
to_account=to_account, amount=amount, everything=everything,
|
to_account=to_account, amount=amount, everything=everything,
|
||||||
|
@ -2045,10 +2051,12 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if status not in ['start', 'stop']:
|
if status not in ['start', 'stop']:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Status must be "start" or "stop".')
|
raise Exception('Status must be "start" or "stop".')
|
||||||
|
|
||||||
streams = self.file_manager.get_filtered(**kwargs)
|
streams = self.file_manager.get_filtered(**kwargs)
|
||||||
if not streams:
|
if not streams:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f'Unable to find a file for {kwargs}')
|
raise Exception(f'Unable to find a file for {kwargs}')
|
||||||
stream = streams[0]
|
stream = streams[0]
|
||||||
if status == 'start' and not stream.running:
|
if status == 'start' and not stream.running:
|
||||||
|
@ -2231,20 +2239,25 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
if claim_id:
|
if claim_id:
|
||||||
txo = await self.ledger.get_claim_by_claim_id(accounts, claim_id, include_purchase_receipt=True)
|
txo = await self.ledger.get_claim_by_claim_id(accounts, claim_id, include_purchase_receipt=True)
|
||||||
if not isinstance(txo, Output) or not txo.is_claim:
|
if not isinstance(txo, Output) or not txo.is_claim:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"Could not find claim with claim_id '{claim_id}'. ")
|
raise Exception(f"Could not find claim with claim_id '{claim_id}'. ")
|
||||||
elif url:
|
elif url:
|
||||||
txo = (await self.ledger.resolve(accounts, [url], include_purchase_receipt=True))[url]
|
txo = (await self.ledger.resolve(accounts, [url], include_purchase_receipt=True))[url]
|
||||||
if not isinstance(txo, Output) or not txo.is_claim:
|
if not isinstance(txo, Output) or not txo.is_claim:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"Could not find claim with url '{url}'. ")
|
raise Exception(f"Could not find claim with url '{url}'. ")
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"Missing argument claim_id or url. ")
|
raise Exception(f"Missing argument claim_id or url. ")
|
||||||
if not allow_duplicate_purchase and txo.purchase_receipt:
|
if not allow_duplicate_purchase and txo.purchase_receipt:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"You already have a purchase for claim_id '{claim_id}'. "
|
f"You already have a purchase for claim_id '{claim_id}'. "
|
||||||
f"Use --allow-duplicate-purchase flag to override."
|
f"Use --allow-duplicate-purchase flag to override."
|
||||||
)
|
)
|
||||||
claim = txo.claim
|
claim = txo.claim
|
||||||
if not claim.is_stream or not claim.stream.has_fee:
|
if not claim.is_stream or not claim.stream.has_fee:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"Claim '{claim_id}' does not have a purchase price.")
|
raise Exception(f"Claim '{claim_id}' does not have a purchase price.")
|
||||||
tx = await self.wallet_manager.create_purchase_transaction(
|
tx = await self.wallet_manager.create_purchase_transaction(
|
||||||
accounts, txo, self.exchange_rate_manager, override_max_key_fee
|
accounts, txo, self.exchange_rate_manager, override_max_key_fee
|
||||||
|
@ -2486,6 +2499,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
if "claim_ids" in kwargs and not kwargs["claim_ids"]:
|
if "claim_ids" in kwargs and not kwargs["claim_ids"]:
|
||||||
kwargs.pop("claim_ids")
|
kwargs.pop("claim_ids")
|
||||||
if {'claim_id', 'claim_ids'}.issubset(kwargs):
|
if {'claim_id', 'claim_ids'}.issubset(kwargs):
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError("Only 'claim_id' or 'claim_ids' is allowed, not both.")
|
raise ValueError("Only 'claim_id' or 'claim_ids' is allowed, not both.")
|
||||||
if kwargs.pop('valid_channel_signature', False):
|
if kwargs.pop('valid_channel_signature', False):
|
||||||
kwargs['signature_valid'] = 1
|
kwargs['signature_valid'] = 1
|
||||||
|
@ -2605,6 +2619,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
existing_channels = await self.ledger.get_channels(accounts=wallet.accounts, claim_name=name)
|
existing_channels = await self.ledger.get_channels(accounts=wallet.accounts, claim_name=name)
|
||||||
if len(existing_channels) > 0:
|
if len(existing_channels) > 0:
|
||||||
if not allow_duplicate_name:
|
if not allow_duplicate_name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"You already have a channel under the name '{name}'. "
|
f"You already have a channel under the name '{name}'. "
|
||||||
f"Use --allow-duplicate-name flag to override."
|
f"Use --allow-duplicate-name flag to override."
|
||||||
|
@ -2737,11 +2752,13 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
)
|
)
|
||||||
if len(existing_channels) != 1:
|
if len(existing_channels) != 1:
|
||||||
account_ids = ', '.join(f"'{account.id}'" for account in accounts)
|
account_ids = ', '.join(f"'{account.id}'" for account in accounts)
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"Can't find the channel '{claim_id}' in account(s) {account_ids}."
|
f"Can't find the channel '{claim_id}' in account(s) {account_ids}."
|
||||||
)
|
)
|
||||||
old_txo = existing_channels[0]
|
old_txo = existing_channels[0]
|
||||||
if not old_txo.claim.is_channel:
|
if not old_txo.claim.is_channel:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"A claim with id '{claim_id}' was found but it is not a channel."
|
f"A claim with id '{claim_id}' was found but it is not a channel."
|
||||||
)
|
)
|
||||||
|
@ -2864,9 +2881,11 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
wallet=wallet, accounts=accounts, claim_id=claim_id
|
wallet=wallet, accounts=accounts, claim_id=claim_id
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Must specify claim_id, or txid and nout')
|
raise Exception('Must specify claim_id, or txid and nout')
|
||||||
|
|
||||||
if not claims:
|
if not claims:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('No claim found for the specified claim_id or txid:nout')
|
raise Exception('No claim found for the specified claim_id or txid:nout')
|
||||||
|
|
||||||
tx = await Transaction.create(
|
tx = await Transaction.create(
|
||||||
|
@ -2935,6 +2954,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
address = channel.get_address(self.ledger)
|
address = channel.get_address(self.ledger)
|
||||||
public_key = await self.ledger.get_public_key_for_address(wallet, address)
|
public_key = await self.ledger.get_public_key_for_address(wallet, address)
|
||||||
if not public_key:
|
if not public_key:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("Can't find public key for address holding the channel.")
|
raise Exception("Can't find public key for address holding the channel.")
|
||||||
export = {
|
export = {
|
||||||
'name': channel.claim_name,
|
'name': channel.claim_name,
|
||||||
|
@ -2996,6 +3016,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
await self.ledger._update_tasks.done.wait()
|
await self.ledger._update_tasks.done.wait()
|
||||||
# Case 3: the holding address has changed and we can't create or find an account for it
|
# Case 3: the holding address has changed and we can't create or find an account for it
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"Channel owning account has changed since the channel was exported and "
|
"Channel owning account has changed since the channel was exported and "
|
||||||
"it is not an account to which you have access."
|
"it is not an account to which you have access."
|
||||||
|
@ -3121,11 +3142,13 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
)
|
)
|
||||||
if len(claims) == 0:
|
if len(claims) == 0:
|
||||||
if 'bid' not in kwargs:
|
if 'bid' not in kwargs:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("'bid' is a required argument for new publishes.")
|
raise Exception("'bid' is a required argument for new publishes.")
|
||||||
return await self.jsonrpc_stream_create(name, **kwargs)
|
return await self.jsonrpc_stream_create(name, **kwargs)
|
||||||
elif len(claims) == 1:
|
elif len(claims) == 1:
|
||||||
assert claims[0].claim.is_stream, f"Claim at name '{name}' is not a stream claim."
|
assert claims[0].claim.is_stream, f"Claim at name '{name}' is not a stream claim."
|
||||||
return await self.jsonrpc_stream_update(claims[0].claim_id, replace=True, **kwargs)
|
return await self.jsonrpc_stream_update(claims[0].claim_id, replace=True, **kwargs)
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"There are {len(claims)} claims for '{name}', please use 'stream update' command "
|
f"There are {len(claims)} claims for '{name}', please use 'stream update' command "
|
||||||
f"to update a specific stream claim."
|
f"to update a specific stream claim."
|
||||||
|
@ -3177,11 +3200,13 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
claims = await account.get_claims(claim_name=name)
|
claims = await account.get_claims(claim_name=name)
|
||||||
if len(claims) > 0:
|
if len(claims) > 0:
|
||||||
if not allow_duplicate_name:
|
if not allow_duplicate_name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"You already have a stream claim published under the name '{name}'. "
|
f"You already have a stream claim published under the name '{name}'. "
|
||||||
f"Use --allow-duplicate-name flag to override."
|
f"Use --allow-duplicate-name flag to override."
|
||||||
)
|
)
|
||||||
if not VALID_FULL_CLAIM_ID.fullmatch(claim_id):
|
if not VALID_FULL_CLAIM_ID.fullmatch(claim_id):
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Invalid claim id. It is expected to be a 40 characters long hexadecimal string.')
|
raise Exception('Invalid claim id. It is expected to be a 40 characters long hexadecimal string.')
|
||||||
|
|
||||||
claim = Claim()
|
claim = Claim()
|
||||||
|
@ -3325,6 +3350,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
claims = await account.get_claims(claim_name=name)
|
claims = await account.get_claims(claim_name=name)
|
||||||
if len(claims) > 0:
|
if len(claims) > 0:
|
||||||
if not allow_duplicate_name:
|
if not allow_duplicate_name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"You already have a stream claim published under the name '{name}'. "
|
f"You already have a stream claim published under the name '{name}'. "
|
||||||
f"Use --allow-duplicate-name flag to override."
|
f"Use --allow-duplicate-name flag to override."
|
||||||
|
@ -3508,11 +3534,13 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
)
|
)
|
||||||
if len(existing_claims) != 1:
|
if len(existing_claims) != 1:
|
||||||
account_ids = ', '.join(f"'{account.id}'" for account in accounts)
|
account_ids = ', '.join(f"'{account.id}'" for account in accounts)
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"Can't find the stream '{claim_id}' in account(s) {account_ids}."
|
f"Can't find the stream '{claim_id}' in account(s) {account_ids}."
|
||||||
)
|
)
|
||||||
old_txo = existing_claims[0]
|
old_txo = existing_claims[0]
|
||||||
if not old_txo.claim.is_stream:
|
if not old_txo.claim.is_stream:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"A claim with id '{claim_id}' was found but it is not a stream claim."
|
f"A claim with id '{claim_id}' was found but it is not a stream claim."
|
||||||
)
|
)
|
||||||
|
@ -3640,9 +3668,11 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
wallet=wallet, accounts=accounts, claim_id=claim_id
|
wallet=wallet, accounts=accounts, claim_id=claim_id
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Must specify claim_id, or txid and nout')
|
raise Exception('Must specify claim_id, or txid and nout')
|
||||||
|
|
||||||
if not claims:
|
if not claims:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('No claim found for the specified claim_id or txid:nout')
|
raise Exception('No claim found for the specified claim_id or txid:nout')
|
||||||
|
|
||||||
tx = await Transaction.create(
|
tx = await Transaction.create(
|
||||||
|
@ -3804,6 +3834,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
existing_collections = await self.ledger.get_collections(accounts=wallet.accounts, claim_name=name)
|
existing_collections = await self.ledger.get_collections(accounts=wallet.accounts, claim_name=name)
|
||||||
if len(existing_collections) > 0:
|
if len(existing_collections) > 0:
|
||||||
if not allow_duplicate_name:
|
if not allow_duplicate_name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"You already have a collection under the name '{name}'. "
|
f"You already have a collection under the name '{name}'. "
|
||||||
f"Use --allow-duplicate-name flag to override."
|
f"Use --allow-duplicate-name flag to override."
|
||||||
|
@ -3927,11 +3958,13 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
)
|
)
|
||||||
if len(existing_collections) != 1:
|
if len(existing_collections) != 1:
|
||||||
account_ids = ', '.join(f"'{account.id}'" for account in accounts)
|
account_ids = ', '.join(f"'{account.id}'" for account in accounts)
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"Can't find the collection '{claim_id}' in account(s) {account_ids}."
|
f"Can't find the collection '{claim_id}' in account(s) {account_ids}."
|
||||||
)
|
)
|
||||||
old_txo = existing_collections[0]
|
old_txo = existing_collections[0]
|
||||||
if not old_txo.claim.is_collection:
|
if not old_txo.claim.is_collection:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"A claim with id '{claim_id}' was found but it is not a collection."
|
f"A claim with id '{claim_id}' was found but it is not a collection."
|
||||||
)
|
)
|
||||||
|
@ -4057,12 +4090,15 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
if claim_id:
|
if claim_id:
|
||||||
txo = await self.ledger.get_claim_by_claim_id(wallet.accounts, claim_id)
|
txo = await self.ledger.get_claim_by_claim_id(wallet.accounts, claim_id)
|
||||||
if not isinstance(txo, Output) or not txo.is_claim:
|
if not isinstance(txo, Output) or not txo.is_claim:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"Could not find collection with claim_id '{claim_id}'. ")
|
raise Exception(f"Could not find collection with claim_id '{claim_id}'. ")
|
||||||
elif url:
|
elif url:
|
||||||
txo = (await self.ledger.resolve(wallet.accounts, [url]))[url]
|
txo = (await self.ledger.resolve(wallet.accounts, [url]))[url]
|
||||||
if not isinstance(txo, Output) or not txo.is_claim:
|
if not isinstance(txo, Output) or not txo.is_claim:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"Could not find collection with url '{url}'. ")
|
raise Exception(f"Could not find collection with url '{url}'. ")
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"Missing argument claim_id or url. ")
|
raise Exception(f"Missing argument claim_id or url. ")
|
||||||
|
|
||||||
page_num, page_size = abs(page), min(abs(page_size), 50)
|
page_num, page_size = abs(page), min(abs(page_size), 50)
|
||||||
|
@ -4237,9 +4273,11 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
wallet=wallet, accounts=accounts, claim_id=claim_id
|
wallet=wallet, accounts=accounts, claim_id=claim_id
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Must specify claim_id, or txid and nout')
|
raise Exception('Must specify claim_id, or txid and nout')
|
||||||
|
|
||||||
if not supports:
|
if not supports:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('No supports found for the specified claim_id or txid:nout')
|
raise Exception('No supports found for the specified claim_id or txid:nout')
|
||||||
|
|
||||||
if keep is not None:
|
if keep is not None:
|
||||||
|
@ -4474,6 +4512,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
elif order_by in ('height', 'amount', 'none'):
|
elif order_by in ('height', 'amount', 'none'):
|
||||||
constraints['order_by'] = order_by
|
constraints['order_by'] = order_by
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError(f"'{order_by}' is not a valid --order_by value.")
|
raise ValueError(f"'{order_by}' is not a valid --order_by value.")
|
||||||
self._constrain_txo_from_kwargs(constraints, **kwargs)
|
self._constrain_txo_from_kwargs(constraints, **kwargs)
|
||||||
return paginate_rows(claims, None if no_totals else claim_count, page, page_size, **constraints)
|
return paginate_rows(claims, None if no_totals else claim_count, page, page_size, **constraints)
|
||||||
|
@ -4780,10 +4819,12 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not is_valid_blobhash(blob_hash):
|
if not is_valid_blobhash(blob_hash):
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("invalid blob hash")
|
raise Exception("invalid blob hash")
|
||||||
if search_bottom_out_limit is not None:
|
if search_bottom_out_limit is not None:
|
||||||
search_bottom_out_limit = int(search_bottom_out_limit)
|
search_bottom_out_limit = int(search_bottom_out_limit)
|
||||||
if search_bottom_out_limit <= 0:
|
if search_bottom_out_limit <= 0:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("invalid bottom out limit")
|
raise Exception("invalid bottom out limit")
|
||||||
else:
|
else:
|
||||||
search_bottom_out_limit = 4
|
search_bottom_out_limit = 4
|
||||||
|
@ -4827,12 +4868,14 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
blob_hashes.append(blob_hash)
|
blob_hashes.append(blob_hash)
|
||||||
elif stream_hash or sd_hash:
|
elif stream_hash or sd_hash:
|
||||||
if sd_hash and stream_hash:
|
if sd_hash and stream_hash:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("either the sd hash or the stream hash should be provided, not both")
|
raise Exception("either the sd hash or the stream hash should be provided, not both")
|
||||||
if sd_hash:
|
if sd_hash:
|
||||||
stream_hash = await self.storage.get_stream_hash_for_sd_hash(sd_hash)
|
stream_hash = await self.storage.get_stream_hash_for_sd_hash(sd_hash)
|
||||||
blobs = await self.storage.get_blobs_for_stream(stream_hash, only_completed=True)
|
blobs = await self.storage.get_blobs_for_stream(stream_hash, only_completed=True)
|
||||||
blob_hashes.extend(blob.blob_hash for blob in blobs if blob.blob_hash is not None)
|
blob_hashes.extend(blob.blob_hash for blob in blobs if blob.blob_hash is not None)
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('single argument must be specified')
|
raise Exception('single argument must be specified')
|
||||||
await self.storage.should_single_announce_blobs(blob_hashes, immediate=True)
|
await self.storage.should_single_announce_blobs(blob_hashes, immediate=True)
|
||||||
return True
|
return True
|
||||||
|
@ -5099,6 +5142,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
if not tracemalloc.is_tracing():
|
if not tracemalloc.is_tracing():
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("Enable tracemalloc first! See 'tracemalloc set' command.")
|
raise Exception("Enable tracemalloc first! See 'tracemalloc set' command.")
|
||||||
stats = tracemalloc.take_snapshot().filter_traces((
|
stats = tracemalloc.take_snapshot().filter_traces((
|
||||||
tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
|
tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
|
||||||
|
@ -5308,6 +5352,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
comment_id=comment_id
|
comment_id=comment_id
|
||||||
)
|
)
|
||||||
if 'error' in channel:
|
if 'error' in channel:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError(channel['error'])
|
raise ValueError(channel['error'])
|
||||||
|
|
||||||
wallet = self.wallet_manager.get_wallet_or_default(wallet_id)
|
wallet = self.wallet_manager.get_wallet_or_default(wallet_id)
|
||||||
|
@ -5564,51 +5609,64 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
allow_script_address and self.ledger.is_script_address(address)
|
allow_script_address and self.ledger.is_script_address(address)
|
||||||
)
|
)
|
||||||
except:
|
except:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"'{address}' is not a valid address")
|
raise Exception(f"'{address}' is not a valid address")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def valid_stream_name_or_error(name: str):
|
def valid_stream_name_or_error(name: str):
|
||||||
try:
|
try:
|
||||||
if not name:
|
if not name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Stream name cannot be blank.')
|
raise Exception('Stream name cannot be blank.')
|
||||||
parsed = URL.parse(name)
|
parsed = URL.parse(name)
|
||||||
if parsed.has_channel:
|
if parsed.has_channel:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"Stream names cannot start with '@' symbol. This is reserved for channels claims."
|
"Stream names cannot start with '@' symbol. This is reserved for channels claims."
|
||||||
)
|
)
|
||||||
if not parsed.has_stream or parsed.stream.name != name:
|
if not parsed.has_stream or parsed.stream.name != name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Stream name has invalid characters.')
|
raise Exception('Stream name has invalid characters.')
|
||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("Invalid stream name.")
|
raise Exception("Invalid stream name.")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def valid_collection_name_or_error(name: str):
|
def valid_collection_name_or_error(name: str):
|
||||||
try:
|
try:
|
||||||
if not name:
|
if not name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Collection name cannot be blank.')
|
raise Exception('Collection name cannot be blank.')
|
||||||
parsed = URL.parse(name)
|
parsed = URL.parse(name)
|
||||||
if parsed.has_channel:
|
if parsed.has_channel:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"Collection names cannot start with '@' symbol. This is reserved for channels claims."
|
"Collection names cannot start with '@' symbol. This is reserved for channels claims."
|
||||||
)
|
)
|
||||||
if not parsed.has_stream or parsed.stream.name != name:
|
if not parsed.has_stream or parsed.stream.name != name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception('Collection name has invalid characters.')
|
raise Exception('Collection name has invalid characters.')
|
||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("Invalid collection name.")
|
raise Exception("Invalid collection name.")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def valid_channel_name_or_error(name: str):
|
def valid_channel_name_or_error(name: str):
|
||||||
try:
|
try:
|
||||||
if not name:
|
if not name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"Channel name cannot be blank."
|
"Channel name cannot be blank."
|
||||||
)
|
)
|
||||||
parsed = URL.parse(name)
|
parsed = URL.parse(name)
|
||||||
if not parsed.has_channel:
|
if not parsed.has_channel:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("Channel names must start with '@' symbol.")
|
raise Exception("Channel names must start with '@' symbol.")
|
||||||
if parsed.channel.name != name:
|
if parsed.channel.name != name:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("Channel name has invalid character")
|
raise Exception("Channel name has invalid character")
|
||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception("Invalid channel name.")
|
raise Exception("Invalid channel name.")
|
||||||
|
|
||||||
def get_fee_address(self, kwargs: dict, claim_address: str) -> str:
|
def get_fee_address(self, kwargs: dict, claim_address: str) -> str:
|
||||||
|
@ -5640,6 +5698,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
elif channel_name:
|
elif channel_name:
|
||||||
key, value = 'name', channel_name
|
key, value = 'name', channel_name
|
||||||
else:
|
else:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError("Couldn't find channel because a channel_id or channel_name was not provided.")
|
raise ValueError("Couldn't find channel because a channel_id or channel_name was not provided.")
|
||||||
channels = await self.ledger.get_channels(
|
channels = await self.ledger.get_channels(
|
||||||
wallet=wallet, accounts=wallet.get_accounts_or_all(account_ids),
|
wallet=wallet, accounts=wallet.get_accounts_or_all(account_ids),
|
||||||
|
@ -5647,13 +5706,16 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
)
|
)
|
||||||
if len(channels) == 1:
|
if len(channels) == 1:
|
||||||
if for_signing and not channels[0].has_private_key:
|
if for_signing and not channels[0].has_private_key:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise Exception(f"Couldn't find private key for {key} '{value}'. ")
|
raise Exception(f"Couldn't find private key for {key} '{value}'. ")
|
||||||
return channels[0]
|
return channels[0]
|
||||||
elif len(channels) > 1:
|
elif len(channels) > 1:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Multiple channels found with channel_{key} '{value}', "
|
f"Multiple channels found with channel_{key} '{value}', "
|
||||||
f"pass a channel_id to narrow it down."
|
f"pass a channel_id to narrow it down."
|
||||||
)
|
)
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError(f"Couldn't find channel with channel_{key} '{value}'.")
|
raise ValueError(f"Couldn't find channel with channel_{key} '{value}'.")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -5661,9 +5723,11 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
try:
|
try:
|
||||||
dewies = lbc_to_dewies(lbc)
|
dewies = lbc_to_dewies(lbc)
|
||||||
if positive_value and dewies <= 0:
|
if positive_value and dewies <= 0:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError(f"'{argument}' value must be greater than 0.0")
|
raise ValueError(f"'{argument}' value must be greater than 0.0")
|
||||||
return dewies
|
return dewies
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
|
# TODO: use error from lbry.error
|
||||||
raise ValueError(f"Invalid value for '{argument}': {e.args[0]}")
|
raise ValueError(f"Invalid value for '{argument}': {e.args[0]}")
|
||||||
|
|
||||||
async def resolve(self, accounts, urls, **kwargs):
|
async def resolve(self, accounts, urls, **kwargs):
|
||||||
|
|
|
@ -7,7 +7,7 @@ from binascii import unhexlify
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from typing import List, Type, MutableSequence, MutableMapping, Optional
|
from typing import List, Type, MutableSequence, MutableMapping, Optional
|
||||||
|
|
||||||
from lbry.error import KeyFeeAboveMaxAllowedError
|
from lbry.error import KeyFeeAboveMaxAllowedError, WalletNotLoadedError
|
||||||
from lbry.conf import Config, NOT_SET
|
from lbry.conf import Config, NOT_SET
|
||||||
|
|
||||||
from .dewies import dewies_to_lbc
|
from .dewies import dewies_to_lbc
|
||||||
|
@ -95,7 +95,7 @@ class WalletManager:
|
||||||
for wallet in self.wallets:
|
for wallet in self.wallets:
|
||||||
if wallet.id == wallet_id:
|
if wallet.id == wallet_id:
|
||||||
return wallet
|
return wallet
|
||||||
raise ValueError(f"Couldn't find wallet: {wallet_id}.")
|
raise WalletNotLoadedError(wallet_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_balance(wallet):
|
def get_balance(wallet):
|
||||||
|
|
Loading…
Reference in a new issue