11import _thread
22import requests
33import json
4+ import ssl
5+ import time
6+
7+ from nostr .relay_manager import RelayManager
8+ from nostr .message_type import ClientMessageType
9+ from nostr .filter import Filter , Filters
10+ from nostr .event import EncryptedDirectMessage
11+ from nostr .key import PrivateKey
412
513import mpos .apps
614import mpos .time
@@ -20,6 +28,10 @@ def __str__(self):
2028 elif isinstance (self , NWCWallet ):
2129 return "NWCWallet"
2230
31+ def start_refresh_balance (self ):
32+ _thread .stack_size (mpos .apps .good_stack_size ())
33+ _thread .start_new_thread (self .fetch_balance_thread , ())
34+
2335
2436class LNBitsWallet (Wallet ):
2537
@@ -28,11 +40,11 @@ def __init__(self, lnbits_url, lnbits_readkey):
2840 self .lnbits_url = lnbits_url
2941 self .lnbits_readkey = lnbits_readkey
3042
31- def fetch_balance_thread (self , lnbits_url , lnbits_readkey ):
43+ def fetch_balance_thread (self ):
3244 print ("fetch_balance_thread" )
33- walleturl = lnbits_url + "/api/v1/wallet"
45+ walleturl = self . lnbits_url + "/api/v1/wallet"
3446 headers = {
35- "X-Api-Key" : lnbits_readkey ,
47+ "X-Api-Key" : self . lnbits_readkey ,
3648 }
3749 try :
3850 response = requests .get (walleturl , timeout = 10 , headers = headers )
@@ -52,27 +64,59 @@ def fetch_balance_thread(self, lnbits_url, lnbits_readkey):
5264 except Exception as e :
5365 print (f"Could not parse reponse text '{ response_text } ' as JSON: { e } " )
5466
55- def start_refresh_balance (self ):
56- _thread .stack_size (mpos .apps .good_stack_size ())
57- _thread .start_new_thread (self .fetch_balance_thread , (self .lnbits_url , self .lnbits_readkey ))
5867
5968class NWCWallet (Wallet ):
6069
6170 def __init__ (self , nwc_url ):
6271 super ().__init__ ()
6372 self .nwc_url = nwc_url
64- nwc_data = parse_nwc_url (nwc_url )
65- self .relay = nwc_data ['relay' ]
66- self .wallet_pubkey = nwc_data ['pubkey' ]
67- self .secret = nwc_data ['secret' ]
68- self .lud16 = nwc_data ['lud16' ]
69- print (f"DEBUG: Parsed NWC data - Relay: { relay } , Pubkey: { wallet_pubkey } , Secret: { secret } , lud16: { lud16 } " )
70- # TODO: open connection to relay, subscribe to updates
73+ self .relay , self .wallet_pubkey , self .secret , self .lud16 = self .parse_nwc_url (nwc_url )
74+ self .private_key = PrivateKey (bytes .fromhex (self .secret ))
75+ self .relay_manager = RelayManager ()
76+ self .relay_manager .add_relay (self .relay )
77+ print (f"DEBUG: Opening relay connections" )
78+ self .relay_manager .open_connections ({"cert_reqs" : ssl .CERT_NONE })
79+ # Set up subscription to receive response
80+ self .subscription_id = "nwc_balance_" + str (round (time .time ()))
81+ #print(f"DEBUG: Setting up subscription with ID: {self.subscription_id}")
82+ self .filters = Filters ([Filter (
83+ kinds = [23195 ], # NWC replies
84+ authors = [self .wallet_pubkey ],
85+ pubkey_refs = [self .private_key .public_key .hex ()]
86+ )])
87+ #print(f"DEBUG: Subscription filters: {filters.to_json_array()}")
88+ self .relay_manager .add_subscription (self .subscription_id , self .filters )
89+ time .sleep (5 )
90+
7191
7292 def start_refresh_balance (self ) :
73- # TODO: make sure connected to relay (otherwise connect) and fetch balance
74- pass
93+ # TODO: make sure connected to relay (otherwise connect)
7594
95+ # Create get_balance request
96+ balance_request = {
97+ "method" : "get_balance" ,
98+ "params" : {}
99+ }
100+ print (f"DEBUG: Created balance request: { balance_request } " )
101+
102+ print (f"DEBUG: Creating encrypted DM to wallet pubkey: { self .wallet_pubkey } " )
103+ dm = EncryptedDirectMessage (
104+ recipient_pubkey = self .wallet_pubkey ,
105+ cleartext_content = json .dumps (balance_request )
106+ )
107+
108+ print (f"DEBUG: Signing DM { json .dumps (dm )} with private key" )
109+ self .private_key .sign_event (dm ) # sign also does encryption if it's a encrypted dm
110+ print (f"DEBUG: DM created with ID: { dm .id } " )
111+
112+ # Publish request
113+ print (f"DEBUG: Publishing subscription request" )
114+ request_message = [ClientMessageType .REQUEST , self .subscription_id ]
115+ request_message .extend (self .filters .to_json_array ())
116+ self .relay_manager .publish_message (json .dumps (request_message ))
117+ print (f"DEBUG: Publishing encrypted DM" )
118+ self .relay_manager .publish_event (dm )
119+
76120 def parse_nwc_url (self , nwc_url ):
77121 """Parse Nostr Wallet Connect URL to extract pubkey, relay, secret, and lud16."""
78122 print (f"DEBUG: Starting to parse NWC URL: { nwc_url } " )
@@ -125,14 +169,9 @@ def parse_nwc_url(self, nwc_url):
125169 # Validate secret (should be 64 hex characters)
126170 if len (secret ) != 64 or not all (c in '0123456789abcdef' for c in secret ):
127171 raise ValueError ("Invalid NWC URL: secret must be 64 hex characters" )
128-
129- return {
130- 'relay' : relay ,
131- 'pubkey' : pubkey ,
132- 'secret' : secret ,
133- 'lud16' : lud16
134- }
172+
173+ print (f"DEBUG: Parsed NWC data - Relay: { relay } , Pubkey: { pubkey } , Secret: { secret } , lud16: { lud16 } " )
174+ return relay , pubkey , secret , lud16
135175 except Exception as e :
136176 print (f"DEBUG: Error parsing NWC URL: { e } " )
137- sys .exit (1 )
138177
0 commit comments