mirror of
https://github.com/believethehype/nostrdvm.git
synced 2025-05-21 20:10:06 +02:00
print npub
This commit is contained in:
parent
be7d2280e2
commit
131cbea6f3
@ -139,7 +139,7 @@ class DVM:
|
|||||||
return
|
return
|
||||||
if self.dvm_config.LOGLEVEL.value >= LogLevel.INFO.value:
|
if self.dvm_config.LOGLEVEL.value >= LogLevel.INFO.value:
|
||||||
print(
|
print(
|
||||||
bcolors.MAGENTA + "[" + self.dvm_config.NIP89.NAME + "] Received new Request: " + task + " from " + user.name + bcolors.ENDC)
|
bcolors.MAGENTA + "[" + self.dvm_config.NIP89.NAME + "] Received new Request: " + task + " from " + user.name + " (" + user.npub + ")" + bcolors.ENDC)
|
||||||
duration = await input_data_file_duration(nip90_event, dvm_config=self.dvm_config, client=self.client)
|
duration = await input_data_file_duration(nip90_event, dvm_config=self.dvm_config, client=self.client)
|
||||||
amount = get_amount_per_task(task, self.dvm_config, duration)
|
amount = get_amount_per_task(task, self.dvm_config, duration)
|
||||||
if amount is None:
|
if amount is None:
|
||||||
@ -347,7 +347,7 @@ class DVM:
|
|||||||
config=self.dvm_config)
|
config=self.dvm_config)
|
||||||
if job_event is not None and task_supported:
|
if job_event is not None and task_supported:
|
||||||
print("NutZap received for NIP90 task: " + str(received_amount) + " Sats from " + str(
|
print("NutZap received for NIP90 task: " + str(received_amount) + " Sats from " + str(
|
||||||
user.name))
|
user.name + " (" + user.npub + ")" ))
|
||||||
if amount <= received_amount:
|
if amount <= received_amount:
|
||||||
print("[" + self.dvm_config.NIP89.NAME + "] Payment-request fulfilled...")
|
print("[" + self.dvm_config.NIP89.NAME + "] Payment-request fulfilled...")
|
||||||
await send_job_status_reaction(job_event, "processing", client=self.client,
|
await send_job_status_reaction(job_event, "processing", client=self.client,
|
||||||
@ -436,7 +436,7 @@ class DVM:
|
|||||||
config=self.dvm_config)
|
config=self.dvm_config)
|
||||||
if job_event is not None and task_supported:
|
if job_event is not None and task_supported:
|
||||||
print("Zap received for NIP90 task: " + str(invoice_amount) + " Sats from " + str(
|
print("Zap received for NIP90 task: " + str(invoice_amount) + " Sats from " + str(
|
||||||
user.name))
|
user.name + " (" + user.npub + ")" ))
|
||||||
if amount <= invoice_amount:
|
if amount <= invoice_amount:
|
||||||
print("[" + self.dvm_config.NIP89.NAME + "] Payment-request fulfilled...")
|
print("[" + self.dvm_config.NIP89.NAME + "] Payment-request fulfilled...")
|
||||||
await send_job_status_reaction(job_event, "processing", client=self.client,
|
await send_job_status_reaction(job_event, "processing", client=self.client,
|
||||||
@ -473,14 +473,14 @@ class DVM:
|
|||||||
"Someone zapped the result of an exisiting Task. Nice")
|
"Someone zapped the result of an exisiting Task. Nice")
|
||||||
elif not anon:
|
elif not anon:
|
||||||
print("[" + self.dvm_config.NIP89.NAME + "] Note Zap received for DVM balance: " +
|
print("[" + self.dvm_config.NIP89.NAME + "] Note Zap received for DVM balance: " +
|
||||||
str(invoice_amount) + " Sats from " + str(user.name))
|
str(invoice_amount) + " Sats from " + str(user.name + " (" + user.npub + ")" ))
|
||||||
# update_user_balance(self.dvm_config.DB, sender, invoice_amount, client=self.client,
|
# update_user_balance(self.dvm_config.DB, sender, invoice_amount, client=self.client,
|
||||||
# config=self.dvm_config)
|
# config=self.dvm_config)
|
||||||
|
|
||||||
# a regular note
|
# a regular note
|
||||||
elif not anon and dvm_config.NIP88 is None:
|
elif not anon and dvm_config.NIP88 is None:
|
||||||
print("[" + self.dvm_config.NIP89.NAME + "] Profile Zap received for DVM balance: " +
|
print("[" + self.dvm_config.NIP89.NAME + "] Profile Zap received for DVM balance: " +
|
||||||
str(invoice_amount) + " Sats from " + str(user.name))
|
str(invoice_amount) + " Sats from " + str(user.name + " (" + user.npub + ")"))
|
||||||
# update_user_balance(self.dvm_config.DB, sender, invoice_amount, client=self.client,
|
# update_user_balance(self.dvm_config.DB, sender, invoice_amount, client=self.client,
|
||||||
# config=self.dvm_config)
|
# config=self.dvm_config)
|
||||||
|
|
||||||
|
@ -38,10 +38,14 @@ class DicoverContentCurrentlyPopularNonFollowers(DVMTaskInterface):
|
|||||||
must_list = []
|
must_list = []
|
||||||
personalized = True
|
personalized = True
|
||||||
result = ""
|
result = ""
|
||||||
|
database = None
|
||||||
|
|
||||||
async def init_dvm(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
async def init_dvm(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
||||||
admin_config: AdminConfig = None, options=None):
|
admin_config: AdminConfig = None, options=None):
|
||||||
|
|
||||||
|
if dvm_config.DATABASE is not None:
|
||||||
|
self.database = dvm_config.DATABASE
|
||||||
|
|
||||||
self.request_form = {"jobID": "generic"}
|
self.request_form = {"jobID": "generic"}
|
||||||
opts = {
|
opts = {
|
||||||
"max_results": 200,
|
"max_results": 200,
|
||||||
@ -141,9 +145,10 @@ class DicoverContentCurrentlyPopularNonFollowers(DVMTaskInterface):
|
|||||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||||
keys = Keys.parse(sk.to_hex())
|
keys = Keys.parse(sk.to_hex())
|
||||||
signer = NostrSigner.keys(keys)
|
signer = NostrSigner.keys(keys)
|
||||||
database = await NostrDatabase.sqlite(self.db_name)
|
if self.database is None:
|
||||||
|
self.database = await NostrDatabase.sqlite(self.db_name)
|
||||||
|
|
||||||
cli = ClientBuilder().database(database).signer(signer).opts(opts).build()
|
cli = ClientBuilder().database(self.database).signer(signer).opts(opts).build()
|
||||||
for relay in self.dvm_config.RECONCILE_DB_RELAY_LIST:
|
for relay in self.dvm_config.RECONCILE_DB_RELAY_LIST:
|
||||||
await cli.add_relay(relay)
|
await cli.add_relay(relay)
|
||||||
|
|
||||||
@ -179,7 +184,7 @@ class DicoverContentCurrentlyPopularNonFollowers(DVMTaskInterface):
|
|||||||
|
|
||||||
filter1 = Filter().kind(definitions.EventDefinitions.KIND_NOTE).since(since)
|
filter1 = Filter().kind(definitions.EventDefinitions.KIND_NOTE).since(since)
|
||||||
|
|
||||||
events = await database.query([filter1])
|
events = await self.database.query([filter1])
|
||||||
|
|
||||||
print("[" + self.dvm_config.NIP89.NAME + "] Considering " + str(len(events)) + " Events")
|
print("[" + self.dvm_config.NIP89.NAME + "] Considering " + str(len(events)) + " Events")
|
||||||
ns.finallist = {}
|
ns.finallist = {}
|
||||||
@ -192,7 +197,7 @@ class DicoverContentCurrentlyPopularNonFollowers(DVMTaskInterface):
|
|||||||
[definitions.EventDefinitions.KIND_ZAP, definitions.EventDefinitions.KIND_REACTION,
|
[definitions.EventDefinitions.KIND_ZAP, definitions.EventDefinitions.KIND_REACTION,
|
||||||
definitions.EventDefinitions.KIND_REPOST,
|
definitions.EventDefinitions.KIND_REPOST,
|
||||||
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||||
reactions = await database.query([filt])
|
reactions = await self.database.query([filt])
|
||||||
if len(reactions) >= self.min_reactions:
|
if len(reactions) >= self.min_reactions:
|
||||||
ns.finallist[event.id().to_hex()] = len(reactions)
|
ns.finallist[event.id().to_hex()] = len(reactions)
|
||||||
|
|
||||||
|
@ -37,10 +37,14 @@ class DicoverContentCurrentlyPopularbyTopic(DVMTaskInterface):
|
|||||||
must_list = []
|
must_list = []
|
||||||
personalized = False
|
personalized = False
|
||||||
result = ""
|
result = ""
|
||||||
|
database = None
|
||||||
|
|
||||||
|
|
||||||
async def init_dvm(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
async def init_dvm(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
||||||
admin_config: AdminConfig = None, options=None):
|
admin_config: AdminConfig = None, options=None):
|
||||||
|
|
||||||
|
if dvm_config.DATABASE is not None:
|
||||||
|
self.database = dvm_config.DATABASE
|
||||||
self.request_form = {"jobID": "generic"}
|
self.request_form = {"jobID": "generic"}
|
||||||
opts = {
|
opts = {
|
||||||
"max_results": 200,
|
"max_results": 200,
|
||||||
@ -139,14 +143,15 @@ class DicoverContentCurrentlyPopularbyTopic(DVMTaskInterface):
|
|||||||
ns = SimpleNamespace()
|
ns = SimpleNamespace()
|
||||||
|
|
||||||
options = self.set_options(request_form)
|
options = self.set_options(request_form)
|
||||||
database = await NostrDatabase.sqlite(self.db_name)
|
if self.database is None:
|
||||||
|
self.database = await NostrDatabase.sqlite(self.db_name)
|
||||||
|
|
||||||
timestamp_since = Timestamp.now().as_secs() - self.db_since
|
timestamp_since = Timestamp.now().as_secs() - self.db_since
|
||||||
since = Timestamp.from_secs(timestamp_since)
|
since = Timestamp.from_secs(timestamp_since)
|
||||||
|
|
||||||
filter1 = Filter().kind(definitions.EventDefinitions.KIND_NOTE).since(since)
|
filter1 = Filter().kind(definitions.EventDefinitions.KIND_NOTE).since(since)
|
||||||
|
|
||||||
events = await database.query([filter1])
|
events = await self.database.query([filter1])
|
||||||
if self.dvm_config.LOGLEVEL.value >= LogLevel.DEBUG.value:
|
if self.dvm_config.LOGLEVEL.value >= LogLevel.DEBUG.value:
|
||||||
print("[" + self.dvm_config.NIP89.NAME + "] Considering " + str(len(events)) + " Events")
|
print("[" + self.dvm_config.NIP89.NAME + "] Considering " + str(len(events)) + " Events")
|
||||||
ns.finallist = {}
|
ns.finallist = {}
|
||||||
@ -159,7 +164,7 @@ class DicoverContentCurrentlyPopularbyTopic(DVMTaskInterface):
|
|||||||
[definitions.EventDefinitions.KIND_ZAP, definitions.EventDefinitions.KIND_REACTION,
|
[definitions.EventDefinitions.KIND_ZAP, definitions.EventDefinitions.KIND_REACTION,
|
||||||
definitions.EventDefinitions.KIND_REPOST,
|
definitions.EventDefinitions.KIND_REPOST,
|
||||||
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||||
reactions = await database.query([filt])
|
reactions = await self.database.query([filt])
|
||||||
if len(reactions) >= self.min_reactions:
|
if len(reactions) >= self.min_reactions:
|
||||||
ns.finallist[event.id().to_hex()] = len(reactions)
|
ns.finallist[event.id().to_hex()] = len(reactions)
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ class DicoverContentDBUpdateScheduler(DVMTaskInterface):
|
|||||||
must_list = []
|
must_list = []
|
||||||
personalized = False
|
personalized = False
|
||||||
result = ""
|
result = ""
|
||||||
|
database = None
|
||||||
|
|
||||||
async def init_dvm(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
async def init_dvm(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
||||||
admin_config: AdminConfig = None, options=None):
|
admin_config: AdminConfig = None, options=None):
|
||||||
@ -46,6 +47,8 @@ class DicoverContentDBUpdateScheduler(DVMTaskInterface):
|
|||||||
# Generate Generic request form for dvms that provide generic results (e.g only a calculation per update,
|
# Generate Generic request form for dvms that provide generic results (e.g only a calculation per update,
|
||||||
# not per call)
|
# not per call)
|
||||||
self.request_form = {"jobID": "generic"}
|
self.request_form = {"jobID": "generic"}
|
||||||
|
if dvm_config.DATABASE is not None:
|
||||||
|
self.database = dvm_config.DATABASE
|
||||||
opts = {
|
opts = {
|
||||||
"max_results": 200,
|
"max_results": 200,
|
||||||
}
|
}
|
||||||
@ -128,8 +131,9 @@ class DicoverContentDBUpdateScheduler(DVMTaskInterface):
|
|||||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||||
keys = Keys.parse(sk.to_hex())
|
keys = Keys.parse(sk.to_hex())
|
||||||
signer = NostrSigner.keys(keys)
|
signer = NostrSigner.keys(keys)
|
||||||
database = await NostrDatabase.sqlite(self.db_name)
|
if self.database is None:
|
||||||
cli = ClientBuilder().signer(signer).database(database).opts(opts).build()
|
self.database = await NostrDatabase.sqlite(self.db_name)
|
||||||
|
cli = ClientBuilder().signer(signer).database(self.database).opts(opts).build()
|
||||||
|
|
||||||
for relay in self.dvm_config.RECONCILE_DB_RELAY_LIST:
|
for relay in self.dvm_config.RECONCILE_DB_RELAY_LIST:
|
||||||
await cli.add_relay(relay)
|
await cli.add_relay(relay)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
from nostr_sdk import Keys, LogLevel
|
from nostr_sdk import Keys, LogLevel, PublicKey
|
||||||
|
|
||||||
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
|
||||||
@ -24,13 +24,28 @@ class DVMConfig:
|
|||||||
"wss://nostr.oxtr.dev",
|
"wss://nostr.oxtr.dev",
|
||||||
"wss://relay.nostr.net" , "wss://relay.primal.net"] #, "wss://relay.snort.social"]
|
"wss://relay.nostr.net" , "wss://relay.primal.net"] #, "wss://relay.snort.social"]
|
||||||
|
|
||||||
MUTE = ["npub1x5vhtx7j2prvueeenwf7tmesrzmuzc50zs0aakgd75v5c30ekj3s5zjckj",
|
# Straight Censorship (reply guy spam)
|
||||||
"npub1l03urys27uet2u6wq6u90rnzf7kv5c3wfu3cyndqz9lq75g46c5q0wkpsj",
|
MUTE = [PublicKey.parse("npub1x5vhtx7j2prvueeenwf7tmesrzmuzc50zs0aakgd75v5c30ekj3s5zjckj"),
|
||||||
"npub17g7qhlu4caefd88vateedm9wau9ys6xt6jhjcfu2kqyw9xmnucxs5d6crj",
|
PublicKey.parse("npub1l03urys27uet2u6wq6u90rnzf7kv5c3wfu3cyndqz9lq75g46c5q0wkpsj"),
|
||||||
"npub1epwccahqndqhseh6q02seu40cqa2ghk3u9tvu92yh4hd6lmxg33spwzujc",
|
PublicKey.parse("npub17g7qhlu4caefd88vateedm9wau9ys6xt6jhjcfu2kqyw9xmnucxs5d6crj"),
|
||||||
"npub1v0kgu3hymtd4fw9zrlem6l74c3cwl8jdqentt4qsxrrzan6paxaqkkf6dr",
|
PublicKey.parse("npub1epwccahqndqhseh6q02seu40cqa2ghk3u9tvu92yh4hd6lmxg33spwzujc"),
|
||||||
|
PublicKey.parse("npub1v0kgu3hymtd4fw9zrlem6l74c3cwl8jdqentt4qsxrrzan6paxaqkkf6dr"),
|
||||||
|
PublicKey.parse("npub1y8teqt2jay2ulww87wlmpe97gxhjqvhva60jv3ghp8emgk2da3psc2x7lt"),
|
||||||
|
PublicKey.parse("npub1drz9ts6esv22vplg9vunajwhts4ecaxvusmpxwy8yy683ejnzfnqvfvtk9"),
|
||||||
|
PublicKey.parse("npub1af5hgjkjpdqavpu3xqz092xjrvrpr3nzfftp4pgh4nez635hznas7m0vvn"),
|
||||||
|
PublicKey.parse("npub1rwxfxn33mmt9fe66qwg25lm9pm3nwtj5za5qm5cpqjsxlhk3dtsqkmunfe"),
|
||||||
|
PublicKey.parse("npub1l6y4l424ggvstc8a40n5c4rf8wwt5hlt5vuhn4dzvx9xf0eff9uqnc2fuw"),
|
||||||
|
PublicKey.parse("npub1q57y985vcazhx87naj5qhdyxxmtrrqakfq7lmvhxppvduqpfkesq3n46e8"),
|
||||||
|
PublicKey.parse("npub1dryv50m3rl6cx6ajeakmh3ygz83vjcdf6cga99yllmfx9ugqa04st0nk3w"),
|
||||||
|
PublicKey.parse("npub1xh3n3q2cp2wf9r66mmzmkyunyj8cf5r8aszsvwtdld6upqjmkxcsxgejsd"),
|
||||||
|
PublicKey.parse("npub1cek65lcyks0jjwx4y47c0zxmx8y22zn7zmhxktfjr32h2z5wtgeqn70vjc"),
|
||||||
|
PublicKey.parse("npub1y2v5mqw32m7n8mz4wpypcy7wt0t4hg93g67qw0fuyspjdspk0etqm0xx9y"),
|
||||||
|
PublicKey.parse("npub1cfgr520quxl8p74f5r3u5snt05dxyshfk88tcm5tuj78ypkdhgyqcpxkx2"),
|
||||||
|
PublicKey.parse("npub1620alhm0dyn063wlrlp6r8xzxlzdk9pp94xfag99gghj92wentlq23t6rz"),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
AVOID_PAID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
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.
|
||||||
|
|
||||||
@ -46,6 +61,7 @@ class DVMConfig:
|
|||||||
IDENTIFIER = ''
|
IDENTIFIER = ''
|
||||||
USE_OWN_VENV = False # Make an own venv for each dvm's process function.Disable if you want to install packages into main venv. Only recommended if you dont want to run dvms with different dependency versions
|
USE_OWN_VENV = False # Make an own venv for each dvm's process function.Disable if you want to install packages into main venv. Only recommended if you dont want to run dvms with different dependency versions
|
||||||
DB: str
|
DB: str
|
||||||
|
DATABASE = None
|
||||||
NEW_USER_BALANCE: int = 0 # Free credits for new users
|
NEW_USER_BALANCE: int = 0 # Free credits for new users
|
||||||
SUBSCRIPTION_MANAGEMENT = 'https://noogle.lol/discovery'
|
SUBSCRIPTION_MANAGEMENT = 'https://noogle.lol/discovery'
|
||||||
NIP88: NIP88Config = NIP88Config()
|
NIP88: NIP88Config = NIP88Config()
|
||||||
|
@ -204,23 +204,19 @@ async def send_event_outbox(event: Event, client, dvm_config) -> EventId:
|
|||||||
relaylimits = RelayLimits.disable()
|
relaylimits = RelayLimits.disable()
|
||||||
connection = Connection().embedded_tor().target(ConnectionTarget.ONION)
|
connection = Connection().embedded_tor().target(ConnectionTarget.ONION)
|
||||||
#connection = Connection().addr("127.0.0.1:9050").target(ConnectionTarget.ONION)
|
#connection = Connection().addr("127.0.0.1:9050").target(ConnectionTarget.ONION)
|
||||||
opts = (
|
opts = ((
|
||||||
Options().wait_for_send(False).send_timeout(timedelta(seconds=20)).relay_limits(
|
Options().wait_for_send(False).send_timeout(timedelta(seconds=5)).relay_limits(
|
||||||
relaylimits)).connection(connection).connection_timeout(timedelta(seconds=120))
|
relaylimits)).connection(connection).connection_timeout(timedelta(seconds=30)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sk = SecretKey.from_hex(dvm_config.PRIVATE_KEY)
|
sk = SecretKey.from_hex(dvm_config.PRIVATE_KEY)
|
||||||
keys = Keys.parse(sk.to_hex())
|
keys = Keys.parse(sk.to_hex())
|
||||||
signer = NostrSigner.keys(keys)
|
signer = NostrSigner.keys(keys)
|
||||||
client = Client.with_opts(signer, opts)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
outboxclient = Client.with_opts(signer, opts)
|
outboxclient = Client.with_opts(signer, opts)
|
||||||
print("[" + dvm_config.NIP89.NAME + "] Receiver Inbox relays: " + str(relays))
|
print("[" + dvm_config.NIP89.NAME + "] Receiver Inbox relays: " + str(relays))
|
||||||
|
|
||||||
for relay in relays:
|
for relay in relays[:5]:
|
||||||
try:
|
try:
|
||||||
await outboxclient.add_relay(relay)
|
await outboxclient.add_relay(relay)
|
||||||
except:
|
except:
|
||||||
@ -289,6 +285,7 @@ async def send_event(event: Event, client: Client, dvm_config, blastr=False):
|
|||||||
event_id = None
|
event_id = None
|
||||||
|
|
||||||
for relay in relays:
|
for relay in relays:
|
||||||
|
if relay not in dvm_config.RELAY_LIST:
|
||||||
if relay not in dvm_config.RELAY_LIST:
|
if relay not in dvm_config.RELAY_LIST:
|
||||||
await client.remove_relay(relay)
|
await client.remove_relay(relay)
|
||||||
#if blastr:
|
#if blastr:
|
||||||
|
2
setup.py
2
setup.py
@ -1,6 +1,6 @@
|
|||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
VERSION = '0.8.19'
|
VERSION = '0.8.20'
|
||||||
DESCRIPTION = 'A framework to build and run Nostr NIP90 Data Vending Machines'
|
DESCRIPTION = 'A framework to build and run Nostr NIP90 Data Vending Machines'
|
||||||
LONG_DESCRIPTION = ('A framework to build and run Nostr NIP90 Data Vending Machines. See the github repository for more information')
|
LONG_DESCRIPTION = ('A framework to build and run Nostr NIP90 Data Vending Machines. See the github repository for more information')
|
||||||
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
|
import asyncio
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import threading
|
import threading
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import dotenv
|
import dotenv
|
||||||
from nostr_sdk import init_logger, LogLevel, Keys, NostrLibrary
|
from nostr_sdk import init_logger, LogLevel, Keys, NostrDatabase
|
||||||
|
|
||||||
from nostr_dvm.tasks.content_discovery_currently_latest_longform import DicoverContentLatestLongForm
|
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_latest_wiki import DicoverContentLatestWiki
|
||||||
@ -35,13 +36,13 @@ rebroadcast_NIP89 = False # Announce NIP89 on startup Only do this if you know
|
|||||||
rebroadcast_NIP65_Relay_List = True
|
rebroadcast_NIP65_Relay_List = True
|
||||||
update_profile = False
|
update_profile = False
|
||||||
|
|
||||||
global_update_rate = 120 # 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 = False
|
||||||
log_level = LogLevel.ERROR
|
log_level = LogLevel.INFO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RECONCILE_DB_RELAY_LIST = [ "wss://relay.nostr.net", "wss://relay.nostr.bg", "wss://relay.damus.io", "wss://nostr.oxtr.dev"]
|
RECONCILE_DB_RELAY_LIST = [ "wss://relay.nostr.net", "wss://relay.damus.io", "wss://nostr.oxtr.dev"]
|
||||||
RELAY_LIST = ["wss://relay.primal.net",
|
RELAY_LIST = ["wss://relay.primal.net",
|
||||||
"wss://nostr.mom", "wss://nostr.oxtr.dev",
|
"wss://nostr.mom", "wss://nostr.oxtr.dev",
|
||||||
"wss://relay.nostr.net"
|
"wss://relay.nostr.net"
|
||||||
@ -52,7 +53,7 @@ if use_logger:
|
|||||||
|
|
||||||
|
|
||||||
def build_db_scheduler(name, identifier, admin_config, options, image, description, update_rate=600, cost=0,
|
def build_db_scheduler(name, identifier, admin_config, options, image, description, update_rate=600, cost=0,
|
||||||
processing_msg=None, update_db=True):
|
processing_msg=None, update_db=True, database=None):
|
||||||
dvm_config = build_default_config(identifier)
|
dvm_config = build_default_config(identifier)
|
||||||
dvm_config.USE_OWN_VENV = False
|
dvm_config.USE_OWN_VENV = False
|
||||||
dvm_config.SHOWLOG = True
|
dvm_config.SHOWLOG = True
|
||||||
@ -61,6 +62,7 @@ def build_db_scheduler(name, identifier, admin_config, options, image, descripti
|
|||||||
dvm_config.LOGLEVEL = LogLevel.INFO
|
dvm_config.LOGLEVEL = LogLevel.INFO
|
||||||
dvm_config.RECONCILE_DB_RELAY_LIST = RECONCILE_DB_RELAY_LIST
|
dvm_config.RECONCILE_DB_RELAY_LIST = RECONCILE_DB_RELAY_LIST
|
||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
|
dvm_config.DATABASE = database
|
||||||
|
|
||||||
# Activate these to use a subscription based model instead
|
# Activate these to use a subscription based model instead
|
||||||
# dvm_config.SUBSCRIPTION_REQUIRED = True
|
# dvm_config.SUBSCRIPTION_REQUIRED = True
|
||||||
@ -276,7 +278,7 @@ def build_wiki(name, identifier, admin_config, options, cost=0, update_rate=180,
|
|||||||
|
|
||||||
|
|
||||||
def build_example_topic(name, identifier, admin_config, options, image, description, update_rate=600, cost=0,
|
def build_example_topic(name, identifier, admin_config, options, image, description, update_rate=600, cost=0,
|
||||||
processing_msg=None, update_db=True):
|
processing_msg=None, update_db=True, database=None):
|
||||||
dvm_config = build_default_config(identifier)
|
dvm_config = build_default_config(identifier)
|
||||||
dvm_config.USE_OWN_VENV = False
|
dvm_config.USE_OWN_VENV = False
|
||||||
dvm_config.SHOWLOG = True
|
dvm_config.SHOWLOG = True
|
||||||
@ -287,6 +289,7 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
|||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
dvm_config.AVOID_PAID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
dvm_config.AVOID_PAID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
|
dvm_config.DATABASE = database
|
||||||
#dvm_config.RELAY_LIST = ["wss://dvms.f7z.io",
|
#dvm_config.RELAY_LIST = ["wss://dvms.f7z.io",
|
||||||
# "wss://nostr.mom", "wss://nostr.oxtr.dev", "wss://relay.nostr.bg"
|
# "wss://nostr.mom", "wss://nostr.oxtr.dev", "wss://relay.nostr.bg"
|
||||||
# ]
|
# ]
|
||||||
@ -321,7 +324,7 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
|||||||
|
|
||||||
|
|
||||||
def build_example_popular(name, identifier, admin_config, options, image, cost=0, update_rate=180, processing_msg=None,
|
def build_example_popular(name, identifier, admin_config, options, image, cost=0, update_rate=180, processing_msg=None,
|
||||||
update_db=True):
|
update_db=True, database=None):
|
||||||
dvm_config = build_default_config(identifier)
|
dvm_config = build_default_config(identifier)
|
||||||
dvm_config.USE_OWN_VENV = False
|
dvm_config.USE_OWN_VENV = False
|
||||||
dvm_config.LOGLEVEL = LogLevel.INFO
|
dvm_config.LOGLEVEL = LogLevel.INFO
|
||||||
@ -334,6 +337,7 @@ def build_example_popular(name, identifier, admin_config, options, image, cost=0
|
|||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
dvm_config.AVOID_PAID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
dvm_config.AVOID_PAID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
|
dvm_config.DATABASE = database
|
||||||
#dvm_config.RELAY_LIST = ["wss://dvms.f7z.io",
|
#dvm_config.RELAY_LIST = ["wss://dvms.f7z.io",
|
||||||
# "wss://nostr.mom", "wss://nostr.oxtr.dev", "wss://relay.nostr.bg"
|
# "wss://nostr.mom", "wss://nostr.oxtr.dev", "wss://relay.nostr.bg"
|
||||||
# ]
|
# ]
|
||||||
@ -412,7 +416,7 @@ def build_example_popular_followers(name, identifier, admin_config, options, ima
|
|||||||
admin_config=admin_config)
|
admin_config=admin_config)
|
||||||
|
|
||||||
def build_example_popular_non_followers(name, identifier, admin_config, options, image, cost=0, update_rate=300,
|
def build_example_popular_non_followers(name, identifier, admin_config, options, image, cost=0, update_rate=300,
|
||||||
processing_msg=None, update_db=True):
|
processing_msg=None, update_db=True, database=None):
|
||||||
|
|
||||||
|
|
||||||
dvm_config = build_default_config(identifier)
|
dvm_config = build_default_config(identifier)
|
||||||
@ -421,6 +425,7 @@ def build_example_popular_non_followers(name, identifier, admin_config, options,
|
|||||||
dvm_config.LOGLEVEL = LogLevel.DEBUG
|
dvm_config.LOGLEVEL = LogLevel.DEBUG
|
||||||
dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes
|
dvm_config.SCHEDULE_UPDATES_SECONDS = update_rate # Every 10 minutes
|
||||||
dvm_config.UPDATE_DATABASE = update_db
|
dvm_config.UPDATE_DATABASE = update_db
|
||||||
|
dvm_config.DATABASE = database
|
||||||
# Activate these to use a subscription based model instead
|
# Activate these to use a subscription based model instead
|
||||||
dvm_config.FIX_COST = cost
|
dvm_config.FIX_COST = cost
|
||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
@ -481,7 +486,7 @@ def build_example_popular_non_followers(name, identifier, admin_config, options,
|
|||||||
|
|
||||||
def build_example_top_zapped(name, identifier, admin_config, options, image, cost=0, update_rate=180,
|
def build_example_top_zapped(name, identifier, admin_config, options, image, cost=0, update_rate=180,
|
||||||
processing_msg=None,
|
processing_msg=None,
|
||||||
update_db=True):
|
update_db=True, database=None):
|
||||||
dvm_config = build_default_config(identifier)
|
dvm_config = build_default_config(identifier)
|
||||||
dvm_config.USE_OWN_VENV = False
|
dvm_config.USE_OWN_VENV = False
|
||||||
dvm_config.SHOWLOG = True
|
dvm_config.SHOWLOG = True
|
||||||
@ -493,6 +498,7 @@ def build_example_top_zapped(name, identifier, admin_config, options, image, cos
|
|||||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||||
dvm_config.AVOID_PAID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
dvm_config.AVOID_PAID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
||||||
dvm_config.RELAY_LIST = RELAY_LIST
|
dvm_config.RELAY_LIST = RELAY_LIST
|
||||||
|
dvm_config.DATABASE = database
|
||||||
#dvm_config.RELAY_LIST = ["wss://dvms.f7z.io",
|
#dvm_config.RELAY_LIST = ["wss://dvms.f7z.io",
|
||||||
# "wss://nostr.mom", "wss://nostr.oxtr.dev", "wss://relay.nostr.bg"
|
# "wss://nostr.mom", "wss://nostr.oxtr.dev", "wss://relay.nostr.bg"
|
||||||
# ]
|
# ]
|
||||||
@ -623,15 +629,18 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
|||||||
admin_config=admin_config, options=options)
|
admin_config=admin_config, options=options)
|
||||||
|
|
||||||
|
|
||||||
|
async def init_db(database):
|
||||||
|
return await NostrDatabase.sqlite(database)
|
||||||
|
|
||||||
def playground():
|
def playground():
|
||||||
|
|
||||||
|
main_db = "db/nostr_recent_notes.db"
|
||||||
|
DATABASE = asyncio.run(init_db(main_db))
|
||||||
#DB Scheduler, do not announce, just use it to update the DB for the other DVMs.
|
#DB Scheduler, do not announce, just use it to update the DB for the other DVMs.
|
||||||
admin_config_db_scheduler= AdminConfig()
|
admin_config_db_scheduler= AdminConfig()
|
||||||
options_animal = {
|
options_animal = {
|
||||||
"db_name": "db/nostr_recent_notes.db",
|
"db_name": main_db,
|
||||||
"db_since": 24 * 60 * 60, # 48h since gmt,
|
"db_since": 12 * 60 * 60, # 48h since gmt,
|
||||||
"personalized": False,
|
"personalized": False,
|
||||||
"logger": False}
|
"logger": False}
|
||||||
image = ""
|
image = ""
|
||||||
@ -643,7 +652,8 @@ def playground():
|
|||||||
description=about,
|
description=about,
|
||||||
update_rate=global_update_rate,
|
update_rate=global_update_rate,
|
||||||
cost=0,
|
cost=0,
|
||||||
update_db=True)
|
update_db=True,
|
||||||
|
database=DATABASE)
|
||||||
db_scheduler.run()
|
db_scheduler.run()
|
||||||
|
|
||||||
|
|
||||||
@ -665,19 +675,19 @@ def playground():
|
|||||||
"db_since": 60 * 60 * 24 * 30, # 1h since gmt,
|
"db_since": 60 * 60 * 24 * 30, # 1h since gmt,
|
||||||
}
|
}
|
||||||
|
|
||||||
cost = 0
|
# cost = 0
|
||||||
image = "https://i.nostr.build/4Rw6lrsH5O0P5zjT.jpg"
|
# image = "https://i.nostr.build/4Rw6lrsH5O0P5zjT.jpg"
|
||||||
discover_gallery = build_example_gallery("Gallery entries",
|
# discover_gallery = build_example_gallery("Gallery entries",
|
||||||
"discovery_gallery_entries",
|
# "discovery_gallery_entries",
|
||||||
admin_config=admin_config_gallery,
|
# admin_config=admin_config_gallery,
|
||||||
options=options_gallery,
|
# options=options_gallery,
|
||||||
image=image,
|
# image=image,
|
||||||
cost=cost,
|
# cost=cost,
|
||||||
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)
|
||||||
discover_gallery.run()
|
# discover_gallery.run()
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
# Latest Longform
|
# Latest Longform
|
||||||
@ -755,7 +765,7 @@ def playground():
|
|||||||
|
|
||||||
options_top_zapped = {
|
options_top_zapped = {
|
||||||
"db_name": "db/nostr_recent_notes.db",
|
"db_name": "db/nostr_recent_notes.db",
|
||||||
"db_since": 60 * 60 * 6, # 8h since gmt,
|
"db_since": 60 * 60 * 2, # 8h since gmt,
|
||||||
}
|
}
|
||||||
cost = 0
|
cost = 0
|
||||||
#image = "https://image.nostr.build/c6879f458252641d04d0aa65fd7f1e005a4f7362fd407467306edc2f4acdb113.jpg"
|
#image = "https://image.nostr.build/c6879f458252641d04d0aa65fd7f1e005a4f7362fd407467306edc2f4acdb113.jpg"
|
||||||
@ -768,7 +778,8 @@ def playground():
|
|||||||
cost=cost,
|
cost=cost,
|
||||||
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,
|
||||||
|
database=DATABASE)
|
||||||
|
|
||||||
discovery_topzaps.run()
|
discovery_topzaps.run()
|
||||||
|
|
||||||
@ -856,7 +867,7 @@ def playground():
|
|||||||
|
|
||||||
"must_list": ["http"],
|
"must_list": ["http"],
|
||||||
"db_name": "db/nostr_recent_notes.db",
|
"db_name": "db/nostr_recent_notes.db",
|
||||||
"db_since": 24 * 60 * 60, # 48h since gmt,
|
"db_since": 12 * 60 * 60, # 48h since gmt,
|
||||||
"personalized": False,
|
"personalized": False,
|
||||||
"logger": False}
|
"logger": False}
|
||||||
|
|
||||||
@ -875,7 +886,8 @@ def playground():
|
|||||||
update_rate=global_update_rate,
|
update_rate=global_update_rate,
|
||||||
cost=cost,
|
cost=cost,
|
||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db)
|
update_db=update_db,
|
||||||
|
database = DATABASE)
|
||||||
|
|
||||||
discovery_animals.run()
|
discovery_animals.run()
|
||||||
|
|
||||||
@ -923,7 +935,8 @@ def playground():
|
|||||||
update_rate=global_update_rate,
|
update_rate=global_update_rate,
|
||||||
cost=cost,
|
cost=cost,
|
||||||
processing_msg=custom_processing_msg,
|
processing_msg=custom_processing_msg,
|
||||||
update_db=update_db)
|
update_db=update_db,
|
||||||
|
database=DATABASE)
|
||||||
discovery_garden.run()
|
discovery_garden.run()
|
||||||
|
|
||||||
# Popular Followers
|
# Popular Followers
|
||||||
@ -943,6 +956,7 @@ def playground():
|
|||||||
"db_name": "db/nostr_recent_notes.db",
|
"db_name": "db/nostr_recent_notes.db",
|
||||||
"db_since": 2 * 60 * 60, # 2h since gmt,
|
"db_since": 2 * 60 * 60, # 2h since gmt,
|
||||||
}
|
}
|
||||||
|
|
||||||
cost = 0
|
cost = 0
|
||||||
#image = "https://image.nostr.build/d92652a6a07677e051d647dcf9f0f59e265299b3335a939d008183a911513f4a.jpg"
|
#image = "https://image.nostr.build/d92652a6a07677e051d647dcf9f0f59e265299b3335a939d008183a911513f4a.jpg"
|
||||||
image = "https://i.nostr.build/ZJqko0W9ApEVZAPt.png"
|
image = "https://i.nostr.build/ZJqko0W9ApEVZAPt.png"
|
||||||
@ -987,7 +1001,8 @@ def playground():
|
|||||||
image=image,
|
image=image,
|
||||||
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,
|
||||||
|
database=DATABASE)
|
||||||
discovery_non_followers.run()
|
discovery_non_followers.run()
|
||||||
|
|
||||||
admin_config_opf = AdminConfig()
|
admin_config_opf = AdminConfig()
|
||||||
@ -1047,7 +1062,8 @@ def playground():
|
|||||||
cost=cost,
|
cost=cost,
|
||||||
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,
|
||||||
|
database=DATABASE)
|
||||||
discovery_global.run()
|
discovery_global.run()
|
||||||
|
|
||||||
# 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)
|
||||||
@ -1059,9 +1075,9 @@ def playground():
|
|||||||
admin_config_nostriga.REBROADCAST_NIP65_RELAY_LIST = False #rebroadcast_NIP65_Relay_List
|
admin_config_nostriga.REBROADCAST_NIP65_RELAY_LIST = False #rebroadcast_NIP65_Relay_List
|
||||||
admin_config_nostriga.UPDATE_PROFILE = update_profile
|
admin_config_nostriga.UPDATE_PROFILE = update_profile
|
||||||
admin_config_nostriga.DELETE_NIP89 = True
|
admin_config_nostriga.DELETE_NIP89 = True
|
||||||
admin_config_nostriga.PRIVKEY = "6221e31813df07037dd90a608fc4cf29222c59da130f76c7f8d0d19c3a876d8e"
|
#admin_config_nostriga.PRIVKEY = "6221e31813df07037dd90a608fc4cf29222c59da130f76c7f8d0d19c3a876d8e"
|
||||||
admin_config_nostriga.EVENTID = "24ac21fb32993744232356bafcabd821e4afed4b18aac8d7e670d1071f6ad77a"
|
#admin_config_nostriga.EVENTID = "24ac21fb32993744232356bafcabd821e4afed4b18aac8d7e670d1071f6ad77a"
|
||||||
admin_config_nostriga.POW = True
|
#admin_config_nostriga.POW = True
|
||||||
options_nostriga = {
|
options_nostriga = {
|
||||||
"search_list": ["nostriga", "#nostriga", "#noobday" ],
|
"search_list": ["nostriga", "#nostriga", "#noobday" ],
|
||||||
"avoid_list": ["porn", "smoke", "nsfw",
|
"avoid_list": ["porn", "smoke", "nsfw",
|
||||||
|
@ -221,6 +221,7 @@ async def nostr_client_custom_discovery(user, ptag):
|
|||||||
paramTagSearch = Tag.parse(["param", "search_list", search])
|
paramTagSearch = Tag.parse(["param", "search_list", search])
|
||||||
paramTagAvoid = Tag.parse(["param", "avoid_list", avoid])
|
paramTagAvoid = Tag.parse(["param", "avoid_list", avoid])
|
||||||
paramTagMust = Tag.parse(["param", "must_list", must])
|
paramTagMust = Tag.parse(["param", "must_list", must])
|
||||||
|
|
||||||
pTag = Tag.parse(["p", ptag])
|
pTag = Tag.parse(["p", ptag])
|
||||||
|
|
||||||
tags = [relaysTag, alttag, paramTag, pTag, paramTagSearch, paramTagMust, paramTagAvoid]
|
tags = [relaysTag, alttag, paramTag, pTag, paramTagSearch, paramTagMust, paramTagAvoid]
|
||||||
@ -293,6 +294,32 @@ async def nostr_client_duckduck_test(ptag, query):
|
|||||||
config = DVMConfig
|
config = DVMConfig
|
||||||
await send_event(event, client=client, dvm_config=config)
|
await send_event(event, client=client, dvm_config=config)
|
||||||
return event.as_json()
|
return event.as_json()
|
||||||
|
async def nostr_client_flux_schnell(ptag, query):
|
||||||
|
keys = Keys.parse(check_and_set_private_key("test_client"))
|
||||||
|
|
||||||
|
relay_list = ["wss://nostr.oxtr.dev", "wss://relay.primal.net",
|
||||||
|
]
|
||||||
|
|
||||||
|
relaysTag = Tag.parse(relay_list)
|
||||||
|
alttag = Tag.parse(["alt", "This is a NIP90 DVM AI task"])
|
||||||
|
|
||||||
|
pTag = Tag.parse(["p", ptag])
|
||||||
|
iTag = Tag.parse(["i", query, "text"])
|
||||||
|
|
||||||
|
tags = [relaysTag, alttag, pTag, iTag]
|
||||||
|
|
||||||
|
event = EventBuilder(Kind(5100), str("Give me image"),
|
||||||
|
tags).to_event(keys)
|
||||||
|
|
||||||
|
signer = NostrSigner.keys(keys)
|
||||||
|
client = Client(signer)
|
||||||
|
for relay in relay_list:
|
||||||
|
await client.add_relay(relay)
|
||||||
|
ropts = RelayOptions().ping(False)
|
||||||
|
await client.connect()
|
||||||
|
config = DVMConfig
|
||||||
|
await send_event(event, client=client, dvm_config=config)
|
||||||
|
return event.as_json()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -417,9 +444,10 @@ async def nostr_client():
|
|||||||
# await nostr_client_test_translation("44a0a8b395ade39d46b9d20038b3f0c8a11168e67c442e3ece95e4a1703e2beb", "event", "zh", 20, 20)
|
# await nostr_client_test_translation("44a0a8b395ade39d46b9d20038b3f0c8a11168e67c442e3ece95e4a1703e2beb", "event", "zh", 20, 20)
|
||||||
|
|
||||||
#await nostr_client_test_image("a beautiful purple ostrich watching the sunset, eating a cashew nut")
|
#await nostr_client_test_image("a beautiful purple ostrich watching the sunset, eating a cashew nut")
|
||||||
# await nostr_client_custom_discovery("99bb5591c9116600f845107d31f9b59e2f7c7e09a1ff802e84f1d43da557ca64", "8e998d62eb20ec892acf9d5e8efa58050ccd951cae15a64eabbc5c0a7c74d185")
|
#await nostr_client_custom_discovery("99bb5591c9116600f845107d31f9b59e2f7c7e09a1ff802e84f1d43da557ca64", "7a63849b684d90c0de983492578b12e147e56f5d79ed6585cc64e5aa8a122744")
|
||||||
|
#"a018ba05af400b52772e33162d8326fca4a167fe7b6d3cd2382e14cac2af6841"
|
||||||
await nostr_client_duckduck_test("a018ba05af400b52772e33162d8326fca4a167fe7b6d3cd2382e14cac2af6841", "Write me a poem about purple ostriches")
|
#await nostr_client_duckduck_test(PublicKey.parse("aa8ab5b774d47e7b29a985dd739cfdcccf93451678bf7977ba1b2e094ecd8b30").to_hex() , "How do i create a dockerfile for python 3.12")
|
||||||
|
await nostr_client_flux_schnell("d57f1efb7582f58cade6f482d53eefa998d8082711b996aae3dc5f5527cbdd6e" , "topics")
|
||||||
|
|
||||||
# await nostr_client_test_search_profile("dontbelieve")
|
# await nostr_client_test_search_profile("dontbelieve")
|
||||||
#wot = ["99bb5591c9116600f845107d31f9b59e2f7c7e09a1ff802e84f1d43da557ca64"]
|
#wot = ["99bb5591c9116600f845107d31f9b59e2f7c7e09a1ff802e84f1d43da557ca64"]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user