diff --git a/nostr_dvm/utils/database_utils.py b/nostr_dvm/utils/database_utils.py index 8c45b2c..a04c093 100644 --- a/nostr_dvm/utils/database_utils.py +++ b/nostr_dvm/utils/database_utils.py @@ -1,18 +1,14 @@ # DATABASE LOGIC import json import sqlite3 - -from sqlite3 import Error from dataclasses import dataclass -from datetime import timedelta from logging import Filter +from sqlite3 import Error - -from nostr_sdk import Timestamp, Keys, PublicKey, EventBuilder, Filter, Kind +from nostr_sdk import Timestamp, Keys, PublicKey, Filter, Kind from nostr_dvm.utils.definitions import relay_timeout - -from nostr_dvm.utils.nostr_utils import send_event, send_nip04_dm +from nostr_dvm.utils.nostr_utils import send_nip04_dm @dataclass @@ -190,17 +186,15 @@ async def update_user_balance(db, npub, additional_sats, client, config, giftwra if config is not None: keys = Keys.parse(config.PRIVATE_KEY) - # time.sleep(1.0) message = ("Added " + str(additional_sats) + " Sats to balance. New balance is " + str( new_balance) + " Sats.") - if giftwrap: - await client.send_private_msg(PublicKey.parse(npub), message, None) - else: - #await client.send_direct_msg(PublicKey.parse(npub), message, None) - #await client.send_private_msg(PublicKey.parse(npub), message, None) - await send_nip04_dm(client, message, PublicKey.parse(npub), config) + # always send giftwrapped. sorry not sorry. + #if giftwrap: + await client.send_private_msg(PublicKey.parse(npub), message, None) + #else: + # await send_nip04_dm(client, message, PublicKey.parse(npub), config) def update_user_subscription(npub, subscribed_until, client, dvm_config): diff --git a/nostr_dvm/utils/definitions.py b/nostr_dvm/utils/definitions.py index 3d3e541..bf15e44 100644 --- a/nostr_dvm/utils/definitions.py +++ b/nostr_dvm/utils/definitions.py @@ -1,4 +1,3 @@ -import os from dataclasses import dataclass from datetime import timedelta @@ -63,7 +62,6 @@ class EventDefinitions: KIND_NIP88_TIER_EVENT = Kind(37001) KIND_NUT_WALLET = Kind(37375) - ANY_RESULT = [KIND_NIP90_RESULT_EXTRACT_TEXT, KIND_NIP90_RESULT_SUMMARIZE_TEXT, KIND_NIP90_RESULT_TRANSLATE_TEXT, @@ -97,6 +95,7 @@ class RequiredJobToWatch: event: Event timestamp: int + @dataclass class InvoiceToWatch: sender: str @@ -108,4 +107,4 @@ class InvoiceToWatch: relay_timeout = EventSource.relays(timedelta(seconds=5)) -relay_timeout_long = EventSource.relays(timedelta(seconds=10)) \ No newline at end of file +relay_timeout_long = EventSource.relays(timedelta(seconds=10)) diff --git a/nostr_dvm/utils/dvmconfig.py b/nostr_dvm/utils/dvmconfig.py index 2598d4b..eea1d05 100644 --- a/nostr_dvm/utils/dvmconfig.py +++ b/nostr_dvm/utils/dvmconfig.py @@ -1,6 +1,6 @@ import os -from nostr_sdk import Keys, LogLevel, PublicKey +from nostr_sdk import Keys, LogLevel from nostr_dvm.utils.nip88_utils import NIP88Config from nostr_dvm.utils.nip89_utils import NIP89Config @@ -8,6 +8,7 @@ from nostr_dvm.utils.nostr_utils import check_and_set_private_key from nostr_dvm.utils.outbox_utils import AVOID_OUTBOX_RELAY_LIST from nostr_dvm.utils.zap_utils import check_and_set_ln_bits_keys + class DVMConfig: SUPPORTED_DVMS = [] PRIVATE_KEY: str = "" @@ -21,24 +22,22 @@ class DVMConfig: ] RECONCILE_DB_RELAY_LIST = ["wss://relay.damus.io", "wss://nostr.oxtr.dev", - "wss://relay.nostr.net" , "wss://relay.primal.net"] + "wss://relay.nostr.net", "wss://relay.primal.net"] # Straight Censorship (reply guy spam) WOT_FILTERING = False WOT_BASED_ON_NPUBS = ["99bb5591c9116600f845107d31f9b59e2f7c7e09a1ff802e84f1d43da557ca64", - "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", - "3f770d65d3a764a9c5cb503ae123e62ec7598ad035d836e2a810f3877a745b24" - ] + "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", + "3f770d65d3a764a9c5cb503ae123e62ec7598ad035d836e2a810f3877a745b24" + ] WOT_DEPTH = 2 - AVOID_PAID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST - #If a DVM has a paid subscription, overwrite list without the paid one. - + # If a DVM has a paid subscription, overwrite list without the paid one. RELAY_TIMEOUT = 5 RELAY_LONG_TIMEOUT = 30 - EXTERNAL_POST_PROCESS_TYPE = 0 # Leave this on None, except the DVM is external + EXTERNAL_POST_PROCESS_TYPE = 0 # Leave this on None, except the DVM is external LNBITS_INVOICE_KEY = '' # Will all automatically generated by default, or read from .env LNBITS_ADMIN_KEY = '' # In order to pay invoices, e.g. from the bot to DVMs, or reimburse users. LNBITS_URL = 'https://lnbits.com' diff --git a/nostr_dvm/utils/external_dvm_utils.py b/nostr_dvm/utils/external_dvm_utils.py index e021603..035a5ca 100644 --- a/nostr_dvm/utils/external_dvm_utils.py +++ b/nostr_dvm/utils/external_dvm_utils.py @@ -24,7 +24,7 @@ async def build_client(config): def build_external_dvm(pubkey, task, kind, fix_cost, per_unit_cost, config, - external_post_process=PostProcessFunctionType.NONE): + external_post_process=PostProcessFunctionType.NONE): dvm_config = DVMConfig() dvm_config.PUBLIC_KEY = PublicKey.from_hex(pubkey).to_hex() dvm_config.FIX_COST = fix_cost diff --git a/nostr_dvm/utils/gallery_utils.py b/nostr_dvm/utils/gallery_utils.py index 634560d..a62b00b 100644 --- a/nostr_dvm/utils/gallery_utils.py +++ b/nostr_dvm/utils/gallery_utils.py @@ -1,15 +1,15 @@ -from nostr_sdk import Tag, Keys, EventBuilder, Kind +from nostr_sdk import Keys, EventBuilder, Kind from nostr_dvm.utils.nostr_utils import send_event from nostr_dvm.utils.print_utils import bcolors async def gallery_announce_list(tags, dvm_config, client): - - keys = Keys.parse(dvm_config.NIP89.PK) content = "" event = EventBuilder(Kind(10011), content, tags).to_event(keys) eventid = await send_event(event, client=client, dvm_config=dvm_config, blastr=True) - print(bcolors.BLUE + "[" + dvm_config.NIP89.NAME + "] Announced Gallery for " + dvm_config.NIP89.NAME +" (EventID: " + str(eventid.to_hex()) +")" + bcolors.ENDC) + print( + bcolors.BLUE + "[" + dvm_config.NIP89.NAME + "] Announced Gallery for " + dvm_config.NIP89.NAME + " (EventID: " + str( + eventid.to_hex()) + ")" + bcolors.ENDC) diff --git a/nostr_dvm/utils/mediasource_utils.py b/nostr_dvm/utils/mediasource_utils.py index f6f2c7f..f8157f1 100644 --- a/nostr_dvm/utils/mediasource_utils.py +++ b/nostr_dvm/utils/mediasource_utils.py @@ -2,9 +2,10 @@ import os import urllib from datetime import time from urllib.parse import urlparse -import ffmpegio +import ffmpegio import requests + from nostr_dvm.utils.nostr_utils import get_event_by_id from nostr_dvm.utils.scrapper.media_scrapper import YTDownload, get_media_duration diff --git a/nostr_dvm/utils/nut_wallet_utils.py b/nostr_dvm/utils/nut_wallet_utils.py index c998da0..49c90b1 100644 --- a/nostr_dvm/utils/nut_wallet_utils.py +++ b/nostr_dvm/utils/nut_wallet_utils.py @@ -5,14 +5,15 @@ from collections import namedtuple from datetime import timedelta import requests +from nostr_sdk import Tag, Keys, nip44_encrypt, nip44_decrypt, Nip44Version, EventBuilder, Client, Filter, Kind, \ + EventId, nip04_decrypt, nip04_encrypt, Options, NostrSigner, PublicKey, Metadata + from nostr_dvm.utils.database_utils import fetch_user_metadata from nostr_dvm.utils.definitions import EventDefinitions, relay_timeout, relay_timeout_long from nostr_dvm.utils.dvmconfig import DVMConfig from nostr_dvm.utils.nostr_utils import check_and_set_private_key -from nostr_dvm.utils.zap_utils import pay_bolt11_ln_bits, zaprequest -from nostr_sdk import Tag, Keys, nip44_encrypt, nip44_decrypt, Nip44Version, EventBuilder, Client, Filter, Kind, \ - EventId, nip04_decrypt, nip04_encrypt, Options, NostrSigner, PublicKey, init_logger, LogLevel, Metadata from nostr_dvm.utils.print_utils import bcolors +from nostr_dvm.utils.zap_utils import pay_bolt11_ln_bits, zaprequest class NutWallet(object): @@ -29,7 +30,7 @@ class NutWallet(object): self.a: str = "" self.legacy_encryption: bool = False # Use Nip04 instead of Nip44, for reasons, turn to False ASAP. self.trust_unknown_mints: bool = False - self.missing_balance_strategy: str = "mint" #none to do nothing until manually minted, mint to mint from lightning or swap to use existing tokens from other mints (fees!) (not working yet!) + self.missing_balance_strategy: str = "mint" # none to do nothing until manually minted, mint to mint from lightning or swap to use existing tokens from other mints (fees!) (not working yet!) class NutMint(object): @@ -120,7 +121,7 @@ class NutZapWallet: nut_wallet = None wallet_filter = Filter().kind(EventDefinitions.KIND_NUT_WALLET).author(keys.public_key()) - #relay_timeout = EventSource.relays(timedelta(seconds=10)) + # relay_timeout = EventSource.relays(timedelta(seconds=10)) wallets = await client.get_events_of([wallet_filter], relay_timeout_long) if len(wallets) > 0: @@ -195,7 +196,7 @@ class NutZapWallet: # Now all proof events proof_filter = Filter().kind(Kind(7375)).author(keys.public_key()) - #relay_timeout = EventSource.relays(timedelta(seconds=5)) + # relay_timeout = EventSource.relays(timedelta(seconds=5)) proof_events = await client.get_events_of([proof_filter], relay_timeout) latest_proof_sec = 0 @@ -449,7 +450,7 @@ class NutZapWallet: async def fetch_mint_info_event(self, pubkey, client): mint_info_filter = Filter().kind(Kind(10019)).author(PublicKey.parse(pubkey)) - #relay_timeout = EventSource.relays(timedelta(seconds=5)) + # relay_timeout = EventSource.relays(timedelta(seconds=5)) preferences = await client.get_events_of([mint_info_filter], relay_timeout) mints = [] relays = [] @@ -778,12 +779,11 @@ class NutZapWallet: + bcolors.ENDC) async def swap(self, amountinsats, incoming_mint_url, outgoing_mint_url, nut_wallet): - #TODO this doesn't seem to work yet. + # TODO this doesn't seem to work yet. from cashu.wallet.cli.cli_helpers import print_mint_balances from cashu.wallet.wallet import Wallet from cashu.core.crypto.keys import PrivateKey - outgoing_mint = self.get_mint(nut_wallet, outgoing_mint_url) outgoing_wallet = await Wallet.with_db( @@ -797,7 +797,6 @@ class NutZapWallet: print(outgoing_wallet.available_balance) - incoming_mint = self.get_mint(nut_wallet, incoming_mint_url) incoming_wallet = await Wallet.with_db( url=incoming_mint_url, @@ -808,8 +807,6 @@ class NutZapWallet: await incoming_wallet.load_mint() incoming_wallet.proofs = incoming_mint.proofs - - if incoming_wallet.url == outgoing_wallet.url: raise Exception("mints for swap have to be different") diff --git a/nostr_dvm/utils/reaction_utils.py b/nostr_dvm/utils/reaction_utils.py index bd8d4ef..7ba1736 100644 --- a/nostr_dvm/utils/reaction_utils.py +++ b/nostr_dvm/utils/reaction_utils.py @@ -19,8 +19,6 @@ async def create_reaction(keys, title, dtag): emoji_tag1 = Tag.parse(["emoji", name, url]) emoji_tags.append(emoji_tag1) - - keys = Keys.parse(keys) content = "" event = EventBuilder(Kind(30030), content, [d_tag, title_tag] + emoji_tags).to_event(keys) @@ -65,4 +63,4 @@ keys = check_and_set_private_key("test_client") eventid = "da05cefc512ad43363f84131343f5d2a80303ea3b9368b9ad7f010e07db37d90" asyncio.run(create_reaction(keys=keys, title="ThugAmy", dtag="ThugAmy")) -#asyncio.run(delete_reaction(keys=keys, eid=eventid, dtag="ThugAmy")) \ No newline at end of file +# asyncio.run(delete_reaction(keys=keys, eid=eventid, dtag="ThugAmy")) diff --git a/nostr_dvm/utils/scrapper/request_details.json b/nostr_dvm/utils/scrapper/request_details.json index e351a1a..2d31659 100644 --- a/nostr_dvm/utils/scrapper/request_details.json +++ b/nostr_dvm/utils/scrapper/request_details.json @@ -1,40 +1,40 @@ { - "features": { - "responsive_web_graphql_exclude_directive_enabled": true, - "verified_phone_label_enabled": false, - "responsive_web_graphql_timeline_navigation_enabled": true, - "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, - "tweetypie_unmention_optimization_enabled": true, - "vibe_api_enabled": false, - "responsive_web_edit_tweet_api_enabled": false, - "graphql_is_translatable_rweb_tweet_is_translatable_enabled": false, - "view_counts_everywhere_api_enabled": true, - "longform_notetweets_consumption_enabled": true, - "tweet_awards_web_tipping_enabled": false, - "freedom_of_speech_not_reach_fetch_enabled": false, - "standardized_nudges_misinfo": false, - "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false, - "interactive_text_enabled": false, - "responsive_web_twitter_blue_verified_badge_is_enabled": true, - "responsive_web_text_conversations_enabled": false, - "longform_notetweets_richtext_consumption_enabled": false, - "responsive_web_enhance_cards_enabled": false, - "longform_notetweets_inline_media_enabled": true, - "longform_notetweets_rich_text_read_enabled": true, - "responsive_web_media_download_video_enabled": true, - "responsive_web_twitter_article_tweet_consumption_enabled": true, - "creator_subscriptions_tweet_preview_api_enabled": true - }, - "variables": { - "with_rux_injections": false, - "includePromotedContent": true, - "withCommunity": true, - "withQuickPromoteEligibilityTweetFields": true, - "withBirdwatchNotes": true, - "withDownvotePerspective": false, - "withReactionsMetadata": false, - "withReactionsPerspective": false, - "withVoice": true, - "withV2Timeline": true - } + "features": { + "responsive_web_graphql_exclude_directive_enabled": true, + "verified_phone_label_enabled": false, + "responsive_web_graphql_timeline_navigation_enabled": true, + "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, + "tweetypie_unmention_optimization_enabled": true, + "vibe_api_enabled": false, + "responsive_web_edit_tweet_api_enabled": false, + "graphql_is_translatable_rweb_tweet_is_translatable_enabled": false, + "view_counts_everywhere_api_enabled": true, + "longform_notetweets_consumption_enabled": true, + "tweet_awards_web_tipping_enabled": false, + "freedom_of_speech_not_reach_fetch_enabled": false, + "standardized_nudges_misinfo": false, + "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": false, + "interactive_text_enabled": false, + "responsive_web_twitter_blue_verified_badge_is_enabled": true, + "responsive_web_text_conversations_enabled": false, + "longform_notetweets_richtext_consumption_enabled": false, + "responsive_web_enhance_cards_enabled": false, + "longform_notetweets_inline_media_enabled": true, + "longform_notetweets_rich_text_read_enabled": true, + "responsive_web_media_download_video_enabled": true, + "responsive_web_twitter_article_tweet_consumption_enabled": true, + "creator_subscriptions_tweet_preview_api_enabled": true + }, + "variables": { + "with_rux_injections": false, + "includePromotedContent": true, + "withCommunity": true, + "withQuickPromoteEligibilityTweetFields": true, + "withBirdwatchNotes": true, + "withDownvotePerspective": false, + "withReactionsMetadata": false, + "withReactionsPerspective": false, + "withVoice": true, + "withV2Timeline": true + } } \ No newline at end of file