Skip to content

Commit d8cbb2d

Browse files
Nostr: decrypt DMs
1 parent 4f67ece commit d8cbb2d

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

internal_filesystem/apps/com.micropythonos.nostr/assets/nostr_client.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,33 @@ def format_tags(tags):
5858

5959
class NostrEvent:
6060
"""Simple wrapper for a Nostr event with rich details"""
61-
def __init__(self, event_obj):
61+
def __init__(self, event_obj, private_key=None):
6262
self.event = event_obj
6363
self.created_at = event_obj.created_at
6464
self.content = event_obj.content
6565
self.public_key = event_obj.public_key
6666
self.kind = event_obj.kind
6767
self.tags = event_obj.tags if hasattr(event_obj, 'tags') else []
68+
self.private_key = private_key
69+
self.decrypted_content = None
70+
71+
# Try to decrypt if this is an encrypted DM
72+
if self.kind == 4 and self.private_key:
73+
self._try_decrypt()
74+
75+
def _try_decrypt(self):
76+
"""Attempt to decrypt encrypted DM content"""
77+
try:
78+
if self.kind == 4 and self.content:
79+
decrypted = self.private_key.decrypt_message(
80+
self.content,
81+
self.public_key
82+
)
83+
self.decrypted_content = decrypted
84+
print(f"DEBUG: Successfully decrypted DM: {decrypted}")
85+
except Exception as e:
86+
print(f"DEBUG: Failed to decrypt DM: {e}")
87+
# Leave decrypted_content as None if decryption fails
6888

6989
def get_kind_name(self):
7090
"""Get human-readable name for this event's kind"""
@@ -78,16 +98,23 @@ def get_formatted_tags(self):
7898
"""Get formatted tags for this event"""
7999
return format_tags(self.tags)
80100

101+
def get_display_content(self):
102+
"""Get the content to display (decrypted if available, otherwise raw)"""
103+
if self.decrypted_content is not None:
104+
return self.decrypted_content
105+
return self.content
106+
81107
def __str__(self):
82108
"""Return formatted event details"""
83109
kind_name = self.get_kind_name()
84110
timestamp = self.get_formatted_timestamp()
85111
tags_str = self.get_formatted_tags()
112+
display_content = self.get_display_content()
86113

87114
# Build the formatted event string
88115
result = f"[{kind_name}] {timestamp}\n"
89-
if self.content:
90-
result += f"{self.content}"
116+
if display_content:
117+
result += f"{display_content}"
91118
if tags_str:
92119
result += f"\n{tags_str}"
93120

@@ -197,8 +224,8 @@ async def async_event_manager_task(self):
197224
event_created_at = event_msg.event.created_at
198225
print(f"Received at {time.localtime()} a message with timestamp {event_created_at} after {time.ticks_ms()-start_time}ms")
199226
try:
200-
# Create NostrEvent wrapper
201-
nostr_event = NostrEvent(event_msg.event)
227+
# Create NostrEvent wrapper with private key for decryption
228+
nostr_event = NostrEvent(event_msg.event, self.private_key)
202229
print(f"DEBUG: Event content: {nostr_event.content}")
203230

204231
# Add to event list

0 commit comments

Comments
 (0)