import json from pathlib import Path import dotenv from nostr_sdk import init_logger, LogLevel from nostr_dvm.framework import DVMFramework from nostr_dvm.tasks.content_discovery_currently_latest_longform import DicoverContentLatestLongForm from nostr_dvm.tasks.content_discovery_currently_latest_wiki import DicoverContentLatestWiki from nostr_dvm.tasks.content_discovery_currently_popular_gallery import DicoverContentCurrentlyPopularGallery from nostr_dvm.tasks.content_discovery_currently_popular_mostr import DicoverContentCurrentlyPopularMostr from nostr_dvm.tasks.content_discovery_currently_popular_nonfollowers import DicoverContentCurrentlyPopularNonFollowers from nostr_dvm.tasks.content_discovery_latest_one_per_follower import Discoverlatestperfollower from nostr_dvm.tasks.content_discovery_update_db_only import DicoverContentDBUpdateScheduler #os.environ["RUST_BACKTRACE"] = "full" from nostr_dvm.subscription import Subscription from nostr_dvm.tasks.content_discovery_currently_popular import DicoverContentCurrentlyPopular from nostr_dvm.tasks.content_discovery_currently_popular_by_top_zaps import DicoverContentCurrentlyPopularZaps from nostr_dvm.tasks.content_discovery_currently_popular_followers import DicoverContentCurrentlyPopularFollowers from nostr_dvm.tasks.content_discovery_currently_popular_topic import DicoverContentCurrentlyPopularbyTopic from nostr_dvm.tasks.discovery_trending_notes_nostrband import TrendingNotesNostrBand from nostr_dvm.utils.admin_utils import AdminConfig from nostr_dvm.utils.backend_utils import keep_alive from nostr_dvm.utils.dvmconfig import build_default_config, DVMConfig from nostr_dvm.utils.mediasource_utils import organize_input_media_data from nostr_dvm.utils.nip88_utils import NIP88Config, check_and_set_d_tag_nip88, check_and_set_tiereventid_nip88 from nostr_dvm.utils.nip89_utils import create_amount_tag, NIP89Config, check_and_set_d_tag 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 rebroadcast_NIP89 = False # Announce NIP89 on startup Only do this if you know what you're doing. rebroadcast_NIP65_Relay_List = True update_profile = False global_update_rate = 120 # set this high on first sync so db can fully sync before another process trys to. use_logger = True log_level = LogLevel.INFO if use_logger: init_logger(log_level) SYNC_DB_RELAY_LIST = [ "wss://relay.nostr.net", "wss://relay.nostr.bg", "wss://relay.damus.io", "wss://nostr.oxtr.dev"] RELAY_LIST = ["wss://relay.primal.net", "wss://nostr.mom", "wss://nostr.oxtr.dev", "wss://relay.nostr.net" ] def build_db_scheduler(name, identifier, admin_config, options, image, description, update_rate=600, cost=0, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.SHOWLOG = True dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db dvm_config.LOGLEVEL = LogLevel.INFO dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST # Activate these to use a subscription based model instead # dvm_config.SUBSCRIPTION_REQUIRED = True # dvm_config.SUBSCRIPTION_DAILY_COST = 1 dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": description, "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": False, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 100)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) return DicoverContentDBUpdateScheduler(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def build_example_gallery(name, identifier, admin_config, options, image, cost=0, update_rate=180, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.LOGLEVEL = LogLevel.INFO # dvm_config.SHOWLOG = True dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db dvm_config.LOGLEVEL = LogLevel.DEBUG dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show popular gallery entries", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": True, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 200)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) return DicoverContentCurrentlyPopularGallery(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def build_example_nostrband(name, identifier, admin_config, image, about, custom_processing_msg): dvm_config: DVMConfig = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.CUSTOM_PROCESSING_MESSAGE = custom_processing_msg dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST dvm_config.LOGLEVEL = LogLevel.INFO admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": about, "amount": "Free", "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "nip90Params": {} } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) return TrendingNotesNostrBand(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config) def build_longform(name, identifier, admin_config, options, cost=0, update_rate=180, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.SHOWLOG = True dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST dvm_config.LOGLEVEL = LogLevel.INFO # Activate these to use a subscription based model instead # dvm_config.SUBSCRIPTION_REQUIRED = True # dvm_config.SUBSCRIPTION_DAILY_COST = 1 dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg admin_config.LUD16 = dvm_config.LN_ADDRESS image = "https://image.nostr.build/d30a75c438a8b0815b5c65b494988da26fce719f4138058929fa52d2a2dc3433.jpg" # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show the latest longform notes.", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": False, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 100)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) # admin_config.UPDATE_PROFILE = False # admin_config.REBROADCAST_NIP89 = False return DicoverContentLatestLongForm(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def build_wiki(name, identifier, admin_config, options, cost=0, update_rate=180, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.SHOWLOG = True dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST dvm_config.LOGLEVEL = LogLevel.INFO # Activate these to use a subscription based model instead # dvm_config.SUBSCRIPTION_REQUIRED = True # dvm_config.SUBSCRIPTION_DAILY_COST = 1 dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg admin_config.LUD16 = dvm_config.LN_ADDRESS image = "https://i.nostr.build/ctfc5o47ICm56TOv.jpg" # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show the latest wikifreedia entries.", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": False, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 100)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) # admin_config.UPDATE_PROFILE = False # admin_config.REBROADCAST_NIP89 = False return DicoverContentLatestWiki(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def build_example_topic(name, identifier, admin_config, options, image, description, update_rate=600, cost=0, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.SHOWLOG = True dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db dvm_config.FIX_COST = cost dvm_config.LOGLEVEL = LogLevel.INFO dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": description, "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": False, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 100)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) return DicoverContentCurrentlyPopularbyTopic(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def build_example_popular(name, identifier, admin_config, options, image, cost=0, update_rate=180, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.LOGLEVEL = LogLevel.INFO # dvm_config.SHOWLOG = True dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show notes that are currently popular", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": False, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 200)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) return DicoverContentCurrentlyPopular(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def build_example_popular_followers(name, identifier, admin_config, options, image, cost=0, update_rate=300, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.SHOWLOG = True dvm_config.LOGLEVEL = LogLevel.INFO dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every x seconds dvm_config.UPDATE_DATABASE = update_db dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show notes that are currently popular from people you follow", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": True, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 100)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) return DicoverContentCurrentlyPopularFollowers(name=name, dvm_config=dvm_config, nip89config=nip89config, options=options, admin_config=admin_config) def build_example_popular_non_followers(name, identifier, admin_config, options, image, cost=0, update_rate=300, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.SHOWLOG = True dvm_config.LOGLEVEL = LogLevel.DEBUG dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db # Activate these to use a subscription based model instead dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST dvm_config.SUBSCRIPTION_REQUIRED = True admin_config.LUD16 = dvm_config.LN_ADDRESS admin_config.REBROADCAST_NIP88 = False #admin_config.REBROADCAST_NIP89 = True admin_config.UPDATE_PROFILE = False # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show notes that are currently popular from people you do not follow", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "subscription": True, "personalized": False, "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 100)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) nip88config = NIP88Config() nip88config.DTAG = check_and_set_d_tag_nip88(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip88config.TIER_EVENT = check_and_set_tiereventid_nip88(identifier, "1") nip89config.NAME = name nip88config.IMAGE = nip89info["picture"] nip88config.TITLE = name nip88config.AMOUNT_DAILY = 100 nip88config.AMOUNT_MONTHLY = 2000 nip88config.CONTENT = "Subscribe to the DVM for unlimited use during your subscription" nip88config.PERK1DESC = "Unlimited requests" nip88config.PERK2DESC = "Support NostrDVM & NostrSDK development" nip88config.PAYMENT_VERIFIER_PUBKEY = "5b5c045ecdf66fb540bdf2049fe0ef7f1a566fa427a4fe50d400a011b65a3a7e" #admin_config.FETCH_NIP88 = True #admin_config.EVENTID = "63a791cdc7bf78c14031616963105fce5793f532bb231687665b14fb6d805fdb" admin_config.PRIVKEY = dvm_config.PRIVATE_KEY return DicoverContentCurrentlyPopularNonFollowers(name=name, dvm_config=dvm_config, nip89config=nip89config, nip88config=nip88config, admin_config=admin_config, options=options) def build_example_top_zapped(name, identifier, admin_config, options, image, cost=0, update_rate=180, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.SHOWLOG = True dvm_config.ENABLE_NUTZAP = True dvm_config.LOGLEVEL = LogLevel.INFO dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST dvm_config.RELAY_LIST = RELAY_LIST admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show notes that are currently zapped the most.", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": False, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 100)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) # admin_config.UPDATE_PROFILE = False # admin_config.REBROADCAST_NIP89 = False return DicoverContentCurrentlyPopularZaps(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def build_example_mostr(name, identifier, admin_config, options, image, cost=0, update_rate=180, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.LOGLEVEL = LogLevel.INFO # dvm_config.SHOWLOG = True dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = update_db dvm_config.RELAY_LIST = RELAY_LIST dvm_config.SYNC_DB_RELAY_LIST = ["wss://nfrelay.app/?user=activitypub"] dvm_config.LOGLEVEL = LogLevel.DEBUG dvm_config.FIX_COST = cost dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show notes from Mostr.pub and Momostr.pink that are currently popular on Nostr", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": False, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 200)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) return DicoverContentCurrentlyPopularMostr(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def build_example_oneperfollow(name, identifier, admin_config, options, image, cost=0, update_rate=180, processing_msg=None, update_db=True): dvm_config = build_default_config(identifier) dvm_config.USE_OWN_VENV = False dvm_config.LOGLEVEL = LogLevel.INFO # dvm_config.SHOWLOG = True dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes dvm_config.UPDATE_DATABASE = False dvm_config.LOGLEVEL = LogLevel.DEBUG dvm_config.FIX_COST = cost dvm_config.RELAY_LIST = ["wss://relay.damus.io", "wss://nostr.oxtr.dev", "wss://relay.nostr.bg", "wss://relay.primal.net"] dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg admin_config.LUD16 = dvm_config.LN_ADDRESS # Add NIP89 nip89info = { "name": name, "picture": image, "about": "I show the single latest note of people you follow", "lud16": dvm_config.LN_ADDRESS, "supportsEncryption": True, "acceptsNutZaps": dvm_config.ENABLE_NUTZAP, "personalized": False, "amount": create_amount_tag(cost), "nip90Params": { "max_results": { "required": False, "values": [], "description": "The number of maximum results to return (default currently 200)" } } } nip89config = NIP89Config() nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"]) nip89config.CONTENT = json.dumps(nip89info) return Discoverlatestperfollower(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config, options=options) def playground(): framework = DVMFramework() #DB Scheduler, do not announce, just use it to update the DB for the other DVMs. admin_config_db_scheduler= AdminConfig() options_animal = { "db_name": "db/nostr_recent_notes.db", "db_since": 48 * 60 * 60, # 48h since gmt, "personalized": False, "logger": False} image = "" about = "I just update the Database based on my schedule" db_scheduler = build_db_scheduler("DB Scheduler", "db_scheduler", admin_config_db_scheduler, options_animal, image=image, description=about, update_rate=global_update_rate, cost=0, update_db=True) framework.add(db_scheduler) # Popular top zapped admin_config_top_zaps = AdminConfig() admin_config_top_zaps.REBROADCAST_NIP89 = rebroadcast_NIP89 admin_config_top_zaps.REBROADCAST_NIP65_RELAY_LIST = rebroadcast_NIP65_Relay_List admin_config_top_zaps.UPDATE_PROFILE = update_profile # admin_config_top_zaps.DELETE_NIP89 = True # admin_config_top_zaps.PRIVKEY = "" # admin_config_top_zaps.EVENTID = "05a6de88e15aa6c8b4c8ec54481f885f397a30761ff2799958e5c5ee9ad6917b" # admin_config_top_zaps.POW = True custom_processing_msg = ["Looking for most zapped notes", "Let's see which notes people currently zap..", "Let's find valuable notes. #value4value"] update_db = False options_top_zapped = { "db_name": "db/nostr_recent_notes.db", "db_since": 60 * 60 * 2, # 8h since gmt, } cost = 0 image = "https://image.nostr.build/c6879f458252641d04d0aa65fd7f1e005a4f7362fd407467306edc2f4acdb113.jpg" discovery_topzaps = build_example_top_zapped("Top Zapped notes", "discovery_content_top_zaps", admin_config=admin_config_top_zaps, options=options_top_zapped, image=image, cost=cost, update_rate=global_update_rate, processing_msg=custom_processing_msg, update_db=update_db) framework.add(discovery_topzaps) admin_config_plants = AdminConfig() admin_config_plants.REBROADCAST_NIP89 = rebroadcast_NIP89 admin_config_plants.REBROADCAST_NIP65_RELAY_LIST = rebroadcast_NIP65_Relay_List admin_config_plants.UPDATE_PROFILE = update_profile # admin_config_plants.DELETE_NIP89 = True # admin_config_plants.PRIVKEY = "" # admin_config_plants.EVENTID = "ff28be59708ee597c7010fd43a7e649e1ab51da491266ca82a84177e0007e4d6" # admin_config_plants.POW = True options_plants = { "db_name": "db/nostr_recent_notes.db", "db_since": 48 * 60 * 60, # 12h since gmt "personalized": True, "logger": False} image = "https://i.nostr.build/VKcTV1Qo79ZRelrG.jpg" description = "I show recent notes about custom topics you provide me with" custom_processing_msg = ["Finding the best notes for you.. #blooming"] update_db = False cost = 0 discovery_custom = build_example_topic("Custom Discovery", "discovery_content_custom", admin_config_plants, options_plants, image=image, description=description, update_rate=global_update_rate, cost=cost, processing_msg=custom_processing_msg, update_db=update_db) framework.add(discovery_custom) framework.run if __name__ == '__main__': env_path = Path('.env') if not env_path.is_file(): with open('.env', 'w') as f: print("Writing new .env file") f.write('') if env_path.is_file(): print(f'loading environment from {env_path.resolve()}') dotenv.load_dotenv(env_path, verbose=True, override=True) else: raise FileNotFoundError(f'.env file not found at {env_path} ') playground()