mirror of
https://github.com/believethehype/nostrdvm.git
synced 2025-11-19 19:36:25 +01:00
introduce framework class, introduce autodelete announcement on shutdown
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
from sys import platform
|
from sys import platform
|
||||||
|
|
||||||
from nostr_sdk import PublicKey, Keys, Client, Tag, Event, EventBuilder, Filter, HandleNotification, Timestamp, \
|
from nostr_sdk import PublicKey, Keys, Client, Tag, Event, EventBuilder, Filter, HandleNotification, Timestamp, \
|
||||||
@@ -27,6 +28,7 @@ from nostr_dvm.utils.zap_utils import check_bolt11_ln_bits_is_paid, create_bolt1
|
|||||||
#os.environ["RUST_BACKTRACE"] = "full"
|
#os.environ["RUST_BACKTRACE"] = "full"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class DVM:
|
class DVM:
|
||||||
dvm_config: DVMConfig
|
dvm_config: DVMConfig
|
||||||
admin_config: AdminConfig
|
admin_config: AdminConfig
|
||||||
@@ -34,15 +36,23 @@ class DVM:
|
|||||||
client: Client
|
client: Client
|
||||||
job_list: list
|
job_list: list
|
||||||
jobs_on_hold_list: list
|
jobs_on_hold_list: list
|
||||||
|
stop_thread = False
|
||||||
|
|
||||||
def __init__(self, dvm_config, admin_config=None):
|
def __init__(self, dvm_config, admin_config=None, stop_thread=False):
|
||||||
asyncio.run(self.run_dvm(dvm_config, admin_config))
|
try:
|
||||||
uniffi_set_event_loop(asyncio.get_running_loop())
|
asyncio.run(self.run_dvm(dvm_config, admin_config, stop_thread))
|
||||||
|
#uniffi_set_event_loop(asyncio.get_running_loop())
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
async def run_dvm(self, dvm_config, admin_config):
|
|
||||||
|
|
||||||
|
|
||||||
|
async def run_dvm(self, dvm_config, admin_config, stop_thread):
|
||||||
self.dvm_config = dvm_config
|
self.dvm_config = dvm_config
|
||||||
self.admin_config = admin_config
|
self.admin_config = admin_config
|
||||||
self.keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
self.keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
||||||
|
self.stop_thread = stop_thread
|
||||||
relaylimits = RelayLimits.disable()
|
relaylimits = RelayLimits.disable()
|
||||||
opts = Options().relay_limits(relaylimits) #.difficulty(28)
|
opts = Options().relay_limits(relaylimits) #.difficulty(28)
|
||||||
|
|
||||||
@@ -913,10 +923,9 @@ class DVM:
|
|||||||
|
|
||||||
asyncio.create_task(self.client.handle_notifications(NotificationHandler()))
|
asyncio.create_task(self.client.handle_notifications(NotificationHandler()))
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
while not self.stop_thread:
|
||||||
|
|
||||||
while True:
|
|
||||||
for dvm in self.dvm_config.SUPPORTED_DVMS:
|
for dvm in self.dvm_config.SUPPORTED_DVMS:
|
||||||
await dvm.schedule(self.dvm_config)
|
await dvm.schedule(self.dvm_config)
|
||||||
|
|
||||||
@@ -954,3 +963,6 @@ class DVM:
|
|||||||
self.jobs_on_hold_list.remove(job)
|
self.jobs_on_hold_list.remove(job)
|
||||||
|
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
except BaseException:
|
||||||
|
print("ende")
|
||||||
|
|
||||||
|
|||||||
29
nostr_dvm/framework.py
Normal file
29
nostr_dvm/framework.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import os
|
||||||
|
import signal
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
class DVMFramework:
|
||||||
|
dvms = []
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.dvms = []
|
||||||
|
|
||||||
|
|
||||||
|
def add(self, dvm):
|
||||||
|
self.dvms.append(dvm)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
for dvm in self.dvms:
|
||||||
|
dvm.run()
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
time.sleep(0.1)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
for dvm in self.dvms:
|
||||||
|
dvm.join()
|
||||||
|
print("All DVMs shut down.")
|
||||||
|
os.kill(os.getpid(), signal.SIGKILL)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import signal
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
from subprocess import run
|
from subprocess import run
|
||||||
from sys import platform
|
from sys import platform
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
@@ -14,7 +16,7 @@ from nostr_dvm.dvm import DVM
|
|||||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||||
from nostr_dvm.utils.dvmconfig import DVMConfig, build_default_config
|
from nostr_dvm.utils.dvmconfig import DVMConfig, build_default_config
|
||||||
from nostr_dvm.utils.nip88_utils import NIP88Config
|
from nostr_dvm.utils.nip88_utils import NIP88Config
|
||||||
from nostr_dvm.utils.nip89_utils import NIP89Config
|
from nostr_dvm.utils.nip89_utils import NIP89Config, delete_nip_89
|
||||||
from nostr_dvm.utils.output_utils import post_process_result
|
from nostr_dvm.utils.output_utils import post_process_result
|
||||||
|
|
||||||
|
|
||||||
@@ -36,6 +38,8 @@ class DVMTaskInterface:
|
|||||||
def __init__(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
def __init__(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
||||||
admin_config: AdminConfig = None,
|
admin_config: AdminConfig = None,
|
||||||
options=None, task=None):
|
options=None, task=None):
|
||||||
|
self.stop_threads = False
|
||||||
|
self.nostr_dvm_thread = None
|
||||||
if options is None:
|
if options is None:
|
||||||
self.options = {}
|
self.options = {}
|
||||||
else:
|
else:
|
||||||
@@ -108,10 +112,21 @@ class DVMTaskInterface:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def run(self, join=False):
|
def run(self, join=False):
|
||||||
nostr_dvm_thread = Thread(target=self.DVM, args=[self.dvm_config, self.admin_config], daemon=False)
|
|
||||||
nostr_dvm_thread.start()
|
|
||||||
|
try:
|
||||||
|
self.nostr_dvm_thread = Thread(target=self.DVM, args=[self.dvm_config, self.admin_config, lambda: self.stop_threads], daemon=False)
|
||||||
|
self.nostr_dvm_thread.start()
|
||||||
if join:
|
if join:
|
||||||
nostr_dvm_thread.join()
|
self.nostr_dvm_thread.join()
|
||||||
|
except BaseException as e:
|
||||||
|
print("gone")
|
||||||
|
|
||||||
|
|
||||||
|
def join(self):
|
||||||
|
self.stop_threads = True
|
||||||
|
self.nostr_dvm_thread.join(1)
|
||||||
|
dvm_shutdown(self.dvm_config)
|
||||||
|
|
||||||
async def schedule(self, dvm_config):
|
async def schedule(self, dvm_config):
|
||||||
"""schedule something, e.g. define some time to update or to post, does nothing by default"""
|
"""schedule something, e.g. define some time to update or to post, does nothing by default"""
|
||||||
@@ -178,3 +193,12 @@ def process_venv(identifier):
|
|||||||
DVMTaskInterface.write_output(result, args.output)
|
DVMTaskInterface.write_output(result, args.output)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
DVMTaskInterface.write_output("Error: " + str(e), args.output)
|
DVMTaskInterface.write_output("Error: " + str(e), args.output)
|
||||||
|
|
||||||
|
def dvm_shutdown(dvm_config):
|
||||||
|
if dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN:
|
||||||
|
print(dvm_config.NIP89.NAME)
|
||||||
|
asyncio.run(delete_nip_89(dvm_config, dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN_POW))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -192,11 +192,3 @@ def get_amount_per_task(task, dvm_config, duration=1):
|
|||||||
0].NAME + "] Task " + task + " is currently not supported by this instance, skipping")
|
0].NAME + "] Task " + task + " is currently not supported by this instance, skipping")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def keep_alive():
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
time.sleep(10)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
os.kill(os.getpid(), signal.SIGKILL)
|
|
||||||
exit(1)
|
|
||||||
|
|||||||
@@ -40,6 +40,11 @@ class DVMConfig:
|
|||||||
AVOID_OUTBOX_RELAY_LIST = outbox_utils.AVOID_OUTBOX_RELAY_LIST
|
AVOID_OUTBOX_RELAY_LIST = outbox_utils.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.
|
||||||
|
|
||||||
|
DELETE_ANNOUNCEMENT_ON_SHUTDOWN = False
|
||||||
|
# remove the announcement when the DVM stops. Recommended. Will be True later.
|
||||||
|
# Make sure to set admin_utils.REBROADCAST_NIP89 = True on start.
|
||||||
|
|
||||||
|
DELETE_ANNOUNCEMENT_ON_SHUTDOWN_POW = False
|
||||||
RELAY_TIMEOUT = 5
|
RELAY_TIMEOUT = 5
|
||||||
RELAY_LONG_TIMEOUT = 30
|
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
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import os
|
import os
|
||||||
|
from datetime import timedelta
|
||||||
from hashlib import sha256
|
from hashlib import sha256
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import dotenv
|
import dotenv
|
||||||
from nostr_sdk import Tag, Keys, EventBuilder, Filter, Alphabet, PublicKey, Client, EventId, SingleLetterTag, Kind
|
from nostr_sdk import Tag, Keys, EventBuilder, Filter, Alphabet, PublicKey, Client, EventId, SingleLetterTag, Kind, NostrSigner
|
||||||
|
|
||||||
from nostr_dvm.utils.definitions import EventDefinitions, relay_timeout
|
from nostr_dvm.utils.definitions import EventDefinitions, relay_timeout
|
||||||
from nostr_dvm.utils.nostr_utils import send_event, print_send_result
|
from nostr_dvm.utils.nostr_utils import send_event, print_send_result
|
||||||
@@ -142,3 +143,20 @@ def create_amount_tag(cost=None):
|
|||||||
return "free"
|
return "free"
|
||||||
else:
|
else:
|
||||||
return str(cost)
|
return str(cost)
|
||||||
|
|
||||||
|
|
||||||
|
async def delete_nip_89(dvm_config, pow=True):
|
||||||
|
keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
||||||
|
client = Client(NostrSigner.keys(keys))
|
||||||
|
for relay in dvm_config.RELAY_LIST:
|
||||||
|
await client.add_relay(relay)
|
||||||
|
await client.connect()
|
||||||
|
filter = Filter().kind(EventDefinitions.KIND_ANNOUNCEMENT).author(keys.public_key())
|
||||||
|
events = await client.fetch_events([filter], timedelta(seconds=5))
|
||||||
|
|
||||||
|
if len(events.to_vec()) == 0:
|
||||||
|
print("Couldn't find note on relays. Seems they are gone.")
|
||||||
|
return
|
||||||
|
for event in events.to_vec():
|
||||||
|
await fetch_nip89_parameters_for_deletion(keys, event.id().to_hex(), client, dvm_config, pow)
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from pathlib import Path
|
|||||||
import dotenv
|
import dotenv
|
||||||
from nostr_sdk import init_logger, LogLevel, Keys
|
from nostr_sdk import init_logger, LogLevel, Keys
|
||||||
|
|
||||||
|
from nostr_dvm.framework import DVMFramework
|
||||||
# os.environ["RUST_BACKTRACE"] = "full"
|
# os.environ["RUST_BACKTRACE"] = "full"
|
||||||
from nostr_dvm.subscription import Subscription
|
from nostr_dvm.subscription import Subscription
|
||||||
from nostr_dvm.tasks.content_discovery_currently_latest_longform import DicoverContentLatestLongForm
|
from nostr_dvm.tasks.content_discovery_currently_latest_longform import DicoverContentLatestLongForm
|
||||||
@@ -34,6 +35,7 @@ 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_NIP89 = False # Announce NIP89 on startup Only do this if you know what you're doing.
|
||||||
rebroadcast_NIP65_Relay_List = True
|
rebroadcast_NIP65_Relay_List = True
|
||||||
update_profile = False
|
update_profile = False
|
||||||
|
delete_announcement_on_shutdown = False
|
||||||
|
|
||||||
global_update_rate = 180 # set this high on first sync so db can fully sync before another process trys to.
|
global_update_rate = 180 # set this high on first sync so db can fully sync before another process trys to.
|
||||||
use_logger = True
|
use_logger = True
|
||||||
@@ -121,6 +123,7 @@ def build_example_tweets(name, identifier, admin_config, options, image, descrip
|
|||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
dvm_config.DATABASE = database
|
dvm_config.DATABASE = database
|
||||||
dvm_config.SEND_FEEDBACK_EVENTS = False
|
dvm_config.SEND_FEEDBACK_EVENTS = False
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
@@ -164,6 +167,7 @@ def build_example_gallery(name, identifier, admin_config, options, image, cost=0
|
|||||||
dvm_config.SEND_FEEDBACK_EVENTS = False
|
dvm_config.SEND_FEEDBACK_EVENTS = False
|
||||||
dvm_config.FIX_COST = cost
|
dvm_config.FIX_COST = cost
|
||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
@@ -201,6 +205,7 @@ def build_example_nostrband(name, identifier, admin_config, image, about, custom
|
|||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
dvm_config.LOGLEVEL = LogLevel.INFO
|
dvm_config.LOGLEVEL = LogLevel.INFO
|
||||||
dvm_config.SEND_FEEDBACK_EVENTS = False
|
dvm_config.SEND_FEEDBACK_EVENTS = False
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
|
|
||||||
@@ -238,6 +243,7 @@ def build_longform(name, identifier, admin_config, options, cost=0, update_rate=
|
|||||||
# dvm_config.SUBSCRIPTION_DAILY_COST = 1
|
# dvm_config.SUBSCRIPTION_DAILY_COST = 1
|
||||||
dvm_config.FIX_COST = cost
|
dvm_config.FIX_COST = cost
|
||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
image = "https://image.nostr.build/d30a75c438a8b0815b5c65b494988da26fce719f4138058929fa52d2a2dc3433.jpg"
|
image = "https://image.nostr.build/d30a75c438a8b0815b5c65b494988da26fce719f4138058929fa52d2a2dc3433.jpg"
|
||||||
@@ -290,6 +296,7 @@ def build_wiki(name, identifier, admin_config, options, cost=0, update_rate=180,
|
|||||||
dvm_config.FIX_COST = cost
|
dvm_config.FIX_COST = cost
|
||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
dvm_config.SEND_FEEDBACK_EVENTS = False
|
dvm_config.SEND_FEEDBACK_EVENTS = False
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
image = "https://i.nostr.build/ctfc5o47ICm56TOv.jpg"
|
image = "https://i.nostr.build/ctfc5o47ICm56TOv.jpg"
|
||||||
@@ -340,6 +347,7 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
|||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
dvm_config.DATABASE = database
|
dvm_config.DATABASE = database
|
||||||
dvm_config.SEND_FEEDBACK_EVENTS = False
|
dvm_config.SEND_FEEDBACK_EVENTS = False
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
@@ -382,6 +390,7 @@ def build_example_popular(name, identifier, admin_config, options, image, cost=0
|
|||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
dvm_config.DATABASE = database
|
dvm_config.DATABASE = database
|
||||||
dvm_config.SEND_FEEDBACK_EVENTS = False
|
dvm_config.SEND_FEEDBACK_EVENTS = False
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
@@ -423,6 +432,7 @@ def build_example_popular_followers(name, identifier, admin_config, options, ima
|
|||||||
dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
||||||
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
|
|
||||||
@@ -471,6 +481,7 @@ def build_example_popular_non_followers(name, identifier, admin_config, options,
|
|||||||
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
dvm_config.SUBSCRIPTION_REQUIRED = False
|
dvm_config.SUBSCRIPTION_REQUIRED = False
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
admin_config.REBROADCAST_NIP88 = False
|
admin_config.REBROADCAST_NIP88 = False
|
||||||
# admin_config.REBROADCAST_NIP89 = True
|
# admin_config.REBROADCAST_NIP89 = True
|
||||||
@@ -540,6 +551,7 @@ def build_example_top_zapped(name, identifier, admin_config, options, image, cos
|
|||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
dvm_config.DATABASE = database
|
dvm_config.DATABASE = database
|
||||||
dvm_config.SEND_FEEDBACK_EVENTS = False
|
dvm_config.SEND_FEEDBACK_EVENTS = False
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
@@ -588,6 +600,7 @@ def build_example_mostr(name, identifier, admin_config, options, image, cost=0,
|
|||||||
|
|
||||||
dvm_config.FIX_COST = cost
|
dvm_config.FIX_COST = cost
|
||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
@@ -630,6 +643,7 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
|||||||
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_announcement_on_shutdown
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
@@ -659,6 +673,10 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
|||||||
|
|
||||||
|
|
||||||
def playground():
|
def playground():
|
||||||
|
|
||||||
|
framework = DVMFramework()
|
||||||
|
|
||||||
|
|
||||||
main_db = "db/nostr_recent_notes.db"
|
main_db = "db/nostr_recent_notes.db"
|
||||||
main_db_limit = 1024 # in mb
|
main_db_limit = 1024 # in mb
|
||||||
|
|
||||||
@@ -682,7 +700,9 @@ def playground():
|
|||||||
cost=0,
|
cost=0,
|
||||||
update_db=True,
|
update_db=True,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
db_scheduler.run()
|
|
||||||
|
framework.add(db_scheduler)
|
||||||
|
#db_scheduler.run()
|
||||||
|
|
||||||
admin_config_gallery = AdminConfig()
|
admin_config_gallery = AdminConfig()
|
||||||
admin_config_gallery.REBROADCAST_NIP89 = rebroadcast_NIP89
|
admin_config_gallery.REBROADCAST_NIP89 = rebroadcast_NIP89
|
||||||
@@ -741,7 +761,7 @@ def playground():
|
|||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db)
|
update_db=update_db)
|
||||||
|
|
||||||
latest_longform.run()
|
framework.add(latest_longform)
|
||||||
|
|
||||||
# Latest Wiki
|
# Latest Wiki
|
||||||
admin_config_wiki = AdminConfig()
|
admin_config_wiki = AdminConfig()
|
||||||
@@ -769,7 +789,7 @@ def playground():
|
|||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db)
|
update_db=update_db)
|
||||||
|
|
||||||
latest_wiki.run()
|
framework.add(latest_wiki)
|
||||||
|
|
||||||
# Popular top zapped
|
# Popular top zapped
|
||||||
admin_config_top_zaps = AdminConfig()
|
admin_config_top_zaps = AdminConfig()
|
||||||
@@ -802,7 +822,7 @@ def playground():
|
|||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
|
|
||||||
discovery_topzaps.run()
|
framework.add(discovery_topzaps)
|
||||||
|
|
||||||
# Popular NOSTR.band
|
# Popular NOSTR.band
|
||||||
admin_config_trending_nostr_band = AdminConfig()
|
admin_config_trending_nostr_band = AdminConfig()
|
||||||
@@ -822,7 +842,7 @@ def playground():
|
|||||||
about=about,
|
about=about,
|
||||||
admin_config=admin_config_trending_nostr_band,
|
admin_config=admin_config_trending_nostr_band,
|
||||||
custom_processing_msg=custom_processing_msg)
|
custom_processing_msg=custom_processing_msg)
|
||||||
trending_nb.run()
|
framework.add(trending_nb)
|
||||||
|
|
||||||
admin_config_mostr = AdminConfig()
|
admin_config_mostr = AdminConfig()
|
||||||
admin_config_mostr.REBROADCAST_NIP89 = rebroadcast_NIP89
|
admin_config_mostr.REBROADCAST_NIP89 = rebroadcast_NIP89
|
||||||
@@ -879,7 +899,8 @@ def playground():
|
|||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
discovery_asknostr.run()
|
|
||||||
|
framework.add(discovery_asknostr)
|
||||||
|
|
||||||
# Popular Garden&Plants
|
# Popular Garden&Plants
|
||||||
admin_config_mining = AdminConfig()
|
admin_config_mining = AdminConfig()
|
||||||
@@ -912,7 +933,8 @@ def playground():
|
|||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
discovery_mining.run()
|
|
||||||
|
framework.add(discovery_mining)
|
||||||
|
|
||||||
# Popular Garden&Plants
|
# Popular Garden&Plants
|
||||||
admin_config_gm = AdminConfig()
|
admin_config_gm = AdminConfig()
|
||||||
@@ -945,8 +967,8 @@ def playground():
|
|||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
discovery_gm.run()
|
|
||||||
|
|
||||||
|
framework.add(discovery_gm)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1007,7 +1029,8 @@ def playground():
|
|||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
|
|
||||||
discovery_animals.run()
|
|
||||||
|
framework.add(discovery_animals)
|
||||||
|
|
||||||
# Popular Garden&Plants
|
# Popular Garden&Plants
|
||||||
admin_config_plants = AdminConfig()
|
admin_config_plants = AdminConfig()
|
||||||
@@ -1055,7 +1078,8 @@ def playground():
|
|||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
discovery_garden.run()
|
|
||||||
|
framework.add(discovery_garden)
|
||||||
|
|
||||||
# Popular Followers
|
# Popular Followers
|
||||||
admin_config_followers = AdminConfig()
|
admin_config_followers = AdminConfig()
|
||||||
@@ -1088,7 +1112,8 @@ def playground():
|
|||||||
update_rate=global_update_rate,
|
update_rate=global_update_rate,
|
||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db)
|
update_db=update_db)
|
||||||
discovery_followers.run()
|
|
||||||
|
framework.add(discovery_followers)
|
||||||
|
|
||||||
# Popular Followers
|
# Popular Followers
|
||||||
admin_config_nonfollowers = AdminConfig()
|
admin_config_nonfollowers = AdminConfig()
|
||||||
@@ -1121,7 +1146,9 @@ def playground():
|
|||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
discovery_non_followers.run()
|
|
||||||
|
framework.add(discovery_non_followers)
|
||||||
|
|
||||||
|
|
||||||
admin_config_opf = AdminConfig()
|
admin_config_opf = AdminConfig()
|
||||||
admin_config_opf.REBROADCAST_NIP89 = rebroadcast_NIP89
|
admin_config_opf.REBROADCAST_NIP89 = rebroadcast_NIP89
|
||||||
@@ -1150,7 +1177,7 @@ def playground():
|
|||||||
update_rate=global_update_rate,
|
update_rate=global_update_rate,
|
||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db)
|
update_db=update_db)
|
||||||
discovery_one_per_follow.run()
|
framework.add(discovery_one_per_follow)
|
||||||
|
|
||||||
# Popular Tweets
|
# Popular Tweets
|
||||||
admin_config = AdminConfig()
|
admin_config = AdminConfig()
|
||||||
@@ -1181,7 +1208,7 @@ def playground():
|
|||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
|
|
||||||
discovery_tweets.run()
|
framework.add(discovery_tweets)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1215,7 +1242,8 @@ def playground():
|
|||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=DATABASE)
|
database=DATABASE)
|
||||||
discovery_global.run()
|
|
||||||
|
framework.add(discovery_global)
|
||||||
|
|
||||||
# discovery_test_sub = content_discovery_currently_popular.build_example_subscription("Currently Popular Notes DVM (with Subscriptions)", "discovery_content_test", admin_config)
|
# discovery_test_sub = content_discovery_currently_popular.build_example_subscription("Currently Popular Notes DVM (with Subscriptions)", "discovery_content_test", admin_config)
|
||||||
# discovery_test_sub.run()
|
# discovery_test_sub.run()
|
||||||
@@ -1262,6 +1290,10 @@ def playground():
|
|||||||
# update_db=update_db)
|
# update_db=update_db)
|
||||||
# discovery_nostriga.run()
|
# discovery_nostriga.run()
|
||||||
|
|
||||||
|
|
||||||
|
framework.run()
|
||||||
|
|
||||||
|
|
||||||
# Subscription Manager DVM
|
# Subscription Manager DVM
|
||||||
subscription_config = DVMConfig()
|
subscription_config = DVMConfig()
|
||||||
subscription_config.PRIVATE_KEY = check_and_set_private_key("dvm_subscription")
|
subscription_config.PRIVATE_KEY = check_and_set_private_key("dvm_subscription")
|
||||||
|
|||||||
@@ -1,22 +1,29 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
|
import signal
|
||||||
|
import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
import dotenv
|
import dotenv
|
||||||
from nostr_sdk import init_logger, LogLevel
|
from nostr_sdk import init_logger, LogLevel
|
||||||
|
|
||||||
|
from nostr_dvm.framework import DVMFramework
|
||||||
|
from nostr_dvm.tasks.content_discovery_currently_popular_gallery import DicoverContentCurrentlyPopularGallery
|
||||||
# os.environ["RUST_BACKTRACE"] = "full"
|
# os.environ["RUST_BACKTRACE"] = "full"
|
||||||
from nostr_dvm.tasks.content_discovery_on_this_day import DicoverContentOnThisDay
|
from nostr_dvm.tasks.content_discovery_on_this_day import DicoverContentOnThisDay
|
||||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||||
from nostr_dvm.utils.database_utils import init_db
|
from nostr_dvm.utils.database_utils import init_db
|
||||||
from nostr_dvm.utils.dvmconfig import build_default_config
|
from nostr_dvm.utils.dvmconfig import build_default_config
|
||||||
from nostr_dvm.utils.nip89_utils import create_amount_tag, NIP89Config, check_and_set_d_tag
|
from nostr_dvm.utils.nip89_utils import create_amount_tag, NIP89Config, check_and_set_d_tag, delete_nip_89
|
||||||
from nostr_dvm.utils.outbox_utils import AVOID_OUTBOX_RELAY_LIST
|
from nostr_dvm.utils.outbox_utils import AVOID_OUTBOX_RELAY_LIST
|
||||||
|
|
||||||
rebroadcast_NIP89 = False # Announce NIP89 on startup Only do this if you know what you're doing.
|
rebroadcast_NIP89 = True # Announce NIP89 on startup Only do this if you know what you're doing.
|
||||||
rebroadcast_NIP65_Relay_List = True
|
rebroadcast_NIP65_Relay_List = True
|
||||||
update_profile = True
|
update_profile = True
|
||||||
|
delete_nip_89_on_shutdown = False
|
||||||
|
|
||||||
global_update_rate = 60*60 # set this high on first sync so db can fully sync before another process trys to.
|
global_update_rate = 60*60 # set this high on first sync so db can fully sync before another process trys to.
|
||||||
use_logger = True
|
use_logger = True
|
||||||
@@ -36,6 +43,41 @@ SYNC_DB_RELAY_LIST = ["wss://relay.damus.io",
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
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.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.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_nip_89_on_shutdown
|
||||||
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
|
# Add NIP89
|
||||||
|
nip89info = {
|
||||||
|
"name": name,
|
||||||
|
"picture": image,
|
||||||
|
"about": "I show popular pictures from the Olas feed",
|
||||||
|
"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 DicoverContentCurrentlyPopularGallery(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||||
|
admin_config=admin_config, options=options)
|
||||||
|
|
||||||
|
|
||||||
def build_example_on_this_day(name, identifier, admin_config, options, image, description, update_rate=600, cost=0,
|
def build_example_on_this_day(name, identifier, admin_config, options, image, description, update_rate=600, cost=0,
|
||||||
processing_msg=None, update_db=True, database=None):
|
processing_msg=None, update_db=True, database=None):
|
||||||
@@ -53,6 +95,9 @@ def build_example_on_this_day(name, identifier, admin_config, options, image, de
|
|||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
dvm_config.DATABASE = database
|
dvm_config.DATABASE = database
|
||||||
dvm_config.SEND_FEEDBACK_EVENTS = False
|
dvm_config.SEND_FEEDBACK_EVENTS = False
|
||||||
|
dvm_config.DELETE_ANNOUNCEMENT_ON_SHUTDOWN = delete_nip_89_on_shutdown
|
||||||
|
|
||||||
|
|
||||||
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
admin_config.LUD16 = dvm_config.LN_ADDRESS
|
||||||
|
|
||||||
# Add NIP89
|
# Add NIP89
|
||||||
@@ -83,6 +128,10 @@ def build_example_on_this_day(name, identifier, admin_config, options, image, de
|
|||||||
|
|
||||||
|
|
||||||
def playground():
|
def playground():
|
||||||
|
|
||||||
|
framework = DVMFramework()
|
||||||
|
|
||||||
|
|
||||||
main_db = "db/nostr_on_this_day.db"
|
main_db = "db/nostr_on_this_day.db"
|
||||||
main_db_limit = 1024 # in mb
|
main_db_limit = 1024 # in mb
|
||||||
|
|
||||||
@@ -123,7 +172,46 @@ def playground():
|
|||||||
update_db=update_db,
|
update_db=update_db,
|
||||||
database=database)
|
database=database)
|
||||||
|
|
||||||
discovery_onthisday.run()
|
framework.add(discovery_onthisday)
|
||||||
|
|
||||||
|
|
||||||
|
admin_config_global_gallery = AdminConfig()
|
||||||
|
admin_config_global_gallery.REBROADCAST_NIP89 = rebroadcast_NIP89
|
||||||
|
admin_config_global_gallery.REBROADCAST_NIP65_RELAY_LIST = rebroadcast_NIP65_Relay_List
|
||||||
|
admin_config_global_gallery.UPDATE_PROFILE = update_profile
|
||||||
|
admin_config_global_gallery.DELETE_NIP89 = False
|
||||||
|
admin_config_global_gallery.PRIVKEY = ""
|
||||||
|
admin_config_global_gallery.EVENTID = ""
|
||||||
|
admin_config_global_gallery.POW = False
|
||||||
|
custom_processing_msg = ["Looking for popular Gallery entries"]
|
||||||
|
update_db = True
|
||||||
|
|
||||||
|
options_gallery = {
|
||||||
|
"db_name": "db/nostr_olas.db",
|
||||||
|
"db_since": 60 * 60 * 24 * 4, # 2d since gmt,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cost = 0
|
||||||
|
image = "https://image.nostr.build/f5901156825ef1d9dad557890020ce9c5d917f52bc31863226b980fa232a9c23.png"
|
||||||
|
discover_olas = build_example_gallery("Popular on Olas",
|
||||||
|
"discovery_gallery_entries",
|
||||||
|
admin_config=admin_config_global_gallery,
|
||||||
|
options=options_gallery,
|
||||||
|
image=image,
|
||||||
|
cost=cost,
|
||||||
|
update_rate=global_update_rate,
|
||||||
|
processing_msg=custom_processing_msg,
|
||||||
|
update_db=update_db)
|
||||||
|
|
||||||
|
|
||||||
|
framework.add(discover_olas)
|
||||||
|
|
||||||
|
framework.run()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
@@ -138,3 +226,8 @@ if __name__ == '__main__':
|
|||||||
else:
|
else:
|
||||||
raise FileNotFoundError(f'.env file not found at {env_path} ')
|
raise FileNotFoundError(f'.env file not found at {env_path} ')
|
||||||
playground()
|
playground()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user