From 36768d323659c112e8544255a950fea5715c936f Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Wed, 1 Feb 2023 15:10:20 +0100 Subject: [PATCH] add filter and ping --- main.py | 20 ++++++++++++++++++++ nostr/client/client.py | 41 +++++++++++------------------------------ nostr/relay.py | 6 ++++++ 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/main.py b/main.py index 4b6b75f..56885bb 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,8 @@ from nostr.event import Event from nostr.key import PublicKey import asyncio import threading +import time +import datetime async def dm(): @@ -20,11 +22,20 @@ async def dm(): client = NostrClient(privatekey_hex=pk) await asyncio.sleep(1) + filters = { + "since": int( + time.mktime( + (datetime.datetime.now() - datetime.timedelta(hours=1)).timetuple() + ) + ) + } + t = threading.Thread( target=client.get_dm, args=( client.public_key, callback, + filters, ), ) t.start() @@ -64,11 +75,20 @@ async def post(): print(f"Subscribing to posts by {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( target=sender_client.get_post, args=( to_pubk, callback, + filters, ), ) t.start() diff --git a/nostr/client/client.py b/nostr/client/client.py index e27bc04..874c97c 100644 --- a/nostr/client/client.py +++ b/nostr/client/client.py @@ -23,6 +23,7 @@ class NostrClient: relays = [ "wss://nostr-pub.wellorder.net", "wss://nostr.zebedee.cloud", + "nostr.mom", # "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() @@ -49,23 +50,20 @@ class NostrClient: pk = bytes.fromhex(privatekey_hex) if privatekey_hex else None self.private_key = PrivateKey(pk) 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): event = Event(self.public_key.hex(), message, kind=EventKind.TEXT_NOTE) event.sign(self.private_key.hex()) message = json.dumps([ClientMessageType.EVENT, event.to_json_object()]) - # print("Publishing message:") - # print(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( authors=[sender_publickey.hex()] if sender_publickey else None, kinds=[EventKind.TEXT_NOTE], + **filter_kwargs, ) filters = Filters([filter]) subscription_id = os.urandom(4).hex() @@ -87,14 +85,9 @@ class NostrClient: time.sleep(0.1) def dm(self, message: str, to_pubkey: PublicKey): - 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) 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')}" event = Event( @@ -105,29 +98,23 @@ class NostrClient: ) event.sign(self.private_key.hex()) event_message = json.dumps([ClientMessageType.EVENT, event.to_json_object()]) - # print("DM message:") - # print(event_message) time.sleep(1) self.relay_manager.publish_message(event_message) - def get_dm(self, sender_publickey: PublicKey, callback_func=None): - filters = Filters( - [ - Filter( - kinds=[EventKind.ENCRYPTED_DIRECT_MESSAGE], - tags={"#p": [sender_publickey.hex()]}, - ) - ] + def get_dm(self, sender_publickey: PublicKey, callback_func=None, filter_kwargs={}): + filter = Filter( + kinds=[EventKind.ENCRYPTED_DIRECT_MESSAGE], + tags={"#p": [sender_publickey.hex()]}, + **filter_kwargs, ) + filters = Filters([filter]) subscription_id = os.urandom(4).hex() self.relay_manager.add_subscription(subscription_id, filters) request = [ClientMessageType.REQUEST, subscription_id] request.extend(filters.to_json_array()) message = json.dumps(request) - # print("Subscribing to events:") - # print(message) self.relay_manager.publish_message(message) while True: @@ -138,21 +125,15 @@ class NostrClient: shared_secret = self.private_key.compute_shared_secret( event_msg.event.public_key ) - # print("shared secret: ", shared_secret.hex()) - # print("plain text:", message) aes = cbc.AESCipher(key=shared_secret) enc_text_b64, iv_b64 = event_msg.event.content.split("?iv=") iv = base64.decodebytes(iv_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) - # print(f"From {event_msg.event.public_key[:5]}...: {dec_text}") if callback_func: callback_func(event_msg.event, dec_text) except: pass - # else: - # print(f"\nFrom {event_msg.event.public_key[:5]}...: {event_msg.event.content}") break time.sleep(0.1) diff --git a/nostr/relay.py b/nostr/relay.py index 12be651..8265ac6 100644 --- a/nostr/relay.py +++ b/nostr/relay.py @@ -65,6 +65,12 @@ class Relay: time.sleep(1) 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): if self.connected: self.num_sent_events += 1