mirror of
https://github.com/aljazceru/nostrdvm.git
synced 2026-01-01 13:24:19 +01:00
14
.idea/dataSources.xml
generated
14
.idea/dataSources.xml
generated
@@ -9,7 +9,7 @@
|
||||
<working-dir>$ProjectFileDir$</working-dir>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="bot" uuid="35aa282b-8394-415f-9bbb-b649db25cd4d">
|
||||
<driver-ref>sqlite.xerial</driver-ref>
|
||||
<driver-ref>038acd88-11f0-4c07-ae7d-36e6f74bad7c</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/bot.db</jdbc-url>
|
||||
@@ -21,7 +21,7 @@
|
||||
</libraries>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="subscriptions" uuid="7914fe2c-114f-4e86-8ddb-7883b17e9302">
|
||||
<driver-ref>sqlite.xerial</driver-ref>
|
||||
<driver-ref>038acd88-11f0-4c07-ae7d-36e6f74bad7c</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/subscriptions.db</jdbc-url>
|
||||
@@ -33,7 +33,7 @@
|
||||
</libraries>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="Translator" uuid="7e65ee79-fe23-4823-bae3-244dbefdd7f2">
|
||||
<driver-ref>sqlite.xerial</driver-ref>
|
||||
<driver-ref>038acd88-11f0-4c07-ae7d-36e6f74bad7c</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/Translator.db</jdbc-url>
|
||||
@@ -45,7 +45,7 @@
|
||||
</libraries>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="Unstable Diffusion" uuid="ef14cba4-1991-4706-8760-77dba3d8e8e4">
|
||||
<driver-ref>sqlite.xerial</driver-ref>
|
||||
<driver-ref>038acd88-11f0-4c07-ae7d-36e6f74bad7c</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/Unstable Diffusion.db</jdbc-url>
|
||||
@@ -57,7 +57,7 @@
|
||||
</libraries>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="Bot" uuid="80b7a7dc-a233-4d7b-bd0e-e1d0bc7226e8">
|
||||
<driver-ref>sqlite.xerial</driver-ref>
|
||||
<driver-ref>038acd88-11f0-4c07-ae7d-36e6f74bad7c</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/nostr_mostr.db</jdbc-url>
|
||||
@@ -69,7 +69,7 @@
|
||||
</libraries>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="Profiles" uuid="77eda71f-1c66-4b3d-bc34-dfe34fb45fc2">
|
||||
<driver-ref>sqlite.xerial</driver-ref>
|
||||
<driver-ref>038acd88-11f0-4c07-ae7d-36e6f74bad7c</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/nostr_profiles.db</jdbc-url>
|
||||
@@ -102,7 +102,7 @@
|
||||
<working-dir>$ProjectFileDir$</working-dir>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="subscriptions" uuid="ccd96349-b12f-47d5-8caf-c0c8c359d831">
|
||||
<driver-ref>sqlite.xerial</driver-ref>
|
||||
<driver-ref>038acd88-11f0-4c07-ae7d-36e6f74bad7c</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/subscriptions</jdbc-url>
|
||||
|
||||
2
.idea/dvm.iml
generated
2
.idea/dvm.iml
generated
@@ -14,7 +14,7 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/p1234" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/p23" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.12 (dvm)" jdkType="Python SDK" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.12 (dvm) (2)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -3,5 +3,5 @@
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.10 (dvm)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (dvm)" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (dvm) (2)" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
@@ -22,17 +22,17 @@ def main():
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use a LLM connected via OLLAMA",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
ollama = TextGenerationLLMLite(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config,
|
||||
|
||||
@@ -20,13 +20,13 @@ async def nostr_client_test_llm(prompt):
|
||||
relaysTag = Tag.parse(['relays', "wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"])
|
||||
alttag = Tag.parse(["alt", "This is a NIP90 DVM AI task to generate TTSt"])
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_GENERATE_TEXT, str("Generate an Audio File."),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_GENERATE_TEXT, str("Generate an Audio File.")).tags(
|
||||
[iTag, relaysTag, alttag]).sign_with_keys(keys)
|
||||
|
||||
relay_list = ["wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"]
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
@@ -40,7 +40,7 @@ async def nostr_client():
|
||||
sk = keys.secret_key()
|
||||
pk = keys.public_key()
|
||||
print(f"Nostr Test Client public key: {pk.to_bech32()}, Hex: {pk.to_hex()} ")
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
dvmconfig = DVMConfig()
|
||||
for relay in dvmconfig.RELAY_LIST:
|
||||
await client.add_relay(relay)
|
||||
|
||||
@@ -22,10 +22,10 @@ def main():
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I Generate Speech from Text",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"language": {
|
||||
"required": False,
|
||||
@@ -35,7 +35,7 @@ def main():
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
tts = TextToSpeech(name=name,
|
||||
|
||||
@@ -24,14 +24,14 @@ async def nostr_client_test_tts(prompt):
|
||||
relaysTag = Tag.parse(['relays', "wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"])
|
||||
alttag = Tag.parse(["alt", "This is a NIP90 DVM AI task to generate TTS"])
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_TEXT_TO_SPEECH, str("Generate an Audio File."),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_TEXT_TO_SPEECH, str("Generate an Audio File.")).tags(
|
||||
[iTag, paramTag1, bidTag, relaysTag, alttag]).sign_with_keys(keys)
|
||||
|
||||
relay_list = ["wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"]
|
||||
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -44,7 +44,7 @@ async def nostr_client():
|
||||
sk = keys.secret_key()
|
||||
pk = keys.public_key()
|
||||
print(f"Nostr Test Client public key: {pk.to_bech32()}, Hex: {pk.to_hex()} ")
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
dvmconfig = DVMConfig()
|
||||
for relay in dvmconfig.RELAY_LIST:
|
||||
|
||||
@@ -22,15 +22,15 @@ def main():
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://unleashed.chat/_app/immutable/assets/hero.pehsu4x_.jpeg",
|
||||
"picture": "https://unleashed.chat/_app/immutable/assets/hero.pehsu4x_.jpeg",
|
||||
"about": "I generate Text with Unleashed.chat",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
|
||||
|
||||
@@ -23,13 +23,13 @@ async def nostr_client_test(prompt):
|
||||
relaysTag = Tag.parse(['relays', "wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"])
|
||||
alttag = Tag.parse(["alt", "This is a NIP90 DVM AI task to generate TTS"])
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_GENERATE_TEXT, str("Answer to prompt"),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_GENERATE_TEXT, str("Answer to prompt")).tags(
|
||||
[iTag, relaysTag, alttag]).sign_with_keys(keys)
|
||||
|
||||
relay_list = ["wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"]
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -42,7 +42,7 @@ async def nostr_client():
|
||||
sk = keys.secret_key()
|
||||
pk = keys.public_key()
|
||||
print(f"Nostr Test Client public key: {pk.to_bech32()}, Hex: {pk.to_hex()} ")
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
dvmconfig = DVMConfig()
|
||||
for relay in dvmconfig.RELAY_LIST:
|
||||
|
||||
8
main.py
8
main.py
@@ -24,16 +24,16 @@ def playground(announce=False):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I'm just a demo DVM, not doing much.'",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {
|
||||
|
||||
@@ -2,11 +2,11 @@ import asyncio
|
||||
import json
|
||||
import os
|
||||
import signal
|
||||
from datetime import timedelta
|
||||
from multiprocessing.connection import Connection
|
||||
|
||||
from nostr_sdk import (Keys, Client, Timestamp, Filter, nip04_decrypt, HandleNotification, EventBuilder, PublicKey,
|
||||
Options, Tag, Event, nip04_encrypt, NostrSigner, EventId, Nip19Event, Kind, KindEnum,
|
||||
UnsignedEvent, UnwrappedGift, uniffi_set_event_loop)
|
||||
from nostr_sdk import (Keys, Timestamp, Filter, nip04_decrypt, nip44_decrypt, HandleNotification, EventBuilder, PublicKey,
|
||||
Options, Tag, Event, EventId, Nip19Event, Kind, KindEnum, NostrSigner, nip44_encrypt,
|
||||
UnsignedEvent, UnwrappedGift, uniffi_set_event_loop, ClientBuilder, make_private_msg)
|
||||
|
||||
from nostr_dvm.utils.admin_utils import admin_make_database_updates
|
||||
from nostr_dvm.utils.cashu_utils import redeem_cashu
|
||||
@@ -28,6 +28,12 @@ class Bot:
|
||||
# This is a simple list just to keep track which events we created and manage, so we don't pay for other requests
|
||||
|
||||
def __init__(self, dvm_config, admin_config=None):
|
||||
self.signer = None
|
||||
self.dvm_config = None
|
||||
self.keys = None
|
||||
self.admin_config = None
|
||||
|
||||
self.client = None
|
||||
asyncio.run(self.run_bot(dvm_config, admin_config))
|
||||
uniffi_set_event_loop(asyncio.get_running_loop())
|
||||
|
||||
@@ -42,10 +48,11 @@ class Bot:
|
||||
self.dvm_config.NIP89 = nip89config
|
||||
self.admin_config = admin_config
|
||||
self.keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
||||
self.signer = NostrSigner.keys(self.keys)
|
||||
self.CHATBOT = False
|
||||
|
||||
opts = (Options().gossip(True))
|
||||
self.client = Client.with_opts(self.keys, opts)
|
||||
opts = Options().gossip(True)
|
||||
self.client = ClientBuilder().signer(NostrSigner.keys(self.keys)).opts(opts).build()
|
||||
self.invoice_list = []
|
||||
|
||||
pk = self.keys.public_key()
|
||||
@@ -63,9 +70,6 @@ class Bot:
|
||||
for relay in self.dvm_config.RELAY_LIST:
|
||||
await self.client.add_relay(relay)
|
||||
|
||||
await self.client.add_read_relay("wss://relay.nostr.band")
|
||||
await self.client.add_read_relay("wss://relay.damus.io")
|
||||
|
||||
await self.client.connect()
|
||||
|
||||
zap_filter = Filter().pubkey(pk).kinds([EventDefinitions.KIND_ZAP]).since(Timestamp.now())
|
||||
@@ -124,8 +128,7 @@ class Bot:
|
||||
if giftwrap:
|
||||
try:
|
||||
# Extract rumor
|
||||
|
||||
unwrapped_gift = await UnwrappedGift.from_gift_wrap(self.keys, nostr_event)
|
||||
unwrapped_gift = await UnwrappedGift.from_gift_wrap(NostrSigner.keys(self.keys), nostr_event)
|
||||
sender = unwrapped_gift.sender().to_hex()
|
||||
rumor: UnsignedEvent = unwrapped_gift.rumor()
|
||||
|
||||
@@ -185,7 +188,7 @@ class Bot:
|
||||
params_as_str = json.dumps(tags_str)
|
||||
print(params_as_str)
|
||||
# and encrypt them
|
||||
encrypted_params = nip04_encrypt(self.keys.secret_key(),
|
||||
encrypted_params = nip44_encrypt(self.keys.secret_key(),
|
||||
PublicKey.from_hex(
|
||||
self.dvm_config.SUPPORTED_DVMS[
|
||||
index].PUBLIC_KEY),
|
||||
@@ -194,13 +197,13 @@ class Bot:
|
||||
encrypted_tag = Tag.parse(['encrypted'])
|
||||
# add the encrypted params to the content
|
||||
nip90request = (EventBuilder(self.dvm_config.SUPPORTED_DVMS[index].KIND,
|
||||
encrypted_params, [p_tag, encrypted_tag]).
|
||||
encrypted_params).tags([p_tag, encrypted_tag]).
|
||||
sign_with_keys(self.keys))
|
||||
else:
|
||||
tags.append(p_tag)
|
||||
|
||||
nip90request = (EventBuilder(self.dvm_config.SUPPORTED_DVMS[index].KIND,
|
||||
"", tags).
|
||||
"").tags(tags).
|
||||
sign_with_keys(self.keys))
|
||||
|
||||
# remember in the job_list that we have made an event, if anybody asks for payment,
|
||||
@@ -240,7 +243,10 @@ class Bot:
|
||||
else:
|
||||
message = invoice
|
||||
if giftwrap:
|
||||
await self.client.send_private_msg(PublicKey.parse(sender), message, None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(sender), message,
|
||||
None)
|
||||
await self.client.send_event(event)
|
||||
|
||||
else:
|
||||
await send_nip04_dm(self.client, message, PublicKey.parse(sender), self.dvm_config)
|
||||
|
||||
@@ -259,11 +265,10 @@ class Bot:
|
||||
"100 sats (or any other amount) "
|
||||
"to top up your balance")
|
||||
if giftwrap:
|
||||
await self.client.send_private_msg(PublicKey.parse(sender), message, None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(sender), message)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, message, PublicKey.parse(sender), self.dvm_config)
|
||||
# await self.client.send_direct_msg(PublicKey.parse(sender), message, None)
|
||||
# await self.client.send_private_msg(PublicKey.parse(sender), message, None)
|
||||
elif decrypted_text.startswith("cashuA"):
|
||||
print("Received Cashu token:" + decrypted_text)
|
||||
cashu_redeemed, cashu_message, total_amount, fees = await redeem_cashu(decrypted_text,
|
||||
@@ -278,14 +283,16 @@ class Bot:
|
||||
message = "Error: " + cashu_message + ". Token has not been redeemed."
|
||||
|
||||
if giftwrap:
|
||||
await self.client.send_private_msg(PublicKey.parse(sender), message, None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(sender), message)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, message, PublicKey.parse(sender), self.dvm_config)
|
||||
elif decrypted_text.lower().startswith("what's the second best"):
|
||||
await asyncio.sleep(2.0)
|
||||
message = "No, there is no second best.\n\nhttps://cdn.nostr.build/p/mYLv.mp4"
|
||||
if giftwrap:
|
||||
await self.client.send_private_msg(PublicKey.parse(sender), message, None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(sender), message)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, message, PublicKey.parse(sender), self.dvm_config)
|
||||
else:
|
||||
@@ -313,7 +320,7 @@ class Bot:
|
||||
tags.append(p_tag)
|
||||
|
||||
nip90request = (EventBuilder(Kind(kind),
|
||||
"", tags).
|
||||
"").tags(tags).
|
||||
sign_with_keys(self.keys))
|
||||
|
||||
entry = {"npub": user.npub, "event_id": nip90request.id().to_hex(),
|
||||
@@ -349,8 +356,13 @@ class Bot:
|
||||
|
||||
if is_encrypted:
|
||||
if ptag == self.keys.public_key().to_hex():
|
||||
tags_str = nip04_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
nostr_event.author(), nostr_event.content())
|
||||
try:
|
||||
tags_str = nip44_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
nostr_event.author(), nostr_event.content())
|
||||
except:
|
||||
tags_str = nip04_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
nostr_event.author(), nostr_event.content())
|
||||
|
||||
params = json.loads(tags_str)
|
||||
params.append(Tag.parse(["p", ptag]).as_vec())
|
||||
params.append(Tag.parse(["encrypted"]).as_vec())
|
||||
@@ -379,7 +391,8 @@ class Bot:
|
||||
client=self.client, config=self.dvm_config)
|
||||
await asyncio.sleep(2.0)
|
||||
if entry["giftwrap"]:
|
||||
await self.client.send_private_msg(PublicKey.parse(entry["npub"]), content, None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(PublicKey.parse(entry["npub"])), content)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, content, PublicKey.parse(entry['npub']), self.dvm_config)
|
||||
print(status + ": " + content)
|
||||
@@ -408,8 +421,8 @@ class Bot:
|
||||
amount) + " Sats from balance to DVM. New balance is " + str(
|
||||
balance) + " Sats.\n"
|
||||
if entry["giftwrap"]:
|
||||
await self.client.send_private_msg(PublicKey.parse(entry["npub"]), message,
|
||||
None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(PublicKey.parse(entry["npub"])), message)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, content, PublicKey.parse(entry['npub']),
|
||||
self.dvm_config)
|
||||
@@ -424,8 +437,8 @@ class Bot:
|
||||
int(amount - user.balance)) + " Sats, then try again."
|
||||
|
||||
if entry["giftwrap"]:
|
||||
await self.client.send_private_msg(PublicKey.parse(entry["npub"]), message,
|
||||
None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(PublicKey.parse((entry["npub"]))), message)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, message, PublicKey.parse(entry['npub']),
|
||||
self.dvm_config)
|
||||
@@ -485,7 +498,10 @@ class Bot:
|
||||
content = nostr_event.content()
|
||||
if is_encrypted:
|
||||
if ptag == self.keys.public_key().to_hex():
|
||||
content = nip04_decrypt(self.keys.secret_key(), nostr_event.author(), content)
|
||||
try:
|
||||
content = nip44_decrypt(self.keys.secret_key(), nostr_event.author(), content)
|
||||
except:
|
||||
content = nip04_decrypt(self.keys.secret_key(), nostr_event.author(), content)
|
||||
else:
|
||||
return
|
||||
|
||||
@@ -502,7 +518,9 @@ class Bot:
|
||||
print("[" + self.NAME + "] Received results, message to orignal sender " + user.name)
|
||||
await asyncio.sleep(2.0)
|
||||
if entry["giftwrap"]:
|
||||
await self.client.send_private_msg(PublicKey.parse(user.npub), content, None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(user.npub), content)
|
||||
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, content, PublicKey.parse(user.npub), self.dvm_config)
|
||||
|
||||
@@ -568,14 +586,16 @@ class Bot:
|
||||
|
||||
text = message + "\nSelect an Index and provide an input (e.g. \"2 A purple ostrich\")\nType \"index info\" to learn more about each DVM. (e.g. \"2 info\")\n\n Type \"balance\" to see your current balance"
|
||||
if giftwrap:
|
||||
await self.client.send_private_msg(PublicKey.parse(sender), text, nostr_event.id())
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(sender), text)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, text, PublicKey.parse(sender), self.dvm_config)
|
||||
|
||||
async def answer_blacklisted(nostr_event, giftwrap, sender):
|
||||
message = "Your are currently blocked from this service."
|
||||
if giftwrap:
|
||||
await self.client.send_private_msg(PublicKey.parse(sender), message, None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(sender), message)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, message, PublicKey.parse(sender), self.dvm_config)
|
||||
|
||||
@@ -586,7 +606,8 @@ class Bot:
|
||||
await asyncio.sleep(2.0)
|
||||
|
||||
if giftwrap:
|
||||
await self.client.send_private_msg(PublicKey.parse(sender), info, None)
|
||||
event = await make_private_msg(self.signer, PublicKey.parse(sender), info)
|
||||
await self.client.send_event(event)
|
||||
else:
|
||||
await send_nip04_dm(self.client, info, PublicKey.parse(sender), self.dvm_config)
|
||||
|
||||
@@ -725,14 +746,16 @@ class Bot:
|
||||
|
||||
if nip89content.get("name"):
|
||||
info += "Name: " + nip89content.get("name") + "\n"
|
||||
if nip89content.get("image"):
|
||||
if nip89content.get("picture"):
|
||||
info += nip89content.get("picture") + "\n"
|
||||
elif nip89content.get("image"):
|
||||
info += nip89content.get("image") + "\n"
|
||||
if nip89content.get("about"):
|
||||
info += "About:\n" + nip89content.get("about") + "\n\n"
|
||||
if nip89content.get("cashuAccepted"):
|
||||
cashu_accepted = str(nip89content.get("cashuAccepted"))
|
||||
if nip89content.get("encryptionSupported"):
|
||||
encryption_supported = str(nip89content.get("encryptionSupported"))
|
||||
if nip89content.get("acceptsNutZaps"):
|
||||
cashu_accepted = str(nip89content.get("acceptsNutZaps"))
|
||||
if nip89content.get("supportsEncryption"):
|
||||
encryption_supported = str(nip89content.get("supportsEncryption"))
|
||||
|
||||
info += "Encryption supported: " + str(encryption_supported) + "\n"
|
||||
info += "Cashu accepted: " + str(cashu_accepted) + "\n\n"
|
||||
|
||||
@@ -4,7 +4,8 @@ import os
|
||||
from sys import platform
|
||||
|
||||
from nostr_sdk import PublicKey, Keys, Client, Tag, Event, EventBuilder, Filter, HandleNotification, Timestamp, \
|
||||
LogLevel, Options, nip04_encrypt, Kind, RelayLimits, uniffi_set_event_loop
|
||||
LogLevel, Options, nip04_encrypt, nip44_encrypt, Nip44Version, Kind, RelayLimits, uniffi_set_event_loop, ClientBuilder, NostrSigner
|
||||
|
||||
|
||||
from nostr_dvm.utils.admin_utils import admin_make_database_updates, AdminConfig
|
||||
from nostr_dvm.utils.backend_utils import get_amount_per_task, check_task_is_supported, get_task
|
||||
@@ -47,7 +48,8 @@ class DVM:
|
||||
opts = (
|
||||
Options().relay_limits(relaylimits)) #.difficulty(28)
|
||||
|
||||
self.client = Client.with_opts(self.keys, opts)
|
||||
#self.client = Client(self.keys)
|
||||
self.client = ClientBuilder().signer(NostrSigner.keys(self.keys)).opts(opts).build()
|
||||
self.job_list = []
|
||||
self.jobs_on_hold_list = []
|
||||
pk = self.keys.public_key()
|
||||
@@ -106,7 +108,7 @@ class DVM:
|
||||
|
||||
async def handle_nip90_job_event(nip90_event):
|
||||
# decrypted encrypted events
|
||||
nip90_event = check_and_decrypt_tags(nip90_event, self.dvm_config)
|
||||
nip90_event, use_legacy_encryption = check_and_decrypt_tags(nip90_event, self.dvm_config)
|
||||
# if event is encrypted, but we can't decrypt it (e.g. because its directed to someone else), return
|
||||
if nip90_event is None:
|
||||
return
|
||||
@@ -234,7 +236,7 @@ class DVM:
|
||||
if dvm_config.SEND_FEEDBACK_EVENTS:
|
||||
await send_job_status_reaction(nip90_event, "processing", True, 0,
|
||||
content=self.dvm_config.CUSTOM_PROCESSING_MESSAGE,
|
||||
client=self.client, dvm_config=self.dvm_config, user=user)
|
||||
client=self.client, dvm_config=self.dvm_config)
|
||||
|
||||
# when we reimburse users on error make sure to not send anything if it was free
|
||||
if user.iswhitelisted or task_is_free:
|
||||
@@ -336,7 +338,7 @@ class DVM:
|
||||
job_event = await get_event_by_id(tag.as_vec()[1], client=self.client,
|
||||
config=self.dvm_config)
|
||||
if job_event is not None:
|
||||
job_event = check_and_decrypt_tags(job_event, self.dvm_config)
|
||||
job_event, use_legacy_encryption = check_and_decrypt_tags(job_event, self.dvm_config)
|
||||
if job_event is None:
|
||||
return
|
||||
else:
|
||||
@@ -356,7 +358,7 @@ class DVM:
|
||||
print("[" + self.dvm_config.NIP89.NAME + "] Payment-request fulfilled...")
|
||||
await send_job_status_reaction(job_event, "processing", client=self.client,
|
||||
content=self.dvm_config.CUSTOM_PROCESSING_MESSAGE,
|
||||
dvm_config=self.dvm_config, user=user)
|
||||
dvm_config=self.dvm_config)
|
||||
indices = [i for i, x in enumerate(self.job_list) if
|
||||
x.event == job_event]
|
||||
index = -1
|
||||
@@ -418,7 +420,7 @@ class DVM:
|
||||
job_event = await get_event_by_id(tag.as_vec()[1], client=self.client,
|
||||
config=self.dvm_config)
|
||||
if job_event is not None:
|
||||
job_event = check_and_decrypt_tags(job_event, self.dvm_config)
|
||||
job_event, use_legacy_encryption = check_and_decrypt_tags(job_event, self.dvm_config)
|
||||
if job_event is None:
|
||||
return
|
||||
else:
|
||||
@@ -530,11 +532,11 @@ class DVM:
|
||||
if self.dvm_config.SHOW_RESULT_BEFORE_PAYMENT and not is_paid:
|
||||
await send_nostr_reply_event(data, original_event.as_json())
|
||||
await send_job_status_reaction(original_event, "success", amount,
|
||||
dvm_config=self.dvm_config,
|
||||
dvm_config=self.dvm_config
|
||||
) # or payment-required, or both?
|
||||
elif not self.dvm_config.SHOW_RESULT_BEFORE_PAYMENT and not is_paid:
|
||||
await send_job_status_reaction(original_event, "success", amount,
|
||||
dvm_config=self.dvm_config,
|
||||
dvm_config=self.dvm_config
|
||||
) # or payment-required, or both?
|
||||
|
||||
if self.dvm_config.SHOW_RESULT_BEFORE_PAYMENT and is_paid:
|
||||
@@ -594,11 +596,15 @@ class DVM:
|
||||
reply_tags.append(relay_tag)
|
||||
|
||||
encrypted = False
|
||||
is_legacy_encryption = False
|
||||
encryption_tags = []
|
||||
for tag in original_event.tags().to_vec():
|
||||
if tag.as_vec()[0] == "encrypted":
|
||||
encrypted = True
|
||||
encrypted_tag = Tag.parse(["encrypted"])
|
||||
reply_tags.append(encrypted_tag)
|
||||
encryption_tags.append(encrypted_tag)
|
||||
#_, is_legacy_encryption = check_and_decrypt_tags(original_event, dvm_config)
|
||||
|
||||
|
||||
for tag in original_event.tags().to_vec():
|
||||
if tag.as_vec()[0] == "i":
|
||||
@@ -606,14 +612,30 @@ class DVM:
|
||||
if not encrypted:
|
||||
reply_tags.append(i_tag)
|
||||
|
||||
if encrypted:
|
||||
encryption_tags.append(p_tag)
|
||||
encryption_tags.append(e_tag)
|
||||
|
||||
else:
|
||||
reply_tags.append(p_tag)
|
||||
|
||||
if encrypted:
|
||||
print(content)
|
||||
content = nip04_encrypt(self.keys.secret_key(), PublicKey.from_hex(original_event.author().to_hex()),
|
||||
content)
|
||||
if is_legacy_encryption:
|
||||
content = nip04_encrypt(self.keys.secret_key(), PublicKey.from_hex(original_event.author().to_hex()),
|
||||
content)
|
||||
else:
|
||||
|
||||
reply_event = EventBuilder(Kind(original_event.kind().as_u16() + 1000), str(content), reply_tags).sign_with_keys(
|
||||
content = nip44_encrypt(self.keys.secret_key(),
|
||||
PublicKey.from_hex(original_event.author().to_hex()),
|
||||
content, Nip44Version.V2)
|
||||
|
||||
reply_tags = encryption_tags
|
||||
|
||||
|
||||
reply_event = EventBuilder(Kind(original_event.kind().as_u16() + 1000), str(content)).tags(reply_tags).sign_with_keys(
|
||||
self.keys)
|
||||
|
||||
#print(reply_event)
|
||||
# send_event(reply_event, client=self.client, dvm_config=self.dvm_config)
|
||||
await send_event_outbox(reply_event, client=self.client, dvm_config=self.dvm_config)
|
||||
if self.dvm_config.LOGLEVEL.value >= LogLevel.DEBUG.value:
|
||||
@@ -625,7 +647,7 @@ class DVM:
|
||||
|
||||
async def send_job_status_reaction(original_event, status, is_paid=True, amount=0, client=None,
|
||||
content=None,
|
||||
dvm_config=None, user=None):
|
||||
dvm_config=None):
|
||||
|
||||
task = await get_task(original_event, client=client, dvm_config=dvm_config)
|
||||
alt_description, reaction = build_status_reaction(status, task, amount, content, dvm_config)
|
||||
@@ -648,11 +670,13 @@ class DVM:
|
||||
encryption_tags = []
|
||||
|
||||
encrypted = False
|
||||
is_legacy_encryption = False
|
||||
for tag in original_event.tags().to_vec():
|
||||
if tag.as_vec()[0] == "encrypted":
|
||||
encrypted = True
|
||||
encrypted_tag = Tag.parse(["encrypted"])
|
||||
encryption_tags.append(encrypted_tag)
|
||||
#_, is_legacy_encryption = check_and_decrypt_tags(original_event, dvm_config)
|
||||
|
||||
if encrypted:
|
||||
encryption_tags.append(p_tag)
|
||||
@@ -719,15 +743,20 @@ class DVM:
|
||||
str_tags.append(element.as_vec())
|
||||
|
||||
content = json.dumps(str_tags)
|
||||
content = nip04_encrypt(self.keys.secret_key(), PublicKey.from_hex(original_event.author().to_hex()),
|
||||
content)
|
||||
if is_legacy_encryption:
|
||||
content = nip04_encrypt(self.keys.secret_key(), PublicKey.from_hex(original_event.author().to_hex()),
|
||||
content)
|
||||
else:
|
||||
content = nip44_encrypt(self.keys.secret_key(),
|
||||
PublicKey.from_hex(original_event.author().to_hex()),
|
||||
content, version=Nip44Version.V2)
|
||||
reply_tags = encryption_tags
|
||||
|
||||
else:
|
||||
content = reaction
|
||||
|
||||
keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
||||
reaction_event = EventBuilder(EventDefinitions.KIND_FEEDBACK, str(content), reply_tags).sign_with_keys(keys)
|
||||
reaction_event = EventBuilder(EventDefinitions.KIND_FEEDBACK, str(content)).tags(reply_tags).sign_with_keys(keys)
|
||||
# send_event(reaction_event, client=self.client, dvm_config=self.dvm_config)
|
||||
await send_event_outbox(reaction_event, client=self.client, dvm_config=self.dvm_config)
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ import os
|
||||
import signal
|
||||
from datetime import timedelta
|
||||
|
||||
from nostr_sdk import (Keys, Client, Timestamp, Filter, nip04_decrypt, HandleNotification, EventBuilder, PublicKey,
|
||||
Options, Tag, Event, nip04_encrypt, NostrSigner, EventId, uniffi_set_event_loop)
|
||||
from nostr_sdk import (Keys, Client, Timestamp, Filter, nip04_decrypt, nip44_decrypt, HandleNotification, EventBuilder, PublicKey,
|
||||
Options, Tag, Event, nip44_encrypt, NostrSigner, EventId, uniffi_set_event_loop, make_private_msg)
|
||||
|
||||
from nostr_dvm.utils.database_utils import fetch_user_metadata
|
||||
from nostr_dvm.utils.definitions import EventDefinitions, relay_timeout
|
||||
@@ -39,7 +39,7 @@ class Subscription:
|
||||
self.dvm_config.NIP89 = nip89config
|
||||
self.admin_config = admin_config
|
||||
self.keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
||||
self.client = Client(self.keys)
|
||||
self.client = Client(NostrSigner.keys(self.keys))
|
||||
|
||||
pk = self.keys.public_key()
|
||||
|
||||
@@ -146,12 +146,12 @@ class Subscription:
|
||||
str_tags.append(element.as_vec())
|
||||
|
||||
content = json.dumps(str_tags)
|
||||
content = nip04_encrypt(self.keys.secret_key(), PublicKey.from_hex(original_event.author().to_hex()),
|
||||
content = nip44_encrypt(self.keys.secret_key(), PublicKey.from_hex(original_event.author().to_hex()),
|
||||
content)
|
||||
reply_tags = encryption_tags
|
||||
|
||||
keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
||||
reaction_event = EventBuilder(EventDefinitions.KIND_FEEDBACK, str(content), reply_tags).sign_with_keys(keys)
|
||||
reaction_event = EventBuilder(EventDefinitions.KIND_FEEDBACK, str(content)).tags(reply_tags).sign_with_keys(keys)
|
||||
await send_event(reaction_event, client=self.client, dvm_config=self.dvm_config)
|
||||
print("[" + self.dvm_config.NIP89.NAME + "]" + ": Sent Kind " + str(
|
||||
EventDefinitions.KIND_FEEDBACK.as_u16()) + " Reaction: " + "success" + " " + reaction_event.as_json())
|
||||
@@ -209,7 +209,7 @@ class Subscription:
|
||||
tags = [pTag, PTag, eTag, validTag, tierTag, alttag]
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP88_PAYMENT_RECIPE,
|
||||
message, tags).sign_with_keys(self.keys)
|
||||
message).tags(tags).sign_with_keys(self.keys)
|
||||
|
||||
dvmconfig = DVMConfig()
|
||||
client = Client(self.keys)
|
||||
@@ -229,7 +229,12 @@ class Subscription:
|
||||
return
|
||||
|
||||
try:
|
||||
decrypted_text = nip04_decrypt(self.keys.secret_key(), nostr_event.author(), nostr_event.content())
|
||||
|
||||
try:
|
||||
decrypted_text = nip44_decrypt(self.keys.secret_key(), nostr_event.author(), nostr_event.content())
|
||||
except:
|
||||
decrypted_text = nip04_decrypt(self.keys.secret_key(), nostr_event.author(), nostr_event.content())
|
||||
|
||||
subscriber = ""
|
||||
nwc = ""
|
||||
try:
|
||||
@@ -348,7 +353,8 @@ class Subscription:
|
||||
Timestamp.from_secs(end).to_human_datetime().replace("Z", " ").replace("T",
|
||||
" ") + " GMT"))
|
||||
|
||||
self.client.send_private_msg(PublicKey.parse(subscriber), message, None)
|
||||
event = await make_private_msg(NostrSigner.keys(self.keys), PublicKey.parse(subscriber), message)
|
||||
await self.client.send_event(event)
|
||||
|
||||
|
||||
|
||||
@@ -407,7 +413,8 @@ class Subscription:
|
||||
Timestamp.from_secs(end).to_human_datetime().replace("Z", " ").replace("T",
|
||||
" ")))
|
||||
# await self.client.send_direct_msg(PublicKey.parse(subscription.subscriber), message, None)
|
||||
await self.client.send_private_msg(PublicKey.parse(subscription.subscriber), message, None)
|
||||
event = await make_private_msg(NostrSigner.keys(self.keys), PublicKey.parse(subscription.subscriber), message)
|
||||
await self.client.send_event(event)
|
||||
|
||||
async def check_subscriptions():
|
||||
try:
|
||||
|
||||
@@ -89,7 +89,7 @@ class AdvancedSearch(DVMTaskInterface):
|
||||
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
cli = Client(keys)
|
||||
cli = Client(NostrSigner.keys(keys))
|
||||
|
||||
await cli.add_relay(options["relay"])
|
||||
|
||||
@@ -162,10 +162,10 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://nostr.band/android-chrome-192x192.png",
|
||||
"picture": "https://nostr.band/android-chrome-192x192.png",
|
||||
"about": "I search notes on Nostr.band.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"users": {
|
||||
"required": False,
|
||||
@@ -191,7 +191,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {"relay": "wss://relay.nostr.band"}
|
||||
|
||||
@@ -147,10 +147,10 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/d844d6a963724b9f9deb6b3326984fd95352343336718812424d5e99d93a6f2d.jpg",
|
||||
"picture": "https://image.nostr.build/d844d6a963724b9f9deb6b3326984fd95352343336718812424d5e99d93a6f2d.jpg",
|
||||
"about": "I search notes on nostr.wine using the nostr-wine API",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"users": {
|
||||
"required": False,
|
||||
@@ -176,7 +176,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return AdvancedSearchWine(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -156,15 +156,15 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I create songs based on prompts with suno.ai",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return AudioGenerationSonoAI(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -112,7 +112,7 @@ class DicoverContentLatestLongForm(DVMTaskInterface):
|
||||
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
# print(self.db_name)
|
||||
cli = ClientBuilder().database(database).signer(keys).build()
|
||||
cli = ClientBuilder().database(database).signer(NostrSigner.keys(keys)).build()
|
||||
await cli.connect()
|
||||
|
||||
# Negentropy reconciliation
|
||||
@@ -123,10 +123,10 @@ class DicoverContentLatestLongForm(DVMTaskInterface):
|
||||
filter1 = Filter().kind(definitions.EventDefinitions.KIND_LONGFORM).since(since)
|
||||
events = await cli.database().query([filter1])
|
||||
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.to_vec())) + " Events")
|
||||
ns.finallist = {}
|
||||
index = options["max_results"]
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
if event.created_at().as_secs() > timestamp_hour_ago:
|
||||
ns.finallist[event.id().to_hex()] = index
|
||||
index = index - 1
|
||||
@@ -175,7 +175,7 @@ class DicoverContentLatestLongForm(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).opts(opts).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).opts(opts).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -227,12 +227,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the latest longform notes.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -245,7 +244,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -273,12 +272,11 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the latest longform notes",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -291,14 +289,14 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -112,7 +112,7 @@ class DicoverContentLatestWiki(DVMTaskInterface):
|
||||
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
# print(self.db_name)
|
||||
cli = ClientBuilder().database(database).signer(keys).build()
|
||||
cli = ClientBuilder().database(database).signer(NostrSigner.keys(keys)).build()
|
||||
await cli.connect()
|
||||
|
||||
# Negentropy reconciliation
|
||||
@@ -123,10 +123,10 @@ class DicoverContentLatestWiki(DVMTaskInterface):
|
||||
filter1 = Filter().kind(definitions.EventDefinitions.KIND_WIKI).since(since)
|
||||
events = await cli.database().query([filter1])
|
||||
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.to_vec())) + " Events")
|
||||
ns.finallist = {}
|
||||
index = options["max_results"]
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
if event.created_at().as_secs() > timestamp_hour_ago:
|
||||
ns.finallist[event.id().to_hex()] = index
|
||||
index = index - 1
|
||||
@@ -175,7 +175,7 @@ class DicoverContentLatestWiki(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).opts(opts).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).opts(opts).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -226,12 +226,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the latest longform notes.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -244,7 +243,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -272,12 +271,11 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the latest longform notes",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -290,14 +288,14 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -9,6 +9,7 @@ from nostr_sdk import Timestamp, Tag, Keys, Options, SecretKey, NostrSigner, Nos
|
||||
from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface, process_venv
|
||||
from nostr_dvm.utils import definitions
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
from nostr_dvm.utils.database_utils import init_db
|
||||
from nostr_dvm.utils.definitions import EventDefinitions
|
||||
from nostr_dvm.utils.dvmconfig import DVMConfig, build_default_config
|
||||
from nostr_dvm.utils.nip88_utils import NIP88Config, check_and_set_d_tag_nip88, check_and_set_tiereventid_nip88
|
||||
@@ -117,17 +118,17 @@ class DicoverContentCurrentlyPopular(DVMTaskInterface):
|
||||
|
||||
events = await database.query([filter1])
|
||||
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.to_vec())) + " Events")
|
||||
ns.finallist = {}
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
if event.created_at().as_secs() > timestamp_since:
|
||||
filt = Filter().kinds([definitions.EventDefinitions.KIND_ZAP, definitions.EventDefinitions.KIND_REPOST,
|
||||
definitions.EventDefinitions.KIND_REACTION,
|
||||
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||
reactions = await database.query([filt])
|
||||
|
||||
if len(reactions) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions)
|
||||
if len(reactions.to_vec()) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions.to_vec())
|
||||
if len(ns.finallist) == 0:
|
||||
return self.result
|
||||
|
||||
@@ -171,8 +172,9 @@ class DicoverContentCurrentlyPopular(DVMTaskInterface):
|
||||
try:
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -225,12 +227,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -243,7 +244,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -270,12 +271,11 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular all over Nostr. I'm also used for testing subscriptions.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -288,14 +288,14 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -115,20 +115,20 @@ class DicoverContentCurrentlyPopularZaps(DVMTaskInterface):
|
||||
filter1 = Filter().kind(definitions.EventDefinitions.KIND_NOTE).since(since)
|
||||
events = await database.query([filter1])
|
||||
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.to_vec())) + " Events")
|
||||
|
||||
ns.finallist = {}
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
if event.created_at().as_secs() > timestamp_hour_ago:
|
||||
filt = Filter().kinds([definitions.EventDefinitions.KIND_ZAP]).event(event.id()).since(since)
|
||||
zaps = await database.query([filt])
|
||||
invoice_amount = 0
|
||||
event_author = event.author().to_hex()
|
||||
if len(zaps) >= self.min_reactions:
|
||||
if len(zaps.to_vec()) >= self.min_reactions:
|
||||
has_preimage = False
|
||||
has_amount = False
|
||||
overall_amount = 0
|
||||
for zap in zaps:
|
||||
for zap in zaps.to_vec():
|
||||
if event_author == zap.author().to_hex():
|
||||
continue # Skip self zaps..
|
||||
invoice_amount = 0
|
||||
@@ -216,7 +216,7 @@ class DicoverContentCurrentlyPopularZaps(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -269,12 +269,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently zapped the most.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -287,7 +286,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -314,12 +313,11 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular all over Nostr. I'm also used for testing subscriptions.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -332,14 +330,14 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -98,7 +98,7 @@ class DicoverContentCurrentlyPopularFollowers(DVMTaskInterface):
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().database(database).signer(keys).opts(opts).build()
|
||||
cli = ClientBuilder().database(database).signer(NostrSigner.keys(keys)).opts(opts).build()
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
|
||||
@@ -137,18 +137,18 @@ class DicoverContentCurrentlyPopularFollowers(DVMTaskInterface):
|
||||
filter1 = Filter().kind(definitions.EventDefinitions.KIND_NOTE).authors(followings).since(since)
|
||||
events = await cli.database().query([filter1])
|
||||
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.to_vec())) + " Events")
|
||||
|
||||
ns.finallist = {}
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
# if event.created_at().as_secs() > timestamp_since:
|
||||
filt = Filter().kinds(
|
||||
[definitions.EventDefinitions.KIND_ZAP, definitions.EventDefinitions.KIND_REACTION,
|
||||
definitions.EventDefinitions.KIND_REPOST,
|
||||
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||
reactions = await cli.database().query([filt])
|
||||
if len(reactions) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions)
|
||||
if len(reactions.to_vec()) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions.to_vec())
|
||||
|
||||
finallist_sorted = sorted(ns.finallist.items(), key=lambda x: x[1], reverse=True)[
|
||||
:int(options["max_results"])]
|
||||
@@ -192,7 +192,7 @@ class DicoverContentCurrentlyPopularFollowers(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -243,12 +243,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=3
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular from people you follow",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -261,7 +260,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=3
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -287,12 +286,11 @@ def build_example_subscription(name, identifier, admin_config, options, processi
|
||||
image = "https://image.nostr.build/d92652a6a07677e051d647dcf9f0f59e265299b3335a939d008183a911513f4a.jpg"
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular, just like the free DVM, I'm also used for testing subscriptions. (beta)",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"subscription": True,
|
||||
"nip90Params": {
|
||||
@@ -305,14 +303,14 @@ def build_example_subscription(name, identifier, admin_config, options, processi
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -121,16 +121,16 @@ class DicoverContentCurrentlyPopularGallery(DVMTaskInterface):
|
||||
|
||||
ge_events = await databasegallery.query([filter1])
|
||||
if self.dvm_config.LOGLEVEL.value >= LogLevel.DEBUG.value:
|
||||
print("[" + self.dvm_config.NIP89.NAME + "] Considering " + str(len(ge_events)) + " Events")
|
||||
print("[" + self.dvm_config.NIP89.NAME + "] Considering " + str(len(ge_events.to_vec())) + " Events")
|
||||
ns.finallist = {}
|
||||
|
||||
ids = []
|
||||
relays = []
|
||||
|
||||
if len(ge_events) == 0:
|
||||
if len(ge_events.to_vec()) == 0:
|
||||
return []
|
||||
|
||||
for ge_event in ge_events:
|
||||
for ge_event in ge_events.to_vec():
|
||||
|
||||
id = None
|
||||
for tag in ge_event.tags().to_vec():
|
||||
@@ -150,7 +150,7 @@ class DicoverContentCurrentlyPopularGallery(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
|
||||
cli = ClientBuilder().database(databasegallery).signer(keys).opts(opts).build()
|
||||
cli = ClientBuilder().database(databasegallery).signer(NostrSigner.keys(keys)).opts(opts).build()
|
||||
for relay in relays:
|
||||
await cli.add_relay(relay)
|
||||
|
||||
@@ -176,7 +176,7 @@ class DicoverContentCurrentlyPopularGallery(DVMTaskInterface):
|
||||
if event.created_at().as_secs() > timestamp_since:
|
||||
filt1 = Filter().kinds([definitions.EventDefinitions.KIND_DELETION]).event(event.id()).limit(1)
|
||||
deletions = await databasegallery.query([filt1])
|
||||
if len(deletions) > 0:
|
||||
if len(deletions.to_vec()) > 0:
|
||||
print("Deleted event, skipping")
|
||||
continue
|
||||
|
||||
@@ -185,13 +185,13 @@ class DicoverContentCurrentlyPopularGallery(DVMTaskInterface):
|
||||
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||
reactions = await databasegallery.query([filt])
|
||||
|
||||
if len(reactions) >= self.min_reactions:
|
||||
if len(reactions.to_vec()) >= self.min_reactions:
|
||||
found = False
|
||||
for ge_event in ge_events:
|
||||
for ge_event in ge_events.to_vec():
|
||||
for tag in ge_event.tags().to_vec():
|
||||
if tag.as_vec()[0] == "e":
|
||||
if event.id().to_hex() == tag.as_vec()[1]:
|
||||
ns.finallist[ge_event.id().to_hex()] = len(reactions)
|
||||
ns.finallist[ge_event.id().to_hex()] = len(reactions.to_vec())
|
||||
found = True
|
||||
break
|
||||
if found:
|
||||
@@ -241,7 +241,7 @@ class DicoverContentCurrentlyPopularGallery(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -293,12 +293,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -311,7 +310,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -338,12 +337,11 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular all over Nostr. I'm also used for testing subscriptions.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -356,14 +354,14 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -121,10 +121,10 @@ class DicoverContentCurrentlyPopularMostr(DVMTaskInterface):
|
||||
|
||||
events = await database.query([filter1])
|
||||
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.to_vec())) + " Events")
|
||||
ns.finallist = {}
|
||||
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
|
||||
if event.created_at().as_secs() > timestamp_since:
|
||||
filt = Filter().kinds(
|
||||
@@ -133,8 +133,8 @@ class DicoverContentCurrentlyPopularMostr(DVMTaskInterface):
|
||||
EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||
reactions = await database.query([filt])
|
||||
|
||||
if len(reactions) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions)
|
||||
if len(reactions.to_vec()) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions.to_vec())
|
||||
if len(ns.finallist) == 0:
|
||||
return self.result
|
||||
|
||||
@@ -179,7 +179,7 @@ class DicoverContentCurrentlyPopularMostr(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -247,12 +247,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -265,7 +264,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -293,12 +292,11 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular all over Nostr. I'm also used for testing subscriptions.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -311,14 +309,14 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -147,7 +147,7 @@ class DicoverContentCurrentlyPopularNonFollowers(DVMTaskInterface):
|
||||
if self.database is None:
|
||||
self.database = NostrDatabase.lmdb(self.db_name)
|
||||
|
||||
cli = ClientBuilder().database(self.database).signer(keys).opts(opts).build()
|
||||
cli = ClientBuilder().database(self.database).signer(NostrSigner.keys(keys)).opts(opts).build()
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
|
||||
@@ -185,10 +185,10 @@ class DicoverContentCurrentlyPopularNonFollowers(DVMTaskInterface):
|
||||
|
||||
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.to_vec())) + " Events")
|
||||
ns.finallist = {}
|
||||
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
if event.author().to_hex() in followings:
|
||||
continue
|
||||
|
||||
@@ -197,8 +197,8 @@ class DicoverContentCurrentlyPopularNonFollowers(DVMTaskInterface):
|
||||
definitions.EventDefinitions.KIND_REPOST,
|
||||
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||
reactions = await self.database.query([filt])
|
||||
if len(reactions) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions)
|
||||
if len(reactions.to_vec()) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions.to_vec())
|
||||
|
||||
print(len(ns.finallist))
|
||||
result_list = []
|
||||
@@ -228,7 +228,7 @@ class DicoverContentCurrentlyPopularNonFollowers(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -279,12 +279,11 @@ def build_example(name, identifier, admin_config, options, image, description, u
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -297,7 +296,7 @@ def build_example(name, identifier, admin_config, options, image, description, u
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return DicoverContentCurrentlyPopularNonFollowers(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
@@ -319,12 +318,11 @@ def build_example_subscription(name, identifier, admin_config, options, image, d
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -337,14 +335,14 @@ def build_example_subscription(name, identifier, admin_config, options, image, d
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -161,10 +161,10 @@ class DicoverContentCurrentlyPopularbyTopic(DVMTaskInterface):
|
||||
|
||||
events = await self.database.query(filters)
|
||||
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.to_vec())) + " Events")
|
||||
ns.finallist = {}
|
||||
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
if all(ele in event.content().lower() for ele in self.must_list):
|
||||
# if any(ele in event.content().lower() for ele in self.search_list):
|
||||
if not any(ele in event.content().lower() for ele in self.avoid_list):
|
||||
@@ -173,8 +173,8 @@ class DicoverContentCurrentlyPopularbyTopic(DVMTaskInterface):
|
||||
definitions.EventDefinitions.KIND_REPOST,
|
||||
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||
reactions = await self.database.query([filt])
|
||||
if len(reactions) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions)
|
||||
if len(reactions.to_vec()) >= self.min_reactions:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions.to_vec())
|
||||
|
||||
result_list = []
|
||||
finallist_sorted = sorted(ns.finallist.items(), key=lambda x: x[1], reverse=True)[:int(options["max_results"])]
|
||||
@@ -205,7 +205,7 @@ class DicoverContentCurrentlyPopularbyTopic(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -256,12 +256,11 @@ def build_example(name, identifier, admin_config, options, image, description, u
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -274,7 +273,7 @@ def build_example(name, identifier, admin_config, options, image, description, u
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -296,12 +295,11 @@ def build_example_subscription(name, identifier, admin_config, options, image, d
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -314,14 +312,14 @@ def build_example_subscription(name, identifier, admin_config, options, image, d
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -4,7 +4,7 @@ import os
|
||||
from datetime import timedelta
|
||||
from threading import Thread
|
||||
|
||||
from nostr_sdk import Client, Timestamp, PublicKey, Tag, Keys, Options, SecretKey, NostrSigner, Kind, RelayLimits
|
||||
from nostr_sdk import Client, Timestamp, PublicKey, Tag, Keys, Options, SecretKey, NostrSigner, Kind, RelayLimits, ClientBuilder
|
||||
|
||||
from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface, process_venv
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
@@ -74,9 +74,9 @@ class Discoverlatestperfollower(DVMTaskInterface):
|
||||
|
||||
relaylimits = RelayLimits.disable()
|
||||
|
||||
opts = (Options().relay_limits(relaylimits))
|
||||
opts = Options().relay_limits(relaylimits)
|
||||
|
||||
cli = Client.with_opts(keys, opts)
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).opts(opts).build()
|
||||
for relay in self.dvm_config.RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
# ropts = RelayOptions().ping(False)
|
||||
@@ -123,7 +123,7 @@ class Discoverlatestperfollower(DVMTaskInterface):
|
||||
from nostr_sdk import Filter
|
||||
|
||||
keys = Keys.parse(self.dvm_config.PRIVATE_KEY)
|
||||
cli = Client(keys)
|
||||
cli = Client(NostrSigner.keys(keys))
|
||||
for relay in self.dvm_config.RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
await cli.connect()
|
||||
@@ -205,11 +205,11 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://i.nostr.build/H6SMmCl7eRDvkbAn.jpg",
|
||||
"picture": "https://i.nostr.build/H6SMmCl7eRDvkbAn.jpg",
|
||||
"about": "I discover users you follow, but that have been inactive on Nostr",
|
||||
"action": "unfollow", # follow, mute, unmute
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"user": {
|
||||
"required": False,
|
||||
@@ -224,7 +224,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
|
||||
@@ -11,6 +11,7 @@ from nostr_sdk import Timestamp, PublicKey, Keys, Options, SecretKey, NostrSigne
|
||||
from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface, process_venv
|
||||
from nostr_dvm.utils import definitions
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
from nostr_dvm.utils.database_utils import init_db
|
||||
from nostr_dvm.utils.definitions import EventDefinitions
|
||||
from nostr_dvm.utils.dvmconfig import DVMConfig, build_default_config
|
||||
from nostr_dvm.utils.nip88_utils import NIP88Config, check_and_set_d_tag_nip88, check_and_set_tiereventid_nip88
|
||||
@@ -42,6 +43,8 @@ class DicoverContentDBUpdateScheduler(DVMTaskInterface):
|
||||
personalized = False
|
||||
result = ""
|
||||
database = None
|
||||
wot_counter = 0
|
||||
max_db_size = 280
|
||||
|
||||
async def init_dvm(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
||||
admin_config: AdminConfig = None, options=None):
|
||||
@@ -62,6 +65,8 @@ class DicoverContentDBUpdateScheduler(DVMTaskInterface):
|
||||
self.db_name = self.options.get("db_name")
|
||||
if self.options.get("db_since"):
|
||||
self.db_since = int(self.options.get("db_since"))
|
||||
if self.options.get("max_db_size"):
|
||||
self.max_db_size = int(self.options.get("max_db_size"))
|
||||
|
||||
use_logger = False
|
||||
if use_logger:
|
||||
@@ -135,16 +140,17 @@ class DicoverContentDBUpdateScheduler(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
if self.database is None:
|
||||
self.database = NostrDatabase.lmdb(self.db_name)
|
||||
self.database = await init_db(self.db_name, True, self.max_db_size)
|
||||
#self.database = NostrDatabase.lmdb(self.db_name)
|
||||
|
||||
cli = ClientBuilder().signer(keys).database(self.database).opts(opts).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(self.database).opts(opts).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
|
||||
await cli.connect()
|
||||
|
||||
if self.dvm_config.WOT_FILTERING:
|
||||
if self.dvm_config.WOT_FILTERING and self.wot_counter == 0:
|
||||
print("Calculating WOT for " + str(self.dvm_config.WOT_BASED_ON_NPUBS))
|
||||
filtering = cli.filtering()
|
||||
index_map, G = await build_wot_network(self.dvm_config.WOT_BASED_ON_NPUBS,
|
||||
@@ -166,7 +172,10 @@ class DicoverContentDBUpdateScheduler(DVMTaskInterface):
|
||||
# toc = time.time()
|
||||
# print(f'finished in {toc - tic} seconds')
|
||||
await filtering.add_public_keys(wot_keys)
|
||||
|
||||
self.wot_counter += 1
|
||||
# only calculate wot every 10th call
|
||||
if self.wot_counter >= 10:
|
||||
self.wot_counter = 0
|
||||
# Mute public key
|
||||
# await cli. (self.dvm_config.MUTE)
|
||||
|
||||
@@ -177,7 +186,6 @@ class DicoverContentDBUpdateScheduler(DVMTaskInterface):
|
||||
[definitions.EventDefinitions.KIND_NOTE, definitions.EventDefinitions.KIND_REACTION,
|
||||
definitions.EventDefinitions.KIND_ZAP]).since(since) # Notes, reactions, zaps
|
||||
|
||||
# filter = Filter().author(keys.public_key())
|
||||
if self.dvm_config.LOGLEVEL.value >= LogLevel.DEBUG.value:
|
||||
print("[" + self.dvm_config.IDENTIFIER + "] Syncing notes of the last " + str(
|
||||
self.db_since) + " seconds.. this might take a while..")
|
||||
@@ -214,12 +222,11 @@ def build_example(name, identifier, admin_config, options, image, description, u
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -232,7 +239,7 @@ def build_example(name, identifier, admin_config, options, image, description, u
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -254,12 +261,11 @@ def build_example_subscription(name, identifier, admin_config, options, image, d
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -272,14 +278,14 @@ def build_example_subscription(name, identifier, admin_config, options, image, d
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -87,10 +87,10 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I convert videos from urls to given output format.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"format": {
|
||||
"required": False,
|
||||
|
||||
@@ -78,7 +78,7 @@ class DiscoveryBotFarms(DVMTaskInterface):
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
|
||||
database = NostrDatabase.lmdb("db/nostr_profiles.db")
|
||||
cli = ClientBuilder().database(database).signer(keys).build()
|
||||
cli = ClientBuilder().database(database).signer(NostrSigner.keys(keys)).build()
|
||||
|
||||
await cli.add_relay("wss://relay.damus.io")
|
||||
# cli.add_relay("wss://atl.purplerelay.com")
|
||||
@@ -91,13 +91,13 @@ class DiscoveryBotFarms(DVMTaskInterface):
|
||||
filter1 = Filter().kind(Kind(0))
|
||||
events = await cli.database().query([filter1])
|
||||
result_list = []
|
||||
print("Events: " + str(len(events)))
|
||||
print("Events: " + str(len(events.to_vec())))
|
||||
|
||||
searchterms = str(options["search"]).split(";")
|
||||
index = 0
|
||||
if len(events) > 0:
|
||||
if len(events.to_vec()) > 0:
|
||||
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
if index < options["max_results"]:
|
||||
try:
|
||||
if any(ext in event.content().lower() for ext in searchterms):
|
||||
@@ -137,7 +137,7 @@ class DiscoveryBotFarms(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb("db/nostr_profiles.db")
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
await cli.add_relay("wss://relay.damus.io")
|
||||
await cli.add_relay("wss://nostr21.com")
|
||||
@@ -163,10 +163,10 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/981b560820bc283c58de7989b7abc6664996b487a531d852e4ef7322586a2122.jpg",
|
||||
"picture": "https://image.nostr.build/981b560820bc283c58de7989b7abc6664996b487a531d852e4ef7322586a2122.jpg",
|
||||
"about": "I hunt down bot farms.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"action": "mute", # follow, unfollow, mute, unmute
|
||||
"nip90Params": {
|
||||
"max_results": {
|
||||
@@ -178,7 +178,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {"relay": "wss://relay.damus.io"}
|
||||
|
||||
@@ -2,7 +2,7 @@ import json
|
||||
import os
|
||||
from datetime import timedelta
|
||||
|
||||
from nostr_sdk import Client, Timestamp, PublicKey, Tag, Keys, Options, SecretKey, NostrSigner, Kind, RelayLimits
|
||||
from nostr_sdk import Client, Timestamp, PublicKey, Tag, Keys, Options, SecretKey, NostrSigner, Kind, RelayLimits, ClientBuilder
|
||||
|
||||
from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface, process_venv
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
@@ -73,7 +73,7 @@ class DiscoverReports(DVMTaskInterface):
|
||||
Options().relay_limits(relaylimits))
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
cli = Client.with_opts(keys, opts)
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).opts(opts).build()
|
||||
# cli.add_relay("wss://relay.nostr.band")
|
||||
for relay in self.dvm_config.RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -171,10 +171,10 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/19872a2edd866258fa9eab137631efda89310d52b2c6ea8f99ef057325aa1c7b.jpg",
|
||||
"picture": "https://image.nostr.build/19872a2edd866258fa9eab137631efda89310d52b2c6ea8f99ef057325aa1c7b.jpg",
|
||||
"about": "I show users that have been reported by either your followers or your Web of Trust. Note: Anyone can report, so you might double check and decide for yourself who to mute. Considers spam, illegal and impersonation reports. Notice: This works with NIP51 mute lists. Not all clients support the new mute list format.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"action": "mute", # follow, unfollow, mute, unmute
|
||||
"nip90Params": {
|
||||
"since_days": {
|
||||
@@ -185,7 +185,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return DiscoverReports(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -5,7 +5,7 @@ from datetime import timedelta
|
||||
from threading import Thread
|
||||
|
||||
from nostr_sdk import Client, Timestamp, PublicKey, Tag, Keys, Options, SecretKey, NostrSigner, Kind, RelayOptions, \
|
||||
RelayLimits
|
||||
RelayLimits, ClientBuilder
|
||||
|
||||
from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface, process_venv
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
@@ -76,7 +76,7 @@ class DiscoverInactiveFollows(DVMTaskInterface):
|
||||
|
||||
opts = (Options().relay_limits(relaylimits))
|
||||
|
||||
cli = Client.with_opts(keys, opts)
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).opts(opts).build()
|
||||
for relay in self.dvm_config.RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
await cli.add_relay("wss://nostr.band")
|
||||
@@ -123,7 +123,7 @@ class DiscoverInactiveFollows(DVMTaskInterface):
|
||||
from nostr_sdk import Filter
|
||||
|
||||
keys = Keys.parse(self.dvm_config.PRIVATE_KEY)
|
||||
cli = Client(keys)
|
||||
cli = Client(NostrSigner.keys(keys))
|
||||
for relay in self.dvm_config.RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
await cli.connect()
|
||||
@@ -191,11 +191,11 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I discover users you follow, but that have been inactive on Nostr",
|
||||
"action": "unfollow", # follow, mute, unmute
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"user": {
|
||||
"required": False,
|
||||
@@ -210,7 +210,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return DiscoverInactiveFollows(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -5,7 +5,7 @@ from datetime import timedelta
|
||||
from threading import Thread
|
||||
|
||||
from nostr_sdk import Client, PublicKey, Tag, Keys, Options, SecretKey, NostrSigner, Kind, RelayOptions, \
|
||||
RelayLimits
|
||||
RelayLimits, ClientBuilder
|
||||
|
||||
from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface, process_venv
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
@@ -68,7 +68,8 @@ class DiscoverNonFollowers(DVMTaskInterface):
|
||||
relaylimits))
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
cli = Client.with_opts(keys, opts)
|
||||
cli= ClientBuilder().signer(NostrSigner.keys(keys)).opts(opts).build()
|
||||
|
||||
# cli.add_relay("wss://relay.nostr.band")
|
||||
for relay in self.dvm_config.RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -105,7 +106,7 @@ class DiscoverNonFollowers(DVMTaskInterface):
|
||||
async def scanList(users, instance, i, st):
|
||||
from nostr_sdk import Filter
|
||||
keys = Keys.parse(self.dvm_config.PRIVATE_KEY)
|
||||
cli = Client(keys)
|
||||
cli = Client(NostrSigner.keys(keys))
|
||||
for relay in self.dvm_config.RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
await cli.connect()
|
||||
@@ -194,10 +195,10 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I discover users you follow, but that don't follow you back.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"user": {
|
||||
"required": False,
|
||||
@@ -212,7 +213,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return DiscoverNonFollowers(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -72,7 +72,7 @@ class TrendingNotesGleasonator(DVMTaskInterface):
|
||||
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
cli = Client(keys)
|
||||
cli = Client(NostrSigner.keys(keys))
|
||||
|
||||
await cli.add_relay(options["relay"])
|
||||
await cli.connect()
|
||||
@@ -125,16 +125,15 @@ def build_example(name, identifier, admin_config, custom_processing_msg):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"picture": "0c760b3ecdbc993ba47b785d0adecf00c760b3ecdbc993ba47b785d0adecf0ec71fd9c59808e27d0665b9f77a32d8de.png",
|
||||
"image": "0c760b3ecdbc993ba47b785d0adecf00c760b3ecdbc993ba47b785d0adecf0ec71fd9c59808e27d0665b9f77a32d8de.png",
|
||||
"picture": "https://image.nostr.build/0c760b3ecdbc993ba47b785d0adecf00c760b3ecdbc993ba47b785d0adecf0ec71fd9c59808e27d0665b9f77a32d8de.png",
|
||||
"about": "I show trending notes from Soapbox Ditto",
|
||||
"amount": "Free",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return TrendingNotesGleasonator(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -117,16 +117,15 @@ def build_example(name, identifier, admin_config, custom_processing_msg):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://nostr.band/android-chrome-192x192.png",
|
||||
"picture": "https://nostr.band/android-chrome-192x192.png",
|
||||
"about": "I show trending notes from nostr.band",
|
||||
"amount": "Free",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
|
||||
@@ -83,16 +83,16 @@ def build_example(name, identifier, admin_config, announce=False):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I'm an all purpose DVM'",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {
|
||||
|
||||
@@ -133,10 +133,10 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use OpenAI's DALL·E 3",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"size": {
|
||||
"required": False,
|
||||
@@ -146,7 +146,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationDALLE(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config)
|
||||
|
||||
@@ -148,10 +148,10 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use Replicate to run StableDiffusion 3",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"ratio": {
|
||||
"required": False,
|
||||
@@ -161,7 +161,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationReplicate(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -143,10 +143,10 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use Replicate to run FluxPro",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"ratio": {
|
||||
"required": False,
|
||||
@@ -156,7 +156,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationReplicateFluxPro(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -141,10 +141,10 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use Replicate to run Recraft",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"ratio": {
|
||||
"required": False,
|
||||
@@ -154,7 +154,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationReplicateRecraft(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -127,10 +127,10 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use Replicate to run StableDiffusion XL",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"size": {
|
||||
"required": False,
|
||||
@@ -140,7 +140,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationReplicateSDXL(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -156,10 +156,10 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use Replicate to run StableDiffusion XL",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"size": {
|
||||
"required": False,
|
||||
@@ -169,7 +169,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationMLX(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -264,11 +264,11 @@ def build_example(name, identifier, admin_config, server_address, default_model=
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://i.nostr.build/NOXcCIPmOZrDTK35.jpg",
|
||||
"picture": "https://i.nostr.build/NOXcCIPmOZrDTK35.jpg",
|
||||
"about": "I draw images using Stable diffusion ultra",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"nip90Params": {
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params":{
|
||||
"negative_prompt": {
|
||||
"required": False,
|
||||
"values": []
|
||||
@@ -284,7 +284,7 @@ def build_example(name, identifier, admin_config, server_address, default_model=
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationSD35(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -175,10 +175,10 @@ def build_example(name, identifier, admin_config, server_address, default_model=
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I draw images based on a prompt with a Model called unstable diffusion",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"negative_prompt": {
|
||||
"required": False,
|
||||
@@ -191,7 +191,7 @@ def build_example(name, identifier, admin_config, server_address, default_model=
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationSDXL(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -197,10 +197,10 @@ def build_example(name, identifier, admin_config, server_address, default_lora="
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
||||
"picture": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
||||
"about": "I convert an image to another image, kinda random for now. ",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"negative_prompt": {
|
||||
"required": False,
|
||||
@@ -221,7 +221,7 @@ def build_example(name, identifier, admin_config, server_address, default_lora="
|
||||
options = {'default_lora': default_lora, 'strength': strength, 'server': server_address}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageGenerationSDXLIMG2IMG(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -114,10 +114,10 @@ def build_example(name, identifier, admin_config, server_address):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
||||
"picture": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
||||
"about": "I analyse Images an return a prompt or a prompt analysis",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"method": {
|
||||
"required": False,
|
||||
@@ -134,7 +134,7 @@ def build_example(name, identifier, admin_config, server_address):
|
||||
options = {'server': server_address}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageInterrogator(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -119,10 +119,10 @@ def build_example(name, identifier, admin_config, server_address):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
||||
"picture": "https://image.nostr.build/229c14e440895da30de77b3ca145d66d4b04efb4027ba3c44ca147eecde891f1.jpg",
|
||||
"about": "I upscale an image using realESRGan up to factor 4 (default is factor 4)",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"upscale": {
|
||||
"required": False,
|
||||
@@ -131,7 +131,7 @@ def build_example(name, identifier, admin_config, server_address):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return ImageUpscale(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -8,6 +8,7 @@ from nostr_sdk import Timestamp, PublicKey, Tag, Keys, Options, SecretKey, Nostr
|
||||
ClientBuilder, Filter, SyncOptions, SyncDirection, init_logger, LogLevel, Kind
|
||||
|
||||
from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface, process_venv
|
||||
from nostr_dvm.tasks.people_discovery_wot import DiscoverPeopleWOT
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
from nostr_dvm.utils.definitions import EventDefinitions
|
||||
from nostr_dvm.utils.dvmconfig import DVMConfig, build_default_config
|
||||
@@ -205,7 +206,7 @@ class DiscoverPeopleMyWOT(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -248,8 +249,8 @@ async def analyse_users(user_ids=None, dunbar=100000000):
|
||||
followers_filter = Filter().authors(user_keys).kind(Kind(3))
|
||||
followers = await database.query([followers_filter])
|
||||
allfriends = []
|
||||
if len(followers) > 0:
|
||||
for follower in followers:
|
||||
if len(followers.to_vec()) > 0:
|
||||
for follower in followers.to_vec():
|
||||
frens = []
|
||||
if len(follower.tags().to_vec()) < dunbar:
|
||||
for tag in follower.tags().to_vec():
|
||||
@@ -306,12 +307,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -324,7 +324,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -351,12 +351,11 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular all over Nostr. I'm also used for testing subscriptions.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -369,14 +368,14 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -210,7 +210,7 @@ class DiscoverPeopleWOT(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).build()
|
||||
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -253,8 +253,8 @@ async def analyse_users(user_ids=None, dunbar=100000000):
|
||||
followers_filter = Filter().authors(user_keys).kind(Kind(3))
|
||||
followers = await database.query([followers_filter])
|
||||
allfriends = []
|
||||
if len(followers) > 0:
|
||||
for follower in followers:
|
||||
if len(followers.to_vec()) > 0:
|
||||
for follower in followers.to_vec():
|
||||
frens = []
|
||||
if len(follower.tags().to_vec()) < dunbar:
|
||||
for tag in follower.tags().to_vec():
|
||||
@@ -311,12 +311,11 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -329,7 +328,7 @@ def build_example(name, identifier, admin_config, options, cost=0, update_rate=1
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -356,12 +355,11 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular all over Nostr. I'm also used for testing subscriptions.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -374,14 +372,14 @@ def build_example_subscription(name, identifier, admin_config, options, update_r
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import json
|
||||
import os
|
||||
from datetime import timedelta
|
||||
from itertools import islice
|
||||
|
||||
from nostr_sdk import Timestamp, Tag, Keys, Options, SecretKey, NostrSigner, NostrDatabase, \
|
||||
ClientBuilder, Filter, SyncOptions, SyncDirection, Kind
|
||||
ClientBuilder, Filter, SyncOptions, SyncDirection, Kind, PublicKey, RelayFilteringMode, RelayLimits
|
||||
|
||||
from nostr_dvm.interfaces.dvmtaskinterface import DVMTaskInterface, process_venv
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
@@ -12,6 +13,7 @@ from nostr_dvm.utils.dvmconfig import DVMConfig, build_default_config
|
||||
from nostr_dvm.utils.nip88_utils import NIP88Config
|
||||
from nostr_dvm.utils.nip89_utils import NIP89Config, check_and_set_d_tag
|
||||
from nostr_dvm.utils.output_utils import post_process_list_to_users
|
||||
from nostr_dvm.utils.wot_utils import build_wot_network
|
||||
|
||||
"""
|
||||
This File contains a Module to search for notes
|
||||
@@ -28,13 +30,12 @@ class SearchUser(DVMTaskInterface):
|
||||
dvm_config: DVMConfig
|
||||
last_schedule: int = 0
|
||||
db_name = "db/nostr_profiles.db"
|
||||
relay = "wss://profiles.nostr1.com"
|
||||
wot_counter = 0
|
||||
|
||||
async def init_dvm(self, name, dvm_config: DVMConfig, nip89config: NIP89Config, nip88config: NIP88Config = None,
|
||||
admin_config: AdminConfig = None, options=None):
|
||||
dvm_config.SCRIPT = os.path.abspath(__file__)
|
||||
if self.options.get("relay"):
|
||||
self.relay = self.options['relay']
|
||||
|
||||
if self.dvm_config.UPDATE_DATABASE:
|
||||
await self.sync_db()
|
||||
|
||||
@@ -81,9 +82,10 @@ class SearchUser(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().database(database).signer(keys).build()
|
||||
cli = ClientBuilder().database(database).signer(NostrSigner.keys(keys)).build()
|
||||
|
||||
await cli.add_relay(self.relay)
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
# cli.add_relay("wss://atl.purplerelay.com")
|
||||
await cli.connect()
|
||||
|
||||
@@ -95,13 +97,14 @@ class SearchUser(DVMTaskInterface):
|
||||
events = await cli.database().query([filter1])
|
||||
|
||||
result_list = []
|
||||
print("Events: " + str(len(events)))
|
||||
print("Events: " + str(len(events.to_vec())))
|
||||
index = 0
|
||||
if len(events) > 0:
|
||||
if len(events.to_vec()) > 0:
|
||||
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
if index < options["max_results"]:
|
||||
try:
|
||||
searchterm = " " + options["search"].lower() + " "
|
||||
if options["search"].lower() in event.content().lower():
|
||||
p_tag = Tag.parse(["p", event.author().to_hex()])
|
||||
#print(event.as_json())
|
||||
@@ -140,10 +143,42 @@ class SearchUser(DVMTaskInterface):
|
||||
sk = SecretKey.from_hex(self.dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
database = NostrDatabase.lmdb(self.db_name)
|
||||
cli = ClientBuilder().signer(keys).database(database).build()
|
||||
relaylimits = RelayLimits.disable()
|
||||
opts = (Options().relay_limits(relaylimits))
|
||||
if self.dvm_config.WOT_FILTERING:
|
||||
opts = opts.filtering_mode(RelayFilteringMode.WHITELIST)
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).database(database).opts(opts).build()
|
||||
|
||||
await cli.add_relay(self.relay)
|
||||
for relay in self.dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
await cli.connect()
|
||||
if self.dvm_config.WOT_FILTERING and self.wot_counter == 0:
|
||||
print("Calculating WOT for " + str(self.dvm_config.WOT_BASED_ON_NPUBS))
|
||||
filtering = cli.filtering()
|
||||
index_map, G = await build_wot_network(self.dvm_config.WOT_BASED_ON_NPUBS,
|
||||
depth=self.dvm_config.WOT_DEPTH, max_batch=500,
|
||||
max_time_request=10, dvm_config=self.dvm_config)
|
||||
|
||||
# Do we actually need pagerank here?
|
||||
# print('computing global pagerank...')
|
||||
# tic = time.time()
|
||||
# p_G = nx.pagerank(G, tol=1e-12)
|
||||
# print("network after pagerank: " + str(len(p_G)))
|
||||
|
||||
wot_keys = []
|
||||
for item in islice(G, len(G)):
|
||||
key = next((PublicKey.parse(pubkey) for pubkey, id in index_map.items() if id == item),
|
||||
None)
|
||||
wot_keys.append(key)
|
||||
|
||||
# toc = time.time()
|
||||
# print(f'finished in {toc - tic} seconds')
|
||||
await filtering.add_public_keys(wot_keys)
|
||||
|
||||
self.wot_counter += 1
|
||||
# only calculate wot every 10th call
|
||||
if self.wot_counter >= 10:
|
||||
self.wot_counter = 0
|
||||
|
||||
filter1 = Filter().kind(Kind(0))
|
||||
|
||||
@@ -169,10 +204,10 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/a99ab925084029d9468fef8330ff3d9be2cf67da473b024f2a6d48b5cd77197f.jpg",
|
||||
"picture": "https://image.nostr.build/a99ab925084029d9468fef8330ff3d9be2cf67da473b024f2a6d48b5cd77197f.jpg",
|
||||
"about": "I search users.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"users": {
|
||||
"required": False,
|
||||
@@ -198,13 +233,11 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {"relay": "wss://profiles.nostr1.com"}
|
||||
|
||||
return SearchUser(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
admin_config=admin_config, options=options)
|
||||
admin_config=admin_config)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -120,15 +120,15 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I summarize Text",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
admin_config2 = AdminConfig()
|
||||
admin_config2.REBROADCAST_NIP89 = False
|
||||
|
||||
@@ -125,15 +125,15 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/720eadc9af89084bb09de659af43ad17fec1f4b0887084e83ac0ae708dfa83a6.png",
|
||||
"picture": "https://image.nostr.build/720eadc9af89084bb09de659af43ad17fec1f4b0887084e83ac0ae708dfa83a6.png",
|
||||
"about": "I use a LLM connected via Huggingchat to summarize Inputs",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return TextSummarizationHuggingChat(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -149,15 +149,15 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://unleashed.chat/_app/immutable/assets/hero.pehsu4x_.jpeg",
|
||||
"picture": "https://unleashed.chat/_app/immutable/assets/hero.pehsu4x_.jpeg",
|
||||
"about": "I summarize Text with https://unleashed.chat",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
admin_config2 = AdminConfig()
|
||||
admin_config2.REBROADCAST_NIP89 = False
|
||||
|
||||
@@ -137,10 +137,10 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I extract text from media files with the Google API. I understand English by default",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"language": {
|
||||
"required": False,
|
||||
@@ -149,7 +149,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return SpeechToTextGoogle(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -100,15 +100,15 @@ def build_example(name, identifier, admin_config):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I extract text from pdf documents. I only support Latin letters",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
return TextExtractionPDF(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
admin_config=admin_config)
|
||||
|
||||
@@ -161,10 +161,10 @@ def build_example(name, identifier, admin_config, server_address):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I extract text from media files with WhisperX",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"model": {
|
||||
"required": False,
|
||||
@@ -178,7 +178,7 @@ def build_example(name, identifier, admin_config, server_address):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return SpeechToTextWhisperX(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -90,15 +90,15 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/720eadc9af89084bb09de659af43ad17fec1f4b0887084e83ac0ae708dfa83a6.png",
|
||||
"picture": "https://image.nostr.build/720eadc9af89084bb09de659af43ad17fec1f4b0887084e83ac0ae708dfa83a6.png",
|
||||
"about": "I use a LLM connected via Huggingchat",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return TextGenerationHuggingChat(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -105,15 +105,15 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use a LLM connected via OLLAMA",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return TextGenerationLLMLite(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config,
|
||||
|
||||
@@ -113,15 +113,15 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://unleashed.chat/_app/immutable/assets/hero.pehsu4x_.jpeg",
|
||||
"picture": "https://unleashed.chat/_app/immutable/assets/hero.pehsu4x_.jpeg",
|
||||
"about": "I generate Text with Unleashed.chat",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return TextGenerationUnleashedChat(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -175,10 +175,10 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I Generate Speech from Text",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"language": {
|
||||
"required": False,
|
||||
@@ -188,7 +188,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return TextToSpeech(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config,
|
||||
|
||||
@@ -118,11 +118,11 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I translate text from given text/event/job. Currently using Google TranslationGoogle Services to translate "
|
||||
"input into the language defined in params.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"language": {
|
||||
"required": False,
|
||||
@@ -143,7 +143,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return TranslationGoogle(name=name, dvm_config=dvm_config, nip89config=nip89config, admin_config=admin_config)
|
||||
|
||||
@@ -116,11 +116,11 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I translate text from given text/event/job using LibreTranslate Services to translate "
|
||||
"input into the language defined in params.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"language": {
|
||||
"required": False,
|
||||
@@ -141,7 +141,7 @@ def build_example(name, identifier, admin_config):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return TranslationLibre(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -120,15 +120,15 @@ def build_example(name, identifier, admin_config):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use Replicate to run StableDiffusion XL",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return VideoGenerationReplicateSVD(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -108,14 +108,14 @@ def build_example(name, identifier, admin_config, server_address):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I create a short video based on an image",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return VideoGenerationSVD(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
# DATABASE LOGIC
|
||||
import json
|
||||
import os
|
||||
import pathlib
|
||||
import shutil
|
||||
import sqlite3
|
||||
from dataclasses import dataclass
|
||||
from logging import Filter
|
||||
from sqlite3 import Error
|
||||
from tkinter.filedialog import Directory
|
||||
|
||||
from nostr_sdk import Timestamp, Keys, PublicKey, Filter, Kind
|
||||
from nostr_sdk import Timestamp, Keys, PublicKey, Filter, Kind, make_private_msg, NostrSigner, NostrDatabase
|
||||
|
||||
from nostr_dvm.utils.definitions import relay_timeout
|
||||
from nostr_dvm.utils.nostr_utils import send_nip04_dm
|
||||
@@ -192,7 +196,8 @@ async def update_user_balance(db, npub, additional_sats, client, config, giftwra
|
||||
|
||||
# always send giftwrapped. sorry not sorry.
|
||||
#if giftwrap:
|
||||
await client.send_private_msg(PublicKey.parse(npub), message, None)
|
||||
event = await make_private_msg(NostrSigner.keys(keys), PublicKey.parse(npub), message)
|
||||
await client.send_event(event)
|
||||
#else:
|
||||
# await send_nip04_dm(client, message, PublicKey.parse(npub), config)
|
||||
|
||||
@@ -245,6 +250,30 @@ async def get_or_add_user(db, npub, client, config, update=False, skip_meta=Fals
|
||||
return user
|
||||
|
||||
|
||||
async def init_db(database, wipe=False, limit=1000, print_filesize=True):
|
||||
# LMDB can't grow smaller, so by using this function we can wipe the database on init to avoid
|
||||
# it growing too big. If wipe is set to true, the database will be deleted once the size is above the limit param.
|
||||
database_content = database + "/data.mdb"
|
||||
if os.path.isfile(database_content):
|
||||
file_stats = os.stat(database_content)
|
||||
sizeinmb = file_stats.st_size / (1024 * 1024)
|
||||
if print_filesize:
|
||||
print("Filesize of database \"" + database + "\": " + str(sizeinmb) + " Mb.")
|
||||
|
||||
if wipe and sizeinmb > limit:
|
||||
try:
|
||||
shutil.rmtree(database)
|
||||
print("Removed database due to large file size. Waiting for resync")
|
||||
except OSError as e:
|
||||
print("Error: %s - %s." % (e.filename, e.strerror))
|
||||
else:
|
||||
print("Creating database: " + database)
|
||||
|
||||
|
||||
return NostrDatabase.lmdb(database)
|
||||
|
||||
|
||||
|
||||
async def fetch_user_metadata(npub, client):
|
||||
name = ""
|
||||
nip05 = ""
|
||||
|
||||
@@ -12,7 +12,7 @@ from nostr_dvm.utils.output_utils import PostProcessFunctionType
|
||||
|
||||
async def build_client(config):
|
||||
keys = Keys.parse(config.PRIVATE_KEY)
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
for relay in config.RELAY_LIST:
|
||||
await client.add_relay(relay)
|
||||
@@ -44,24 +44,26 @@ def build_external_dvm(pubkey, task, kind, fix_cost, per_unit_cost, config,
|
||||
nip89content = json.loads(nip89content_str)
|
||||
if nip89content.get("name"):
|
||||
name = nip89content.get("name")
|
||||
if nip89content.get("image"):
|
||||
if nip89content.get("picture"):
|
||||
image = nip89content.get("picture")
|
||||
elif nip89content.get("image"):
|
||||
image = nip89content.get("image")
|
||||
if nip89content.get("about"):
|
||||
about = nip89content.get("about")
|
||||
if nip89content.get("nip90Params"):
|
||||
nip90params = nip89content["nip90Params"]
|
||||
if nip89content.get("encryptionSupported"):
|
||||
encryption_supported = nip89content["encryptionSupported"]
|
||||
if nip89content.get("cashuAccepted"):
|
||||
cashu_accepted = nip89content["cashuAccepted"]
|
||||
if nip89content.get("supportsEncryption"):
|
||||
encryption_supported = nip89content["supportsEncryption"]
|
||||
if nip89content.get("acceptsNutZaps"):
|
||||
cashu_accepted = nip89content["acceptsNutZaps"]
|
||||
else:
|
||||
print("No NIP89 set for " + name)
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": about,
|
||||
"encryptionSupported": encryption_supported,
|
||||
"cashuAccepted": cashu_accepted,
|
||||
"supportsEncryption": encryption_supported,
|
||||
"acceptsNutZaps": cashu_accepted,
|
||||
"nip90Params": nip90params
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
|
||||
@@ -7,7 +7,7 @@ from nostr_dvm.utils.print_utils import bcolors
|
||||
async def gallery_announce_list(tags, dvm_config, client):
|
||||
keys = Keys.parse(dvm_config.NIP89.PK)
|
||||
content = ""
|
||||
event = EventBuilder(Kind(10011), content, tags).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(10011), content).tags(tags).sign_with_keys(keys)
|
||||
eventid = await send_event(event, client=client, dvm_config=dvm_config)
|
||||
|
||||
print(
|
||||
|
||||
@@ -15,9 +15,9 @@ async def announce_dm_relays(dvm_config, client):
|
||||
keys = Keys.parse(dvm_config.NIP89.PK)
|
||||
content = ""
|
||||
|
||||
event = EventBuilder(Kind(10050), content, tags).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(10050), content).tags(tags).sign_with_keys(keys)
|
||||
eventid = await send_event(event, client=client, dvm_config=dvm_config)
|
||||
if (eventid is not None):
|
||||
if eventid is not None:
|
||||
print(
|
||||
bcolors.BLUE + "[" + dvm_config.NIP89.NAME + "] Announced DM relays for " + dvm_config.NIP89.NAME + " (EventID: " + str(
|
||||
eventid.id.to_hex()) + ")" + bcolors.ENDC)
|
||||
@@ -39,9 +39,9 @@ async def nip65_announce_relays(dvm_config, client):
|
||||
keys = Keys.parse(dvm_config.NIP89.PK)
|
||||
content = ""
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_RELAY_ANNOUNCEMENT, content, tags).sign_with_keys(keys)
|
||||
event = EventBuilder(EventDefinitions.KIND_RELAY_ANNOUNCEMENT, content).tags(tags).sign_with_keys(keys)
|
||||
eventid = await send_event(event, client=client, dvm_config=dvm_config)
|
||||
if (eventid is not None):
|
||||
if eventid is not None:
|
||||
print(
|
||||
bcolors.BLUE + "[" + dvm_config.NIP89.NAME + "] Announced NIP 65 for " + dvm_config.NIP89.NAME + " (EventID: " + str(
|
||||
eventid.id.to_hex()) + ")" + bcolors.ENDC)
|
||||
|
||||
@@ -83,7 +83,7 @@ async def nip88_delete_announcement(eid: str, keys: Keys, dtag: str, client: Cli
|
||||
e_tag = Tag.parse(["e", eid])
|
||||
a_tag = Tag.parse(
|
||||
["a", str(EventDefinitions.KIND_NIP88_TIER_EVENT) + ":" + keys.public_key().to_hex() + ":" + dtag])
|
||||
event = EventBuilder(Kind(5), "", [e_tag, a_tag]).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(5), "").tags([e_tag, a_tag]).sign_with_keys(keys)
|
||||
await send_event(event, client, config)
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ async def nip88_has_active_subscription(user: PublicKey, tiereventdtag, client:
|
||||
|
||||
async def nip88_announce_tier(dvm_config, client):
|
||||
title_tag = Tag.parse(["title", str(dvm_config.NIP88.TITLE)])
|
||||
image_tag = Tag.parse(["image", str(dvm_config.NIP88.IMAGE)])
|
||||
image_tag = Tag.parse(["picture", str(dvm_config.NIP88.IMAGE)])
|
||||
d_tag = Tag.parse(["d", dvm_config.NIP88.DTAG])
|
||||
|
||||
# zap splits. Feel free to change this for your DVM
|
||||
@@ -176,7 +176,7 @@ async def nip88_announce_tier(dvm_config, client):
|
||||
|
||||
keys = Keys.parse(dvm_config.NIP89.PK)
|
||||
content = dvm_config.NIP88.CONTENT
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP88_TIER_EVENT, content, tags).sign_with_keys(keys)
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP88_TIER_EVENT, content).tags(tags).sign_with_keys(keys)
|
||||
annotier_id = await send_event(event, client=client, dvm_config=dvm_config)
|
||||
|
||||
if dvm_config.NIP89 is not None:
|
||||
|
||||
@@ -29,7 +29,7 @@ async def nip89_announce_tasks(dvm_config, client):
|
||||
d_tag = Tag.parse(["d", dvm_config.NIP89.DTAG])
|
||||
keys = Keys.parse(dvm_config.NIP89.PK)
|
||||
content = dvm_config.NIP89.CONTENT
|
||||
event = EventBuilder(EventDefinitions.KIND_ANNOUNCEMENT, content, [k_tag, d_tag]).sign_with_keys(keys)
|
||||
event = EventBuilder(EventDefinitions.KIND_ANNOUNCEMENT, content).tags([k_tag, d_tag]).sign_with_keys(keys)
|
||||
eventid = await send_event(event, client=client, dvm_config=dvm_config)
|
||||
|
||||
print(
|
||||
@@ -65,7 +65,7 @@ async def nip89_delete_announcement(eid: str, keys: Keys, dtag: str, client: Cli
|
||||
e_tag = Tag.parse(["e", eid])
|
||||
a_tag = Tag.parse(
|
||||
["a", str(EventDefinitions.KIND_ANNOUNCEMENT.as_u16()) + ":" + keys.public_key().to_hex() + ":" + dtag])
|
||||
event = EventBuilder(Kind(5), "", [e_tag, a_tag]).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(5), "").tags([e_tag, a_tag]).sign_with_keys(keys)
|
||||
print(f"POW event: {event.as_json()}")
|
||||
await send_event(event, client, config)
|
||||
|
||||
@@ -74,7 +74,7 @@ async def nip89_delete_announcement_pow(eid: str, keys: Keys, dtag: str, client:
|
||||
e_tag = Tag.parse(["e", eid])
|
||||
a_tag = Tag.parse(
|
||||
["a", str(EventDefinitions.KIND_ANNOUNCEMENT.as_u16()) + ":" + keys.public_key().to_hex() + ":" + dtag])
|
||||
event = EventBuilder(Kind(5), "", [e_tag, a_tag]).pow(28).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(5), "").tags([e_tag, a_tag]).pow(28).sign_with_keys(keys)
|
||||
print(f"POW event: {event.as_json()}")
|
||||
await send_event(event, client, config)
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ async def generate_nip98_header(pkeys_hex, url="", kind="POST", filepath=""):
|
||||
if kind == "POST":
|
||||
payloadtag = Tag.parse(["payload", sha256sum(filepath)])
|
||||
tags.append(payloadtag)
|
||||
eb = EventBuilder(Kind(27235), "", tags)
|
||||
eb = EventBuilder(Kind(27235), "").tags(tags)
|
||||
event = eb.sign_with_keys(keys)
|
||||
|
||||
encoded_nip98_event = base64.b64encode(event.as_json().encode('utf-8')).decode('utf-8')
|
||||
|
||||
@@ -5,9 +5,9 @@ from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
import dotenv
|
||||
from nostr_sdk import Filter, Client, Alphabet, EventId, Event, PublicKey, Tag, Keys, nip04_decrypt, Metadata, Options, \
|
||||
Nip19Event, SingleLetterTag, RelayLimits, SecretKey, NostrSigner, Connection, ConnectionTarget, \
|
||||
EventSource, EventBuilder, Kind
|
||||
from nostr_sdk import Filter, Client, Alphabet, EventId, Event, PublicKey, Tag, Keys, nip04_decrypt, nip44_decrypt, Metadata, Options, \
|
||||
Nip19Event, SingleLetterTag, RelayLimits, SecretKey, Connection, ConnectionTarget, \
|
||||
EventBuilder, Kind, ClientBuilder, SendEventOutput, NostrSigner
|
||||
|
||||
from nostr_dvm.utils.definitions import EventDefinitions, relay_timeout
|
||||
|
||||
@@ -33,8 +33,7 @@ async def get_event_by_id(event_id_str: str, client: Client, config=None) -> Eve
|
||||
|
||||
|
||||
async def get_events_async(client, filter, timeout):
|
||||
source_l = EventSource.relays(timedelta(seconds=timeout))
|
||||
events = await client.fetch_events([filter], source_l)
|
||||
events = await client.fetch_events([filter], timedelta(seconds=timeout))
|
||||
return events.to_vec()
|
||||
|
||||
|
||||
@@ -176,14 +175,14 @@ async def get_main_relays(event_to_send: Event, client: Client, dvm_config):
|
||||
content = json.loads(followlist.content())
|
||||
relays = []
|
||||
for relay in content:
|
||||
if relay not in dvm_config.AVOID_OUTBOX_RELAY_LIST:
|
||||
if relay.rstrip("/") not in dvm_config.AVOID_OUTBOX_RELAY_LIST:
|
||||
relays.append(relay)
|
||||
return relays
|
||||
except:
|
||||
return []
|
||||
|
||||
|
||||
async def send_event_outbox(event: Event, client, dvm_config) -> EventId:
|
||||
async def send_event_outbox(event: Event, client, dvm_config) -> SendEventOutput | None:
|
||||
# 1. OK, Let's overcomplicate things.
|
||||
# 2. If our event has a relays tag, we just send the event to these relay in the classical way.
|
||||
relays = []
|
||||
@@ -208,6 +207,9 @@ async def send_event_outbox(event: Event, client, dvm_config) -> EventId:
|
||||
print("[" + dvm_config.NIP89.NAME + "] No Inbox found, replying to generic relays")
|
||||
relays = await get_main_relays(event, client, dvm_config)
|
||||
|
||||
|
||||
if len(relays) == 0:
|
||||
return
|
||||
# eventid = await send_event(event, client, dvm_config)
|
||||
# return eventid
|
||||
|
||||
@@ -215,10 +217,10 @@ async def send_event_outbox(event: Event, client, dvm_config) -> EventId:
|
||||
relaylimits = RelayLimits.disable()
|
||||
connection = Connection().embedded_tor().target(ConnectionTarget.ONION)
|
||||
# connection = Connection().addr("127.0.0.1:9050").target(ConnectionTarget.ONION)
|
||||
opts = Options().relay_limits(relaylimits).connection(connection).connection_timeout(timedelta(seconds=30))
|
||||
opts = Options().relay_limits(relaylimits).connection(connection).timeout(timedelta(seconds=5))
|
||||
sk = SecretKey.from_hex(dvm_config.PRIVATE_KEY)
|
||||
keys = Keys.parse(sk.to_hex())
|
||||
outboxclient = Client.with_opts(keys, opts)
|
||||
outboxclient = ClientBuilder().signer(NostrSigner.keys(keys)).opts(opts).build()
|
||||
print("[" + dvm_config.NIP89.NAME + "] Receiver Inbox relays: " + str(relays))
|
||||
|
||||
for relay in relays[:5]:
|
||||
@@ -236,32 +238,23 @@ async def send_event_outbox(event: Event, client, dvm_config) -> EventId:
|
||||
event_id = None
|
||||
print(e)
|
||||
|
||||
for relay in relays[:5]:
|
||||
try:
|
||||
await outboxclient.force_remove_relay(relay)
|
||||
except:
|
||||
print("Error removing relay: " + relay)
|
||||
|
||||
# 5. Fallback, if we couldn't send the event to any relay, we try to send to generic relays instead.
|
||||
if event_id is None:
|
||||
relays = await get_main_relays(event, client, dvm_config)
|
||||
if len(relays) == 0:
|
||||
return None
|
||||
for relay in relays:
|
||||
await outboxclient.add_relay(relay)
|
||||
try:
|
||||
await outboxclient.connect()
|
||||
event_id = await outboxclient.send_event(event)
|
||||
for relay in relays:
|
||||
try:
|
||||
await outboxclient.force_remove_relay(relay)
|
||||
except:
|
||||
print("Error removing relay: " + relay)
|
||||
except Exception as e:
|
||||
# Love yourself then.
|
||||
event_id = None
|
||||
print(e)
|
||||
await outboxclient.remove_all_relays()
|
||||
await outboxclient.disconnect()
|
||||
|
||||
await outboxclient.shutdown()
|
||||
|
||||
return event_id
|
||||
|
||||
|
||||
@@ -302,9 +295,10 @@ async def send_event(event: Event, client: Client, dvm_config):
|
||||
|
||||
|
||||
def check_and_decrypt_tags(event, dvm_config):
|
||||
try:
|
||||
is_encrypted = False
|
||||
use_legacy_encryption = False
|
||||
|
||||
is_encrypted = False
|
||||
try:
|
||||
p = ""
|
||||
for tag in event.tags().to_vec():
|
||||
if tag.as_vec()[0] == 'encrypted':
|
||||
@@ -316,11 +310,21 @@ def check_and_decrypt_tags(event, dvm_config):
|
||||
if p != dvm_config.PUBLIC_KEY:
|
||||
print("[" + dvm_config.NIP89.NAME + "] Task encrypted and not addressed to this DVM, "
|
||||
"skipping..")
|
||||
return None
|
||||
return None, False
|
||||
|
||||
elif p == dvm_config.PUBLIC_KEY:
|
||||
tags_str = nip04_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
event.author(), event.content())
|
||||
try:
|
||||
tags_str = nip04_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
event.author(), event.content())
|
||||
except:
|
||||
try:
|
||||
tags_str = nip44_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
event.author(), event.content())
|
||||
except:
|
||||
print("Wrong Nip44 Format")
|
||||
return None, False
|
||||
use_legacy_encryption = True
|
||||
|
||||
params = json.loads(tags_str)
|
||||
params.append(Tag.parse(["p", p]).as_vec())
|
||||
params.append(Tag.parse(["encrypted"]).as_vec())
|
||||
@@ -331,7 +335,7 @@ def check_and_decrypt_tags(event, dvm_config):
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
return event
|
||||
return event, use_legacy_encryption
|
||||
|
||||
|
||||
def check_and_decrypt_own_tags(event, dvm_config):
|
||||
@@ -351,8 +355,12 @@ def check_and_decrypt_own_tags(event, dvm_config):
|
||||
return None
|
||||
|
||||
elif event.author().to_hex() == dvm_config.PUBLIC_KEY:
|
||||
tags_str = nip04_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
PublicKey.from_hex(p), event.content())
|
||||
try:
|
||||
tags_str = nip44_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
PublicKey.from_hex(p), event.content())
|
||||
except:
|
||||
tags_str = nip04_decrypt(Keys.parse(dvm_config.PRIVATE_KEY).secret_key(),
|
||||
PublicKey.from_hex(p), event.content())
|
||||
params = json.loads(tags_str)
|
||||
params.append(Tag.parse(["p", p]).as_vec())
|
||||
params.append(Tag.parse(["encrypted"]).as_vec())
|
||||
@@ -368,7 +376,7 @@ def check_and_decrypt_own_tags(event, dvm_config):
|
||||
|
||||
async def update_profile_lnaddress(private_key, dvm_config, lud16="", ):
|
||||
keys = Keys.parse(private_key)
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in dvm_config.RELAY_LIST:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -386,7 +394,7 @@ async def update_profile(dvm_config, client, lud16=""):
|
||||
nip89content = json.loads(dvm_config.NIP89.CONTENT)
|
||||
name = nip89content.get("name")
|
||||
about = nip89content.get("about")
|
||||
image = nip89content.get("image")
|
||||
image = nip89content.get("picture")
|
||||
|
||||
# Set metadata
|
||||
metadata = Metadata() \
|
||||
@@ -413,7 +421,7 @@ async def send_nip04_dm(client: Client, msg, receiver: PublicKey, dvm_config):
|
||||
keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
||||
content = await keys.nip04_encrypt(receiver, msg)
|
||||
ptag = Tag.parse(["p", receiver.to_hex()])
|
||||
event = EventBuilder(Kind(4), content, [ptag]).sign_with_keys(Keys.parse(dvm_config.PRIVATE_KEY))
|
||||
event = EventBuilder(Kind(4), content).tags([ptag]).sign_with_keys(Keys.parse(dvm_config.PRIVATE_KEY))
|
||||
await client.send_event(event)
|
||||
|
||||
# relays = await get_dm_relays(event, client, dvm_config)
|
||||
|
||||
@@ -6,10 +6,10 @@ from datetime import timedelta
|
||||
|
||||
import requests
|
||||
from nostr_sdk import Tag, Keys, nip44_encrypt, nip44_decrypt, Nip44Version, EventBuilder, Client, Filter, Kind, \
|
||||
EventId, nip04_decrypt, nip04_encrypt, PublicKey, Metadata
|
||||
EventId, nip04_decrypt, nip04_encrypt, PublicKey, Metadata, NostrSigner
|
||||
|
||||
from nostr_dvm.utils.database_utils import fetch_user_metadata
|
||||
from nostr_dvm.utils.definitions import EventDefinitions, relay_timeout, relay_timeout_long
|
||||
from nostr_dvm.utils.definitions import EventDefinitions
|
||||
from nostr_dvm.utils.dvmconfig import DVMConfig
|
||||
from nostr_dvm.utils.nostr_utils import check_and_set_private_key
|
||||
from nostr_dvm.utils.print_utils import bcolors
|
||||
@@ -52,7 +52,7 @@ class NutZapWallet:
|
||||
|
||||
async def client_connect(self, relay_list, keys):
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -103,7 +103,7 @@ class NutZapWallet:
|
||||
relay_tag = Tag.parse(["relay", relay])
|
||||
tags.append(relay_tag)
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_NUT_WALLET, content, tags).sign_with_keys(keys)
|
||||
event = EventBuilder(EventDefinitions.KIND_NUT_WALLET, content).tags(tags).sign_with_keys(keys)
|
||||
send_response = await client.send_event(event)
|
||||
|
||||
print(
|
||||
@@ -327,7 +327,7 @@ class NutZapWallet:
|
||||
p_tag = Tag.parse(["p", sender_hex])
|
||||
tags.append(p_tag)
|
||||
|
||||
event = EventBuilder(Kind(7376), content, tags).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(7376), content).tags(tags).sign_with_keys(keys)
|
||||
eventid = await client.send_event(event)
|
||||
|
||||
async def create_unspent_proof_event(self, nut_wallet: NutWallet, mint_proofs, mint_url, amount, direction, marker,
|
||||
@@ -373,7 +373,7 @@ class NutZapWallet:
|
||||
else:
|
||||
content = nip44_encrypt(keys.secret_key(), keys.public_key(), message, Nip44Version.V2)
|
||||
|
||||
event = EventBuilder(Kind(7375), content, tags).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(7375), content).tags(tags).sign_with_keys(keys)
|
||||
eventid = await client.send_event(event)
|
||||
await self.create_transaction_history_event(nut_wallet, amount, nut_wallet.unit, old_event_id, eventid.id,
|
||||
direction, marker, sender_hex, event_hex, client, keys)
|
||||
@@ -436,7 +436,7 @@ class NutZapWallet:
|
||||
pubkey = Keys.parse(nut_wallet.privkey).public_key().to_hex()
|
||||
tags.append(Tag.parse(["pubkey", pubkey]))
|
||||
|
||||
event = EventBuilder(Kind(10019), "", tags).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(10019), "").tags(tags).sign_with_keys(keys)
|
||||
eventid = await client.send_event(event)
|
||||
print(
|
||||
bcolors.CYAN + "[" + nut_wallet.name + "] Announced mint preferences info event (" + eventid.id.to_hex() + ")" + bcolors.ENDC)
|
||||
@@ -624,7 +624,7 @@ class NutZapWallet:
|
||||
}
|
||||
tags.append(Tag.parse(["proof", json.dumps(nut_proof)]))
|
||||
|
||||
event = EventBuilder(Kind(9321), comment, tags).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(9321), comment).tags(tags).sign_with_keys(keys)
|
||||
response = await client.send_event(event)
|
||||
|
||||
await self.update_spend_mint_proof_event(nut_wallet, proofs, mint_url, "zapped", keys.public_key().to_hex(),
|
||||
|
||||
@@ -2,28 +2,34 @@
|
||||
# even trying to send to them, avoiding potential errors or delays on the way.
|
||||
|
||||
|
||||
AVOID_OUTBOX_RELAY_LIST = ["wss://nos.lol", "wss://relay.primal.net",
|
||||
"wss://nostrelay.yeghro.site", "wss://nostr.wine", "wss://filter.nostr.wine",
|
||||
AVOID_OUTBOX_RELAY_LIST = ["wss://nos.lol", "wss://nostr.fmt.wiz.biz", "wss://nostrelay.yeghro.site", "wss://nostr.wine",
|
||||
"wss://filter.nostr.wine", "wss://relay.lightwork.space", "wss://onchain.pub",
|
||||
"wss://nostr21.com", "wss://nostr.bitcoiner.social", "wss://nostr.orangepill.dev",
|
||||
"wss://brb.io",
|
||||
"wss://brb.io", "wss://relay.nostr.ch", "wss://nostr.rock", "wss://nostr.sandwich.farm",
|
||||
"wss://nostr.onsats.org", "wss://nostr-pub.semisol.dev", "wss://no.str.cr",
|
||||
"wss://nostr.zebedee.cloud", "wss://blg.nostr.sx", "wss://relay.nostr.ai",
|
||||
"wss://nostr.600.wtf", "ws://umbrel.local:4848", "wss://192.168.1.52:5051",
|
||||
"wss://nostrvista.aaroniumii.com", "wss://https//nostr.einundzwanzig.space",
|
||||
"wss://nostr.localhost.re", "wss://shopstr.store", "wss://th1.nostr.earnkrub.xyz",
|
||||
"wss://relay.lnpay.me", "wss://relay.snort.social", "wss://relay.minds.com/nostr/v1/ws",
|
||||
"ws://elitedesk:4848",
|
||||
"ws://elitedesk:4848", "wss://wot.nostr.net", "wss://blg.nostr.sx",
|
||||
"wss://nostr-pub.semisol.dev", "wss://mostr.mostr.pub", "wss://relay.mostr.pub",
|
||||
"wss://minds.com",
|
||||
"wss://minds.com", "wss://nostr.leximaster.com", "wss://th2.nostr.earnkrub.xyz",
|
||||
"wss://relay.zerosatoshi.xyz", "wss://bouncer.minibolt.info",
|
||||
"wss://yabu.me", "wss://relay.yozora.world", "wss://filter.nostr.wine/?global=all",
|
||||
"wss://eden.nostr.land",
|
||||
"wss://eden.nostr.land", "wss://relay.otherstuff.fyi",
|
||||
"wss://relay.orangepill.ovh", "wss://nostr.jcloud.es", "wss://af.purplerelay.com",
|
||||
"wss://za.purplerelay.com", "ws://192.168.18.7:7777",
|
||||
"wss://za.purplerelay.com", "ws://192.168.18.7:7777", "wss://nostr.fediverse.jp",
|
||||
"wss://relay.nostrich.land", "wss://relay.nostrplebs.com", "wss://relay.nostrich.land",
|
||||
"ws://elitedesk.local:4848",
|
||||
"ws://elitedesk.local:4848", "wss://nrelay-jp.c-stellar.net", "wss://blastr.f7z.xyz",
|
||||
"wss://rss.nos.social", "wss://atlas.nostr.land", "wss://puravida.nostr.land",
|
||||
"wss://nostr.inosta.cc",
|
||||
"wss://nostr.inosta.cc", "wss://relay-jp.nostr.wirednet.jp",
|
||||
"wss://relay.orangepill.dev", "wss://no.str.cr", "wss://nostr.milou.lol",
|
||||
"wss://relay.nostr.com.au",
|
||||
"wss://relay.nostr.com.au", "wss://nostrelites.com", "wss://sfr0.nostr1.com",
|
||||
"wss://puravida.nostr.land", "wss://atlas.nostr.land", "wss://nostr-pub.wellorder.net",
|
||||
"wss://relay.current.fyi",
|
||||
"wss://relay.current.fyi", "wss://nfrelay.app",
|
||||
"wss://nostr.thesamecat.io", "wss://nostr.plebchain.org", "wss://relay.noswhere.com",
|
||||
"wss://nostr.uselessshit.co",
|
||||
"wss://nostr.uselessshit.co", "wss://tictac.nostr1.com", "wss://abcdefg20240104205400.xyz/v1",
|
||||
"wss://bitcoiner.social", "wss://relay.stoner.com", "wss://nostr.l00p.org",
|
||||
"wss://relay.nostr.ro", "wss://nostr.kollider.xyz",
|
||||
"wss://relay.valera.co", "wss://relay.austrich.net", "wss://relay.nostrich.de",
|
||||
@@ -48,14 +54,14 @@ AVOID_OUTBOX_RELAY_LIST = ["wss://nos.lol", "wss://relay.primal.net",
|
||||
"wss://relay.nostreggs.io", "wss://relay.blackbyte.nl", "ws://localhost:8080",
|
||||
"wss://127.0.0.1:4869", "wss://sendit.nosflare.io",
|
||||
"wss://astral.ninja", "wss://nostr.libertasprimordium.com", "wss://relay.shitforce.one",
|
||||
"wss://nostr.cro.social",
|
||||
"wss://nostr.cro.social", "wss://datagrave.wild-vibes.ts.net/nostr", "wss://nostr01.sharkshake.net",
|
||||
"wss://relay.nostreggs.io", "wss://nostr.rocks", "wss://groups.0xchat.com",
|
||||
"wss://bostr.lecturify.net", "wss://dave.st.germa.in/nostr",
|
||||
"wss://dvms.f7z.io", "wss://nostr.social", "wss://i.nostr.build",
|
||||
"wss://teemie1-relay.duckdns.org",
|
||||
"wss://teemie1-relay.duckdns.org", "wss://newperspectives.duckdns.org",
|
||||
"wss://nostrs.build", "wss://relay.hllo.live", "wss://relay-pub.deschooling.us",
|
||||
"wss://nostr.sandwich.farm", "wss://nostr.lol", "wss://nostr.developer.li",
|
||||
"wss://paid.spore.ws",
|
||||
"wss://paid.spore.ws", "ws://relay.damus.io",
|
||||
"ws://ofotwjuiv7t6q4azt2fjx3qo7esglmxdeqmh2qvdsdnxw5eqgza24iyd.onion", "wss://r.kojira.io",
|
||||
"wss://nostr-relay.h3z.jp", "wss://relay.yozora.world",
|
||||
"wss://nostr.0xtr.dev", "wss://purplepeg.es", "wss://nostr.mutinywallet.com",
|
||||
@@ -71,7 +77,17 @@ AVOID_OUTBOX_RELAY_LIST = ["wss://nos.lol", "wss://relay.primal.net",
|
||||
"wss://nostream-production-5895.up.railway.app",
|
||||
"ws://127.0.0.1:4869", "wss://sign.siamstr.com", "wss://relay.hash.stream",
|
||||
"wss://pablof7z.nostr1.com", "wss://nostr.beckmeyer.us", "wss://pow.hzrd149.com",
|
||||
"wss://relay.nostrss.re", "wss://relay.nostr.bg", "ws://bugman.mguy.net:4848"
|
||||
"wss://relay.nostrss.re", "wss://relay.nostr.bg", "ws://bugman.mguy.net:4848",
|
||||
"wss://nostr-2.zebedee.cloud", "wss://nostr.lorentz.is", "wss://zap.nostr1.com",
|
||||
"wss://onchain.pub", "wss://relay.nostr.info", "wss://relay.chicagoplebs.com",
|
||||
"wss://relay.current.fyi", "wss://relay.stemstr.app", "wss://nostr.zenon.info",
|
||||
"ws://localhost:7777", "wss://nostr.fmt.wiz.biz", "wss://nostrich.friendship.tw",
|
||||
"wss://public.relaying.io", "wss://relay.me3d.app", "wss://dreamofthe90s.nostr1.com",
|
||||
"wss://lnbits.eldamar.icu/nostrrelay/relay", "wss://nostr.olwe.link",
|
||||
"wss://nostr.cheeserobot.org",
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
]
|
||||
|
||||
@@ -318,7 +318,7 @@ async def send_job_status_reaction(original_event_id_hex, original_event_author_
|
||||
content = reaction
|
||||
|
||||
keys = Keys.parse(dvm_config.PRIVATE_KEY)
|
||||
reaction_event = EventBuilder(EventDefinitions.KIND_FEEDBACK, str(content), reply_tags).sign_with_keys(keys)
|
||||
reaction_event = EventBuilder(EventDefinitions.KIND_FEEDBACK, str(content)).tags(reply_tags).sign_with_keys(keys)
|
||||
await send_event_outbox(reaction_event, client=client, dvm_config=dvm_config)
|
||||
|
||||
if dvm_config.LOGLEVEL.value >= LogLevel.DEBUG.value:
|
||||
|
||||
@@ -21,9 +21,9 @@ async def create_reaction(keys, title, dtag):
|
||||
|
||||
keys = Keys.parse(keys)
|
||||
content = ""
|
||||
event = EventBuilder(Kind(30030), content, [d_tag, title_tag] + emoji_tags).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(30030), content).tags([d_tag, title_tag] + emoji_tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
# We add the relays we defined above and told our DVM we would want to receive events to.
|
||||
for relay in DVMConfig().RELAY_LIST:
|
||||
await client.add_relay(relay)
|
||||
@@ -42,9 +42,9 @@ async def delete_reaction(keys, eid: str, dtag: str):
|
||||
e_tag = Tag.parse(["e", eid])
|
||||
a_tag = Tag.parse(
|
||||
["a", "30030:" + keys.public_key().to_hex() + ":" + dtag])
|
||||
event = EventBuilder(Kind(5), "", [e_tag, a_tag]).sign_with_keys(keys)
|
||||
event = EventBuilder(Kind(5), "").tags([e_tag, a_tag]).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
# We add the relays we defined above and told our DVM we would want to receive events to.
|
||||
for relay in DVMConfig().RELAY_LIST:
|
||||
await client.add_relay(relay)
|
||||
|
||||
@@ -46,7 +46,7 @@ async def get_following(pks, max_time_request=10, newer_than_time=None, dvm_conf
|
||||
|
||||
# fetching events
|
||||
keys = Keys.parse(check_and_set_private_key("test_client"))
|
||||
cli = ClientBuilder().signer(keys).build()
|
||||
cli = ClientBuilder().signer(NostrSigner.keys(keys)).build()
|
||||
|
||||
for relay in dvm_config.SYNC_DB_RELAY_LIST:
|
||||
await cli.add_relay(relay)
|
||||
@@ -586,7 +586,7 @@ async def get_metadata(npub):
|
||||
except:
|
||||
return "", "", ""
|
||||
keys = Keys.parse(check_and_set_private_key("test_client"))
|
||||
client = ClientBuilder().signer(keys).build()
|
||||
client = ClientBuilder().signer(NostrSigner.keys(keys)).build()
|
||||
await client.add_relay("wss://relay.damus.io")
|
||||
await client.add_relay("wss://purplepag.es")
|
||||
await client.connect()
|
||||
|
||||
@@ -304,8 +304,7 @@ def zaprequest(lud16: str, amount: int, content, zapped_event, zapped_user, keys
|
||||
tags = [p_tag]
|
||||
if zapped_event is not None:
|
||||
tags.append(e_tag)
|
||||
zap_request = EventBuilder(Kind(9733), content,
|
||||
tags).sign_with_keys(keys).as_json()
|
||||
zap_request = EventBuilder(Kind(9733), content).tags(tags).sign_with_keys(keys).as_json()
|
||||
keys = Keys.parse(encryption_key)
|
||||
if zapped_event is not None:
|
||||
encrypted_content = enrypt_private_zap_message(zap_request, keys.secret_key(), zapped_event.author())
|
||||
@@ -316,8 +315,7 @@ def zaprequest(lud16: str, amount: int, content, zapped_event, zapped_user, keys
|
||||
tags.append(anon_tag)
|
||||
content = ""
|
||||
|
||||
zap_request = EventBuilder(Kind(9734), content,
|
||||
tags).sign_with_keys(keys).as_json()
|
||||
zap_request = EventBuilder(Kind(9734), content).tags(tags).sign_with_keys(keys).as_json()
|
||||
|
||||
response = requests.get(callback + "?amount=" + str(int(amount) * 1000) + "&nostr=" + urllib.parse.quote_plus(
|
||||
zap_request) + "&lnurl=" + encoded_lnurl)
|
||||
|
||||
4
setup.py
4
setup.py
@@ -1,6 +1,6 @@
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
VERSION = '0.9.11'
|
||||
VERSION = '0.9.12'
|
||||
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')
|
||||
|
||||
@@ -14,7 +14,7 @@ setup(
|
||||
long_description=LONG_DESCRIPTION,
|
||||
packages=find_packages(include=['nostr_dvm', 'nostr_dvm.*']),
|
||||
|
||||
install_requires=["nostr-sdk==0.36.0",
|
||||
install_requires=["nostr-sdk==0.37.0",
|
||||
"bech32==1.2.0",
|
||||
"pycryptodome==3.20.0",
|
||||
"yt-dlp==2024.11.04",
|
||||
|
||||
@@ -47,17 +47,17 @@ def playground(announce = False):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I'm briding DuckDuckAI'",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.KIND = kind
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {
|
||||
|
||||
@@ -35,10 +35,10 @@ def build_dalle(name, identifier):
|
||||
dvm_config.FIX_COST = int(((4.0 / (get_price_per_sat("USD") * 100)) + profit_in_sats))
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/22f2267ca9d4ee9d5e8a0c7818a9fa325bbbcdac5573a60a2d163e699bb69923.jpg",
|
||||
"picture": "https://image.nostr.build/22f2267ca9d4ee9d5e8a0c7818a9fa325bbbcdac5573a60a2d163e699bb69923.jpg",
|
||||
"about": "I create Images bridging OpenAI's DALL·E 3",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"size": {
|
||||
"required": False,
|
||||
@@ -48,7 +48,7 @@ def build_dalle(name, identifier):
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY,
|
||||
nip89info["image"])
|
||||
nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
aconfig = AdminConfig()
|
||||
aconfig.REBROADCAST_NIP89 = False # We add an optional AdminConfig for this one, and tell the dvm to rebroadcast its NIP89
|
||||
|
||||
@@ -32,7 +32,7 @@ async def do_some_work():
|
||||
f = Filter().author(keys.public_key()).limit(10)
|
||||
events = await database.query([f])
|
||||
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
print(event.as_json())
|
||||
|
||||
nostr_dvm_thread = Thread(target=reconcile_db)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import asyncio
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import threading
|
||||
from pathlib import Path
|
||||
|
||||
@@ -22,6 +23,7 @@ from nostr_dvm.tasks.content_discovery_latest_one_per_follower import Discoverla
|
||||
from nostr_dvm.tasks.content_discovery_update_db_only import DicoverContentDBUpdateScheduler
|
||||
from nostr_dvm.tasks.discovery_trending_notes_nostrband import TrendingNotesNostrBand
|
||||
from nostr_dvm.utils.admin_utils import AdminConfig
|
||||
from nostr_dvm.utils.database_utils import init_db
|
||||
from nostr_dvm.utils.dvmconfig import build_default_config, DVMConfig
|
||||
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
|
||||
@@ -36,7 +38,7 @@ update_profile = False
|
||||
global_update_rate = 180 # set this high on first sync so db can fully sync before another process trys to.
|
||||
use_logger = True
|
||||
log_level = LogLevel.ERROR
|
||||
max_sync_duration_in_h = 48
|
||||
max_sync_duration_in_h = 24
|
||||
|
||||
SYNC_DB_RELAY_LIST = ["wss://relay.damus.io",
|
||||
#"wss://relay.primal.net",
|
||||
@@ -75,12 +77,11 @@ def build_db_scheduler(name, identifier, admin_config, options, image, descripti
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -93,7 +94,7 @@ def build_db_scheduler(name, identifier, admin_config, options, image, descripti
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -118,12 +119,11 @@ def build_example_gallery(name, identifier, admin_config, options, image, cost=0
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show popular gallery entries",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -136,7 +136,7 @@ def build_example_gallery(name, identifier, admin_config, options, image, cost=0
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
@@ -156,16 +156,15 @@ def build_example_nostrband(name, identifier, admin_config, image, about, custom
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": about,
|
||||
"amount": "Free",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -196,12 +195,11 @@ def build_longform(name, identifier, admin_config, options, cost=0, update_rate=
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the latest longform notes.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -214,7 +212,7 @@ def build_longform(name, identifier, admin_config, options, cost=0, update_rate=
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -249,12 +247,11 @@ def build_wiki(name, identifier, admin_config, options, cost=0, update_rate=180,
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the latest wikifreedia entries.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -267,7 +264,7 @@ def build_wiki(name, identifier, admin_config, options, cost=0, update_rate=180,
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -298,12 +295,11 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -316,7 +312,7 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -341,12 +337,11 @@ def build_example_popular(name, identifier, admin_config, options, image, cost=0
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -359,7 +354,7 @@ def build_example_popular(name, identifier, admin_config, options, image, cost=0
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
@@ -385,12 +380,11 @@ def build_example_popular_followers(name, identifier, admin_config, options, ima
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular from people you follow",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -403,7 +397,7 @@ def build_example_popular_followers(name, identifier, admin_config, options, ima
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -421,7 +415,7 @@ def build_example_popular_non_followers(name, identifier, admin_config, options,
|
||||
dvm_config.UPDATE_DATABASE = update_db
|
||||
dvm_config.DATABASE = database
|
||||
# Activate these to use a subscription based model instead
|
||||
dvm_config.FIX_COST = 10
|
||||
dvm_config.FIX_COST = cost
|
||||
dvm_config.CUSTOM_PROCESSING_MESSAGE = processing_msg
|
||||
dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
||||
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
||||
@@ -435,14 +429,14 @@ def build_example_popular_non_followers(name, identifier, admin_config, options,
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular from people you do not follow",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"subscription": False,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
"max_results": {
|
||||
"required": False,
|
||||
@@ -453,14 +447,14 @@ def build_example_popular_non_followers(name, identifier, admin_config, options,
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
@@ -501,12 +495,11 @@ def build_example_top_zapped(name, identifier, admin_config, options, image, cos
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently zapped the most.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -519,7 +512,7 @@ def build_example_top_zapped(name, identifier, admin_config, options, image, cos
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -550,12 +543,11 @@ def build_example_mostr(name, identifier, admin_config, options, image, cost=0,
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes from Mostr.pub and Momostr.pink that are currently popular on Nostr",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -568,7 +560,7 @@ def build_example_mostr(name, identifier, admin_config, options, image, cost=0,
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
@@ -593,12 +585,11 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the single latest note of people you follow",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -611,31 +602,30 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
|
||||
|
||||
async def init_db(database):
|
||||
return NostrDatabase.lmdb(database)
|
||||
|
||||
|
||||
def playground():
|
||||
main_db = "db/nostr_recent_notes.db"
|
||||
DATABASE = asyncio.run(init_db(main_db))
|
||||
main_db_limit = 1024 # in mb
|
||||
|
||||
DATABASE = asyncio.run(init_db(main_db, wipe=True, limit=main_db_limit, print_filesize=True))
|
||||
# DB Scheduler, do not announce, just use it to update the DB for the other DVMs.
|
||||
admin_config_db_scheduler = AdminConfig()
|
||||
options_animal = {
|
||||
options_db = {
|
||||
"db_name": main_db,
|
||||
"db_since": max_sync_duration_in_h * 60 * 60, # 48h since gmt,
|
||||
"personalized": False,
|
||||
"max_db_size" : main_db_limit,
|
||||
"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,
|
||||
admin_config_db_scheduler, options_db,
|
||||
image=image,
|
||||
description=about,
|
||||
update_rate=global_update_rate,
|
||||
@@ -887,10 +877,10 @@ def playground():
|
||||
options_animal = {
|
||||
"search_list": ["catstr", "pawstr", "dogstr", "pugstr", " cat ", " cats ", "doggo", " deer ", " dog ", " dogs ",
|
||||
" fluffy ",
|
||||
"animal",
|
||||
" animal",
|
||||
" duck", " lion ", " lions ", " fox ", " foxes ", " koala ", " koalas ", "capybara", "squirrel",
|
||||
" monkey", "panda", "alpaca", " otter"],
|
||||
"avoid_list": ["porn", "smoke", "nsfw", "bitcoin", "bolt12", "bolt11", "github", "currency", "utxo",
|
||||
" monkey", " panda", "alpaca", " otter"],
|
||||
"avoid_list": ["porn", "broth", "smoke", "nsfw", "bitcoin", "bolt12", "bolt11", "github", "currency", "utxo",
|
||||
"encryption", "government", "airpod", "ipad", "iphone", "android", "warren",
|
||||
"moderna", "pfizer", " meat ", "pc mouse", "shotgun", "vagina", "rune", "testicle", "victim",
|
||||
"sexualize", "murder", "tax", "engagement", "hodlers", "hodl", "gdp", "global markets", "crypto",
|
||||
@@ -909,7 +899,7 @@ def playground():
|
||||
|
||||
"must_list": ["http"],
|
||||
"db_name": "db/nostr_recent_notes.db",
|
||||
"db_since": 12 * 60 * 60, # 48h since gmt,
|
||||
"db_since": 24 * 60 * 60, # 48h since gmt,
|
||||
"personalized": False,
|
||||
"logger": False}
|
||||
|
||||
@@ -1031,7 +1021,7 @@ def playground():
|
||||
"db_name": "db/nostr_recent_notes.db",
|
||||
"db_since": 2 * 60 * 60, # 2h since gmt,
|
||||
}
|
||||
cost = 0
|
||||
cost = 10
|
||||
image = "https://i.nostr.build/l11EczDmpZBaxlRm.jpg"
|
||||
|
||||
discovery_non_followers = build_example_popular_non_followers(
|
||||
|
||||
@@ -46,12 +46,11 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -79,7 +78,7 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
|
||||
@@ -37,12 +37,11 @@ def build_example_gallery(name, identifier, admin_config, options, image, cost=0
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show popular gallery entries",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -55,7 +54,7 @@ def build_example_gallery(name, identifier, admin_config, options, image, cost=0
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
|
||||
@@ -51,12 +51,11 @@ def build_example_mostr(name, identifier, admin_config, options, image, cost=0,
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show popular notes from Mostr.pub and Momostr.pink",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -69,7 +68,7 @@ def build_example_mostr(name, identifier, admin_config, options, image, cost=0,
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
|
||||
@@ -40,12 +40,11 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the single latest note of people you follow",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -58,7 +57,7 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
|
||||
@@ -45,12 +45,11 @@ def build_example_wot(name, identifier, admin_config, options, image, cost=0, up
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show people to follow from your WOT",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -63,7 +62,7 @@ def build_example_wot(name, identifier, admin_config, options, image, cost=0, up
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
return DiscoverPeopleMyWOT(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
admin_config=admin_config, options=options)
|
||||
|
||||
@@ -72,12 +72,11 @@ def build_db_scheduler(name, identifier, admin_config, options, image, descripti
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -90,7 +89,7 @@ def build_db_scheduler(name, identifier, admin_config, options, image, descripti
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -115,12 +114,11 @@ def build_example_gallery(name, identifier, admin_config, options, image, cost=0
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show popular gallery entries",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -133,7 +131,7 @@ def build_example_gallery(name, identifier, admin_config, options, image, cost=0
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
@@ -152,16 +150,15 @@ def build_example_nostrband(name, identifier, admin_config, image, about, custom
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": about,
|
||||
"amount": "Free",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -191,12 +188,11 @@ def build_longform(name, identifier, admin_config, options, cost=0, update_rate=
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the latest longform notes.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -209,7 +205,7 @@ def build_longform(name, identifier, admin_config, options, cost=0, update_rate=
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -243,12 +239,11 @@ def build_wiki(name, identifier, admin_config, options, cost=0, update_rate=180,
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the latest wikifreedia entries.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -261,7 +256,7 @@ def build_wiki(name, identifier, admin_config, options, cost=0, update_rate=180,
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -289,12 +284,11 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": description,
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -307,7 +301,7 @@ def build_example_topic(name, identifier, admin_config, options, image, descript
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -331,12 +325,11 @@ def build_example_popular(name, identifier, admin_config, options, image, cost=0
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -349,7 +342,7 @@ def build_example_popular(name, identifier, admin_config, options, image, cost=0
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
@@ -372,12 +365,11 @@ def build_example_popular_followers(name, identifier, admin_config, options, ima
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular from people you follow",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": True,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -390,7 +382,7 @@ def build_example_popular_followers(name, identifier, admin_config, options, ima
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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,
|
||||
@@ -421,12 +413,11 @@ def build_example_popular_non_followers(name, identifier, admin_config, options,
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently popular from people you do not follow",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"subscription": True,
|
||||
"personalized": False,
|
||||
"nip90Params": {
|
||||
@@ -439,14 +430,14 @@ def build_example_popular_non_followers(name, identifier, admin_config, options,
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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["image"])
|
||||
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["image"]
|
||||
nip88config.IMAGE = nip89info["picture"]
|
||||
nip88config.TITLE = name
|
||||
nip88config.AMOUNT_DAILY = 100
|
||||
nip88config.AMOUNT_MONTHLY = 2000
|
||||
@@ -484,12 +475,11 @@ def build_example_top_zapped(name, identifier, admin_config, options, image, cos
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes that are currently zapped the most.",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -502,7 +492,7 @@ def build_example_top_zapped(name, identifier, admin_config, options, image, cos
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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
|
||||
@@ -532,12 +522,11 @@ def build_example_mostr(name, identifier, admin_config, options, image, cost=0,
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show notes from Mostr.pub and Momostr.pink that are currently popular on Nostr",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -550,7 +539,7 @@ def build_example_mostr(name, identifier, admin_config, options, image, cost=0,
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
@@ -573,12 +562,11 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": image,
|
||||
"picture": image,
|
||||
"about": "I show the single latest note of people you follow",
|
||||
"lud16": dvm_config.LN_ADDRESS,
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"personalized": False,
|
||||
"amount": create_amount_tag(cost),
|
||||
"nip90Params": {
|
||||
@@ -591,7 +579,7 @@ def build_example_oneperfollow(name, identifier, admin_config, options, image, c
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
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)
|
||||
|
||||
@@ -17,7 +17,7 @@ async def main():
|
||||
}
|
||||
|
||||
keys = Keys.parse(check_and_set_private_key("test_client"))
|
||||
cli = Client(keys)
|
||||
cli = Client(NostrSigner.keys(keys))
|
||||
|
||||
await cli.add_relay(options["relay"])
|
||||
await cli.connect()
|
||||
|
||||
@@ -24,16 +24,16 @@ def playground(announce=False):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I'm an all purpose DVM'",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {
|
||||
|
||||
@@ -79,17 +79,17 @@ def playground(announce=False):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://i.nostr.build/I8fJo0n355cbNEbS.png", # "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://i.nostr.build/I8fJo0n355cbNEbS.png", # "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I create a personalized feed based on topics you were writing about recently",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.KIND = Kind(kind)
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {
|
||||
@@ -183,11 +183,11 @@ def playground(announce=False):
|
||||
|
||||
events = await database.query(filters)
|
||||
if dvm.dvm_config.LOGLEVEL.value >= LogLevel.DEBUG.value:
|
||||
print("[" + dvm.dvm_config.NIP89.NAME + "] Considering " + str(len(events)) + " Events")
|
||||
print("[" + dvm.dvm_config.NIP89.NAME + "] Considering " + str(len(events.to_vec())) + " Events")
|
||||
ns.finallist = {}
|
||||
#search_list = result.split(',')
|
||||
|
||||
for event in events:
|
||||
for event in events.to_vec():
|
||||
#if all(ele in event.content().lower() for ele in []):
|
||||
#if not any(ele in event.content().lower() for ele in []):
|
||||
filt = Filter().kinds(
|
||||
@@ -195,8 +195,8 @@ def playground(announce=False):
|
||||
definitions.EventDefinitions.KIND_REPOST,
|
||||
definitions.EventDefinitions.KIND_NOTE]).event(event.id()).since(since)
|
||||
reactions = await database.query([filt])
|
||||
if len(reactions) >= 1:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions)
|
||||
if len(reactions.to_vec()) >= 1:
|
||||
ns.finallist[event.id().to_hex()] = len(reactions.to_vec())
|
||||
|
||||
result_list = []
|
||||
finallist_sorted = sorted(ns.finallist.items(), key=lambda x: x[1], reverse=True)[:int(200)]
|
||||
|
||||
@@ -44,17 +44,17 @@ def playground(announce=False):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I'm briding DuckDuckAI'",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.KIND = kind
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {
|
||||
|
||||
@@ -49,17 +49,17 @@ def playground(announce=False):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I produce images with Flux-Schnell'",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.KIND = kind
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {
|
||||
|
||||
@@ -58,10 +58,10 @@ def build_sd35(name, identifier, announce):
|
||||
dvm_config.FIX_COST = int(((4.0 / (get_price_per_sat("USD") * 100)) + profit_in_sats))
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://i.nostr.build/NOXcCIPmOZrDTK35.jpg",
|
||||
"picture": "https://i.nostr.build/NOXcCIPmOZrDTK35.jpg",
|
||||
"about": "I draw images using Stable diffusion ultra",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"negative_prompt": {
|
||||
"required": False,
|
||||
@@ -75,7 +75,7 @@ def build_sd35(name, identifier, announce):
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY,
|
||||
nip89info["image"])
|
||||
nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
aconfig = AdminConfig()
|
||||
aconfig.REBROADCAST_NIP89 = announce # We add an optional AdminConfig for this one, and tell the dvm to rebroadcast its NIP89
|
||||
@@ -107,10 +107,10 @@ def build_dalle(name, identifier, announce):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/22f2267ca9d4ee9d5e8a0c7818a9fa325bbbcdac5573a60a2d163e699bb69923.jpg",
|
||||
"picture": "https://image.nostr.build/22f2267ca9d4ee9d5e8a0c7818a9fa325bbbcdac5573a60a2d163e699bb69923.jpg",
|
||||
"about": "I create Images bridging OpenAI's DALL·E 3",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"size": {
|
||||
"required": False,
|
||||
@@ -121,7 +121,7 @@ def build_dalle(name, identifier, announce):
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY,
|
||||
nip89info["image"])
|
||||
nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
# We add an optional AdminConfig for this one, and tell the dvm to rebroadcast its NIP89
|
||||
@@ -143,16 +143,16 @@ def build_svd(name, identifier, announce):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"picture": "https://image.nostr.build/c33ca6fc4cc038ca4adb46fdfdfda34951656f87ee364ef59095bae1495ce669.jpg",
|
||||
"about": "I use Stable Video Diffusion to create short videos",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY,
|
||||
nip89info["image"])
|
||||
nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
# We add an optional AdminConfig for this one, and tell the dvm to rebroadcast its NIP89
|
||||
return VideoGenerationReplicateSVD(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
@@ -170,10 +170,10 @@ def build_media_converter(name, identifier, announce):
|
||||
admin_config.REBROADCAST_NIP65_RELAY_LIST = announce
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://cdn.nostr.build/i/a177be1159da5aad8396a1188f686728d55647d3a7371549584daf2b5e50eec9.jpg",
|
||||
"picture": "https://cdn.nostr.build/i/a177be1159da5aad8396a1188f686728d55647d3a7371549584daf2b5e50eec9.jpg",
|
||||
"about": "I convert videos from urls to given output format.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"media_format": {
|
||||
"required": False,
|
||||
@@ -183,7 +183,7 @@ def build_media_converter(name, identifier, announce):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
return MediaConverter(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
admin_config=admin_config)
|
||||
@@ -204,10 +204,10 @@ def build_inactive_follows_finder(name, identifier, announce):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/50621bbf8082c478bc06a06684e1c443b5d37f1362ad56d679cab7328e0481db.jpg",
|
||||
"picture": "https://image.nostr.build/50621bbf8082c478bc06a06684e1c443b5d37f1362ad56d679cab7328e0481db.jpg",
|
||||
"about": "I discover npubs you follow, but that have been inactive on Nostr for the last 90 days",
|
||||
"action": "unfollow",
|
||||
"cashuAccepted": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"user": {
|
||||
"required": False,
|
||||
@@ -225,7 +225,7 @@ def build_inactive_follows_finder(name, identifier, announce):
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY,
|
||||
nip89info["image"])
|
||||
nip89info["picture"])
|
||||
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
return DiscoverInactiveFollows(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
@@ -244,10 +244,10 @@ def build_1984(name, identifier, announce):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/19872a2edd866258fa9eab137631efda89310d52b2c6ea8f99ef057325aa1c7b.jpg",
|
||||
"picture": "https://image.nostr.build/19872a2edd866258fa9eab137631efda89310d52b2c6ea8f99ef057325aa1c7b.jpg",
|
||||
"about": "I show users that have been reported by either your followers or your Web of Trust. Note: Anyone can report, so you might double check and decide for yourself who to mute. Considers spam, illegal and impersonation reports. Notice: This works with NIP51 mute lists. Not all clients support the new mute list format.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"action": "mute", # follow, unfollow, mute, unmute
|
||||
"nip90Params": {
|
||||
"since_days": {
|
||||
@@ -258,7 +258,7 @@ def build_1984(name, identifier, announce):
|
||||
}
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return DiscoverReports(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
@@ -279,10 +279,10 @@ def build_botfarms(name, identifier, announce):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/981b560820bc283c58de7989b7abc6664996b487a531d852e4ef7322586a2122.jpg",
|
||||
"picture": "https://image.nostr.build/981b560820bc283c58de7989b7abc6664996b487a531d852e4ef7322586a2122.jpg",
|
||||
"about": "I hunt down bot farms.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"action": "mute", # follow, unfollow, mute, unmute
|
||||
"nip90Params": {
|
||||
"max_results": {
|
||||
@@ -294,7 +294,7 @@ def build_botfarms(name, identifier, announce):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
options = {"relay": "wss://relay.damus.io"}
|
||||
@@ -317,10 +317,10 @@ def build_replicate(name, identifier, model, announce):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://i.nostr.build/qnoBIN4jSkfF8IHk.png",
|
||||
"picture": "https://i.nostr.build/qnoBIN4jSkfF8IHk.png",
|
||||
"about": "I use Replicate to run StableDiffusion XL",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"size": {
|
||||
"required": False,
|
||||
@@ -330,7 +330,7 @@ def build_replicate(name, identifier, model, announce):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
opts = {"model": model}
|
||||
@@ -354,10 +354,10 @@ def build_replicate_recraft(name, identifier, announce):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://i.nostr.build/jSbrXvYglXCzSeAc.jpg",
|
||||
"picture": "https://i.nostr.build/jSbrXvYglXCzSeAc.jpg",
|
||||
"about": "I use Replicate to run Recraft v3",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"size": {
|
||||
"required": False,
|
||||
@@ -367,7 +367,7 @@ def build_replicate_recraft(name, identifier, announce):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
|
||||
@@ -389,10 +389,10 @@ def build_replicate_fluxpro(name, identifier, announce):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://i.nostr.build/AQTujqzVmLxLmG16.jpg",
|
||||
"picture": "https://i.nostr.build/AQTujqzVmLxLmG16.jpg",
|
||||
"about": "I use Replicate to FluxPro 1.1.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": False,
|
||||
"nip90Params": {
|
||||
"size": {
|
||||
"required": False,
|
||||
@@ -402,7 +402,7 @@ def build_replicate_fluxpro(name, identifier, announce):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
|
||||
|
||||
@@ -33,10 +33,10 @@ def build_sd35(name, identifier):
|
||||
dvm_config.FIX_COST = int(((4.0 / (get_price_per_sat("USD") * 100)) + profit_in_sats))
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://i.nostr.build/NOXcCIPmOZrDTK35.jpg",
|
||||
"picture": "https://i.nostr.build/NOXcCIPmOZrDTK35.jpg",
|
||||
"about": "I draw images using Stable diffusion ultra",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"negative_prompt": {
|
||||
"required": False,
|
||||
@@ -50,7 +50,7 @@ def build_sd35(name, identifier):
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY,
|
||||
nip89info["image"])
|
||||
nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
aconfig = AdminConfig()
|
||||
aconfig.REBROADCAST_NIP89 = False # We add an optional AdminConfig for this one, and tell the dvm to rebroadcast its NIP89
|
||||
|
||||
@@ -52,6 +52,7 @@ def build_advanced_search(name, identifier):
|
||||
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
||||
|
||||
|
||||
|
||||
admin_config = AdminConfig()
|
||||
admin_config.REBROADCAST_NIP89 = rebroadcast_NIP89
|
||||
admin_config.REBROADCAST_NIP65_RELAY_LIST = rebroadcast_NIP65_Relay_List
|
||||
@@ -61,10 +62,10 @@ def build_advanced_search(name, identifier):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://nostr.band/android-chrome-192x192.png",
|
||||
"picture": "https://nostr.band/android-chrome-192x192.png",
|
||||
"about": "I search notes on nostr.band",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"users": {
|
||||
"required": False,
|
||||
@@ -90,7 +91,7 @@ def build_advanced_search(name, identifier):
|
||||
}
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY,
|
||||
nip89info["image"])
|
||||
nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
return AdvancedSearch(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
@@ -101,7 +102,7 @@ def build_advanced_search_wine(name, identifier):
|
||||
dvm_config.PRIVATE_KEY = check_and_set_private_key(identifier)
|
||||
npub = Keys.parse(dvm_config.PRIVATE_KEY).public_key().to_bech32()
|
||||
dvm_config.RELAY_LIST = RELAY_LIST
|
||||
invoice_key, admin_key, wallet_id, user_id, lnaddress = check_and_set_ln_bits_keys(identifier, npub)
|
||||
invoice_key, admin_key, wallet_id, lnaddress = check_and_set_ln_bits_keys(identifier, npub)
|
||||
dvm_config.LNBITS_INVOICE_KEY = invoice_key
|
||||
dvm_config.LNBITS_ADMIN_KEY = admin_key # The dvm might pay failed jobs back
|
||||
dvm_config.LNBITS_URL = os.getenv("LNBITS_HOST")
|
||||
@@ -117,10 +118,10 @@ def build_advanced_search_wine(name, identifier):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/d844d6a963724b9f9deb6b3326984fd95352343336718812424d5e99d93a6f2d.jpg",
|
||||
"picture": "https://image.nostr.build/d844d6a963724b9f9deb6b3326984fd95352343336718812424d5e99d93a6f2d.jpg",
|
||||
"about": "I search notes on nostr.wine using the nostr-wine API",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"users": {
|
||||
"required": False,
|
||||
@@ -147,7 +148,7 @@ def build_advanced_search_wine(name, identifier):
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY,
|
||||
nip89info["image"])
|
||||
nip89info["picture"])
|
||||
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
@@ -158,11 +159,11 @@ def build_advanced_search_wine(name, identifier):
|
||||
|
||||
def build_user_search(name, identifier):
|
||||
dvm_config = build_default_config(identifier)
|
||||
dvm_config.SYNC_DB_RELAY_LIST = ["wss://relay.damus.io"]
|
||||
dvm_config.SYNC_DB_RELAY_LIST = SYNC_DB_RELAY_LIST
|
||||
dvm_config.AVOID_OUTBOX_RELAY_LIST = AVOID_OUTBOX_RELAY_LIST
|
||||
dvm_config.RELAY_LIST = RELAY_LIST
|
||||
dvm_config.WOT_FILTERING = True
|
||||
npub = Keys.parse(dvm_config.PRIVATE_KEY).public_key().to_bech32()
|
||||
dvm_config.RELAY_LIST = RELAY_LIST
|
||||
invoice_key, admin_key, wallet_id, lnaddress = check_and_set_ln_bits_keys(identifier, npub)
|
||||
admin_config = AdminConfig()
|
||||
admin_config.REBROADCAST_NIP89 = rebroadcast_NIP89
|
||||
@@ -173,10 +174,10 @@ def build_user_search(name, identifier):
|
||||
# Add NIP89
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/bd0181a3089181f1d92a5da1ef85cffbe37ba80fbcc695b9d85648dc2fa92583.jpg",
|
||||
"picture": "https://image.nostr.build/bd0181a3089181f1d92a5da1ef85cffbe37ba80fbcc695b9d85648dc2fa92583.jpg",
|
||||
"about": "I search users based on their profile info.",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {
|
||||
"max_results": {
|
||||
"required": False,
|
||||
@@ -187,13 +188,11 @@ def build_user_search(name, identifier):
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
options = {"relay": "wss://profiles.nostr1.com"}
|
||||
|
||||
|
||||
return SearchUser(name=name, dvm_config=dvm_config, nip89config=nip89config,
|
||||
admin_config=admin_config, options=options)
|
||||
admin_config=admin_config)
|
||||
|
||||
|
||||
|
||||
@@ -208,8 +207,8 @@ def playground():
|
||||
advanced_search_wine = build_advanced_search_wine("Nostr.wine Search", "discovery_content_searchwine")
|
||||
advanced_search_wine.run()
|
||||
|
||||
#profile_search = build_user_search("Profile Searcher", "profile_search")
|
||||
#profile_search.run()
|
||||
profile_search = build_user_search("Profile Searcher", "profile_search")
|
||||
profile_search.run()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ async def test():
|
||||
pk = keys.public_key()
|
||||
print(f"Bot public key: {pk.to_bech32()}")
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
await client.add_relay("wss://relay.damus.io")
|
||||
await client.add_relay("wss://nostr.mom")
|
||||
@@ -50,7 +50,7 @@ async def test():
|
||||
print("Decrypting NIP59 event")
|
||||
try:
|
||||
# Extract rumor
|
||||
unwrapped_gift = UnwrappedGift.from_gift_wrap(keys, event)
|
||||
unwrapped_gift = UnwrappedGift.from_gift_wrap(NostrSigner(keys), event)
|
||||
sender = unwrapped_gift.sender()
|
||||
rumor: UnsignedEvent = unwrapped_gift.rumor()
|
||||
|
||||
|
||||
@@ -22,15 +22,15 @@ def playground(announce=False):
|
||||
|
||||
nip89info = {
|
||||
"name": name,
|
||||
"image": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"picture": "https://image.nostr.build/28da676a19841dcfa7dcf7124be6816842d14b84f6046462d2a3f1268fe58d03.png",
|
||||
"about": "I summarize Text",
|
||||
"encryptionSupported": True,
|
||||
"cashuAccepted": True,
|
||||
"supportsEncryption": True,
|
||||
"acceptsNutZaps": dvm_config.ENABLE_NUTZAP,
|
||||
"nip90Params": {}
|
||||
}
|
||||
|
||||
nip89config = NIP89Config()
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["image"])
|
||||
nip89config.DTAG = check_and_set_d_tag(identifier, name, dvm_config.PRIVATE_KEY, nip89info["picture"])
|
||||
nip89config.CONTENT = json.dumps(nip89info)
|
||||
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ from nostr_dvm.utils.print_utils import bcolors
|
||||
|
||||
import dotenv
|
||||
from nostr_sdk import Keys, Client, Tag, EventBuilder, Filter, HandleNotification, Timestamp, nip04_decrypt, \
|
||||
nip04_encrypt, NostrSigner, Event, Kind, RelayOptions
|
||||
nip44_encrypt, Nip44Version, NostrSigner, Event, Kind, RelayOptions
|
||||
|
||||
from nostr_dvm.utils.dvmconfig import DVMConfig
|
||||
from nostr_dvm.utils.nostr_utils import send_event, check_and_set_private_key
|
||||
@@ -27,13 +27,13 @@ async def nostr_client_test_translation(input, kind, lang, sats, satsmax):
|
||||
relaysTag = Tag.parse(['relays', "wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"])
|
||||
alttag = Tag.parse(["alt", "This is a NIP90 DVM AI task to translate a given Input"])
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_TRANSLATE_TEXT, str("Translate the given input."),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_TRANSLATE_TEXT, str("Translate the given input.")).tags(
|
||||
[iTag, paramTag1, bidTag, relaysTag, alttag]).sign_with_keys(keys)
|
||||
|
||||
relay_list = ["wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"]
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
@@ -48,13 +48,13 @@ async def nostr_client_test_search_profile(input):
|
||||
|
||||
iTag = Tag.parse(["i", input, "text"])
|
||||
alttag = Tag.parse(["alt", "This is a NIP90 DVM AI task to translate a given Input"])
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_USER_SEARCH, str("Search for user"),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_USER_SEARCH, str("Search for user")).tags(
|
||||
[iTag, alttag]).sign_with_keys(keys)
|
||||
|
||||
relay_list = ["wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"]
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
@@ -74,10 +74,10 @@ async def nostr_client_test_image(prompt):
|
||||
bidTag = Tag.parse(['bid', str(1000 * 1000), str(1000 * 1000)])
|
||||
relaysTag = Tag.parse(['relays', "wss://relay.primal.net", "wss://nostr.oxtr.dev"])
|
||||
alttag = Tag.parse(["alt", "This is a NIP90 DVM AI task to generate an Image from a given Input"])
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_GENERATE_IMAGE, str("Generate an Image."),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_GENERATE_IMAGE, str("Generate an Image.")).tags(
|
||||
[iTag, outTag, paramTag1, bidTag, relaysTag, alttag]).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in DVMConfig().RELAY_LIST:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -102,10 +102,10 @@ async def nostr_client_test_censor_filter(users):
|
||||
iTag = Tag.parse(["i", user, "text"])
|
||||
tags.append(iTag)
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_PEOPLE_DISCOVERY, str("Give me bad actors"),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_PEOPLE_DISCOVERY, str("Give me bad actors")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -127,10 +127,10 @@ async def nostr_client_test_inactive_filter(user):
|
||||
|
||||
tags = [relaysTag, alttag, paramTag, paramTag2]
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_PEOPLE_DISCOVERY, str("Give me inactive users"),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_PEOPLE_DISCOVERY, str("Give me inactive users")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.add_relay("wss://nostr.band")
|
||||
@@ -150,13 +150,13 @@ async def nostr_client_test_tts(prompt):
|
||||
relaysTag = Tag.parse(['relays', "wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org",
|
||||
"wss://nostr-pub.wellorder.net"])
|
||||
alttag = Tag.parse(["alt", "This is a NIP90 DVM AI task to generate TTSt"])
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_TEXT_TO_SPEECH, str("Generate an Audio File."),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_TEXT_TO_SPEECH, str("Generate an Audio File.")).tags(
|
||||
[iTag, paramTag1, bidTag, relaysTag, alttag]).sign_with_keys(keys)
|
||||
|
||||
relay_list = ["wss://relay.damus.io", "wss://blastr.f7z.xyz", "wss://relayable.org" "wss://dvms.f7z.io",
|
||||
]
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -178,10 +178,10 @@ async def nostr_client_test_discovery(user, ptag):
|
||||
|
||||
tags = [relaysTag, alttag, paramTag, pTag]
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_CONTENT_DISCOVERY, str("Give me content"),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_CONTENT_DISCOVERY, str("Give me content")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
|
||||
@@ -215,10 +215,10 @@ async def nostr_client_custom_discovery(user, ptag):
|
||||
|
||||
tags = [relaysTag, alttag, paramTag, pTag]# paramTagSearch, paramTagMust, paramTagAvoid]
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_CONTENT_DISCOVERY, str("Give me content"),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_CONTENT_DISCOVERY, str("Give me content")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
|
||||
@@ -241,10 +241,10 @@ async def nostr_client_generic_test(ptag):
|
||||
|
||||
tags = [relaysTag, alttag, pTag]
|
||||
|
||||
event = EventBuilder(Kind(5050), str("Give me content"),
|
||||
event = EventBuilder(Kind(5050), str("Give me content")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -267,10 +267,10 @@ async def nostr_client_duckduck_test(ptag, query):
|
||||
|
||||
tags = [relaysTag, alttag, pTag, iTag]
|
||||
|
||||
event = EventBuilder(Kind(5050), str("Give me content"),
|
||||
event = EventBuilder(Kind(5050), str("Give me content")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -291,10 +291,10 @@ async def nostr_client_flux_schnell(ptag, query):
|
||||
|
||||
tags = [relaysTag, alttag, pTag, iTag]
|
||||
|
||||
event = EventBuilder(Kind(5100), str("Give me image"),
|
||||
event = EventBuilder(Kind(5100), str("Give me image")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
ropts = RelayOptions().ping(False)
|
||||
@@ -319,10 +319,10 @@ async def nostr_client_test_discovery_user(user, ptag):
|
||||
|
||||
tags = [relaysTag, alttag, paramTag, pTag]
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_PEOPLE_DISCOVERY, str("Give me people"),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_PEOPLE_DISCOVERY, str("Give me people")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -344,10 +344,10 @@ async def nostr_client_test_discovery_gallery(user, ptag):
|
||||
|
||||
tags = [relaysTag, alttag, paramTag, pTag]
|
||||
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_VISUAL_DISCOVERY, str("Give me visuals"),
|
||||
event = EventBuilder(EventDefinitions.KIND_NIP90_VISUAL_DISCOVERY, str("Give me visuals")).tags(
|
||||
tags).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -377,14 +377,14 @@ async def nostr_client_test_image_private(prompt, cashutoken):
|
||||
encrypted_params_string = json.dumps([i_tag.as_vec(), outTag.as_vec(), paramTag1.as_vec(), bid_tag.as_vec(),
|
||||
relays_tag.as_vec(), alt_tag.as_vec(), cashu_tag.as_vec()])
|
||||
|
||||
encrypted_params = nip04_encrypt(keys.secret_key(), receiver_keys.public_key(),
|
||||
encrypted_params_string)
|
||||
encrypted_params = nip44_encrypt(keys.secret_key(), receiver_keys.public_key(),
|
||||
encrypted_params_string, Nip44Version.V2)
|
||||
|
||||
encrypted_tag = Tag.parse(['encrypted'])
|
||||
nip90request = EventBuilder(EventDefinitions.KIND_NIP90_GENERATE_IMAGE, encrypted_params,
|
||||
nip90request = EventBuilder(EventDefinitions.KIND_NIP90_GENERATE_IMAGE, encrypted_params).tags(
|
||||
[pTag, encrypted_tag]).sign_with_keys(keys)
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
await client.connect()
|
||||
@@ -398,7 +398,7 @@ async def nostr_client():
|
||||
sk = keys.secret_key()
|
||||
pk = keys.public_key()
|
||||
print(f"Nostr Client public key: {pk.to_bech32()}, Hex: {pk.to_hex()} ")
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
dvmconfig = DVMConfig()
|
||||
for relay in dvmconfig.RELAY_LIST:
|
||||
|
||||
@@ -17,7 +17,7 @@ from nostr_dvm.utils.nostr_utils import check_and_set_private_key
|
||||
async def test():
|
||||
relay_list = dvmconfig.DVMConfig.RELAY_LIST
|
||||
keys = Keys.parse(check_and_set_private_key("test_client"))
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
@@ -71,7 +71,7 @@ async def test_gallery():
|
||||
relay_list = dvmconfig.DVMConfig.RELAY_LIST
|
||||
keys = Keys.parse(check_and_set_private_key("test_client"))
|
||||
|
||||
client = Client(keys)
|
||||
client = Client(NostrSigner.keys(keys))
|
||||
|
||||
for relay in relay_list:
|
||||
await client.add_relay(relay)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user