add filter and ping

This commit is contained in:
callebtc
2023-02-01 15:10:20 +01:00
parent 1d6ee33aa4
commit 36768d3236
3 changed files with 37 additions and 30 deletions

20
main.py
View File

@@ -3,6 +3,8 @@ from nostr.event import Event
from nostr.key import PublicKey from nostr.key import PublicKey
import asyncio import asyncio
import threading import threading
import time
import datetime
async def dm(): async def dm():
@@ -20,11 +22,20 @@ async def dm():
client = NostrClient(privatekey_hex=pk) client = NostrClient(privatekey_hex=pk)
await asyncio.sleep(1) await asyncio.sleep(1)
filters = {
"since": int(
time.mktime(
(datetime.datetime.now() - datetime.timedelta(hours=1)).timetuple()
)
)
}
t = threading.Thread( t = threading.Thread(
target=client.get_dm, target=client.get_dm,
args=( args=(
client.public_key, client.public_key,
callback, callback,
filters,
), ),
) )
t.start() t.start()
@@ -64,11 +75,20 @@ async def post():
print(f"Subscribing to posts by {to_pubk_hex}") print(f"Subscribing to posts by {to_pubk_hex}")
to_pubk = PublicKey(bytes.fromhex(to_pubk_hex)) to_pubk = PublicKey(bytes.fromhex(to_pubk_hex))
filters = {
"since": int(
time.mktime(
(datetime.datetime.now() - datetime.timedelta(hours=1)).timetuple()
)
)
}
t = threading.Thread( t = threading.Thread(
target=sender_client.get_post, target=sender_client.get_post,
args=( args=(
to_pubk, to_pubk,
callback, callback,
filters,
), ),
) )
t.start() t.start()

View File

@@ -23,6 +23,7 @@ class NostrClient:
relays = [ relays = [
"wss://nostr-pub.wellorder.net", "wss://nostr-pub.wellorder.net",
"wss://nostr.zebedee.cloud", "wss://nostr.zebedee.cloud",
"nostr.mom",
# "wss://no.str.cr", # "wss://no.str.cr",
] # ["wss://nostr.oxtr.dev"] # ["wss://relay.nostr.info"] "wss://nostr-pub.wellorder.net" "ws://91.237.88.218:2700", "wss://nostrrr.bublina.eu.org", ""wss://nostr-relay.freeberty.net"", , "wss://nostr.oxtr.dev", "wss://relay.nostr.info", "wss://nostr-pub.wellorder.net" , "wss://relayer.fiatjaf.com", "wss://nodestr.fmt.wiz.biz/", "wss://no.str.cr" ] # ["wss://nostr.oxtr.dev"] # ["wss://relay.nostr.info"] "wss://nostr-pub.wellorder.net" "ws://91.237.88.218:2700", "wss://nostrrr.bublina.eu.org", ""wss://nostr-relay.freeberty.net"", , "wss://nostr.oxtr.dev", "wss://relay.nostr.info", "wss://nostr-pub.wellorder.net" , "wss://relayer.fiatjaf.com", "wss://nodestr.fmt.wiz.biz/", "wss://no.str.cr"
relay_manager = RelayManager() relay_manager = RelayManager()
@@ -49,23 +50,20 @@ class NostrClient:
pk = bytes.fromhex(privatekey_hex) if privatekey_hex else None pk = bytes.fromhex(privatekey_hex) if privatekey_hex else None
self.private_key = PrivateKey(pk) self.private_key = PrivateKey(pk)
self.public_key = self.private_key.public_key self.public_key = self.private_key.public_key
# print(
# f"Nostr private key: {self.private_key.hex()} ({self.private_key.bech32()})"
# )
# print(f"Nostr public key: {self.public_key.hex()} ({self.public_key.bech32()})")
def post(self, message: str): def post(self, message: str):
event = Event(self.public_key.hex(), message, kind=EventKind.TEXT_NOTE) event = Event(self.public_key.hex(), message, kind=EventKind.TEXT_NOTE)
event.sign(self.private_key.hex()) event.sign(self.private_key.hex())
message = json.dumps([ClientMessageType.EVENT, event.to_json_object()]) message = json.dumps([ClientMessageType.EVENT, event.to_json_object()])
# print("Publishing message:")
# print(message)
self.relay_manager.publish_message(message) self.relay_manager.publish_message(message)
def get_post(self, sender_publickey: PublicKey = None, callback_func=None): def get_post(
self, sender_publickey: PublicKey = None, callback_func=None, filter_kwargs={}
):
filter = Filter( filter = Filter(
authors=[sender_publickey.hex()] if sender_publickey else None, authors=[sender_publickey.hex()] if sender_publickey else None,
kinds=[EventKind.TEXT_NOTE], kinds=[EventKind.TEXT_NOTE],
**filter_kwargs,
) )
filters = Filters([filter]) filters = Filters([filter])
subscription_id = os.urandom(4).hex() subscription_id = os.urandom(4).hex()
@@ -87,14 +85,9 @@ class NostrClient:
time.sleep(0.1) time.sleep(0.1)
def dm(self, message: str, to_pubkey: PublicKey): def dm(self, message: str, to_pubkey: PublicKey):
shared_secret = self.private_key.compute_shared_secret(to_pubkey.hex()) shared_secret = self.private_key.compute_shared_secret(to_pubkey.hex())
# print("shared secret: ", shared_secret.hex())
# print("plain text:", message)
aes = cbc.AESCipher(key=shared_secret) aes = cbc.AESCipher(key=shared_secret)
iv, enc_text = aes.encrypt(message) iv, enc_text = aes.encrypt(message)
# print("encrypt iv: ", iv)
content = f"{base64.b64encode(enc_text).decode('utf-8')}?iv={base64.b64encode(iv).decode('utf-8')}" content = f"{base64.b64encode(enc_text).decode('utf-8')}?iv={base64.b64encode(iv).decode('utf-8')}"
event = Event( event = Event(
@@ -105,29 +98,23 @@ class NostrClient:
) )
event.sign(self.private_key.hex()) event.sign(self.private_key.hex())
event_message = json.dumps([ClientMessageType.EVENT, event.to_json_object()]) event_message = json.dumps([ClientMessageType.EVENT, event.to_json_object()])
# print("DM message:")
# print(event_message)
time.sleep(1) time.sleep(1)
self.relay_manager.publish_message(event_message) self.relay_manager.publish_message(event_message)
def get_dm(self, sender_publickey: PublicKey, callback_func=None): def get_dm(self, sender_publickey: PublicKey, callback_func=None, filter_kwargs={}):
filters = Filters( filter = Filter(
[ kinds=[EventKind.ENCRYPTED_DIRECT_MESSAGE],
Filter( tags={"#p": [sender_publickey.hex()]},
kinds=[EventKind.ENCRYPTED_DIRECT_MESSAGE], **filter_kwargs,
tags={"#p": [sender_publickey.hex()]},
)
]
) )
filters = Filters([filter])
subscription_id = os.urandom(4).hex() subscription_id = os.urandom(4).hex()
self.relay_manager.add_subscription(subscription_id, filters) self.relay_manager.add_subscription(subscription_id, filters)
request = [ClientMessageType.REQUEST, subscription_id] request = [ClientMessageType.REQUEST, subscription_id]
request.extend(filters.to_json_array()) request.extend(filters.to_json_array())
message = json.dumps(request) message = json.dumps(request)
# print("Subscribing to events:")
# print(message)
self.relay_manager.publish_message(message) self.relay_manager.publish_message(message)
while True: while True:
@@ -138,21 +125,15 @@ class NostrClient:
shared_secret = self.private_key.compute_shared_secret( shared_secret = self.private_key.compute_shared_secret(
event_msg.event.public_key event_msg.event.public_key
) )
# print("shared secret: ", shared_secret.hex())
# print("plain text:", message)
aes = cbc.AESCipher(key=shared_secret) aes = cbc.AESCipher(key=shared_secret)
enc_text_b64, iv_b64 = event_msg.event.content.split("?iv=") enc_text_b64, iv_b64 = event_msg.event.content.split("?iv=")
iv = base64.decodebytes(iv_b64.encode("utf-8")) iv = base64.decodebytes(iv_b64.encode("utf-8"))
enc_text = base64.decodebytes(enc_text_b64.encode("utf-8")) enc_text = base64.decodebytes(enc_text_b64.encode("utf-8"))
# print("decrypt iv: ", iv)
dec_text = aes.decrypt(iv, enc_text) dec_text = aes.decrypt(iv, enc_text)
# print(f"From {event_msg.event.public_key[:5]}...: {dec_text}")
if callback_func: if callback_func:
callback_func(event_msg.event, dec_text) callback_func(event_msg.event, dec_text)
except: except:
pass pass
# else:
# print(f"\nFrom {event_msg.event.public_key[:5]}...: {event_msg.event.content}")
break break
time.sleep(0.1) time.sleep(0.1)

View File

@@ -65,6 +65,12 @@ class Relay:
time.sleep(1) time.sleep(1)
self.connect(self.ssl_options) self.connect(self.ssl_options)
def get_pint(self):
if self.connected:
return int(self.ws.last_ping_tm - self.ws.last_pong_tm)
else:
return 0
def publish(self, message: str): def publish(self, message: str):
if self.connected: if self.connected:
self.num_sent_events += 1 self.num_sent_events += 1