Compare commits
4 commits
c4efb87b70
...
5e95b309fe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e95b309fe | ||
|
|
8547864254 | ||
|
|
dcc3204735 | ||
|
|
8bfd792548 |
2 changed files with 61 additions and 6 deletions
|
|
@ -24,6 +24,8 @@
|
||||||
- [x] **NIP-04**: Encrypted Direct Message
|
- [x] **NIP-04**: Encrypted Direct Message
|
||||||
- if `AUTH` enabled: send only to the intended target
|
- if `AUTH` enabled: send only to the intended target
|
||||||
- [x] **NIP-09**: Event Deletion
|
- [x] **NIP-09**: Event Deletion
|
||||||
|
- [x] 'e' tags: Delete regular events by event ID
|
||||||
|
- [x] 'a' tags: Delete addressable events by address (kind:pubkey:d-identifier)
|
||||||
- [x] **NIP-11**: Relay Information Document
|
- [x] **NIP-11**: Relay Information Document
|
||||||
- > **Note**: the endpoint is NOT on the root level of the domain. It also includes a path (eg https://lnbits.link/nostrrelay/)
|
- > **Note**: the endpoint is NOT on the root level of the domain. It also includes a path (eg https://lnbits.link/nostrrelay/)
|
||||||
- [ ] **NIP-12**: Generic Tag Queries
|
- [ ] **NIP-12**: Generic Tag Queries
|
||||||
|
|
|
||||||
|
|
@ -208,12 +208,65 @@ class NostrClientConnection:
|
||||||
await self.websocket.send_text(json.dumps(data))
|
await self.websocket.send_text(json.dumps(data))
|
||||||
|
|
||||||
async def _handle_delete_event(self, event: NostrEvent):
|
async def _handle_delete_event(self, event: NostrEvent):
|
||||||
# NIP 09
|
# NIP 09 - Handle both regular events (e tags) and parameterized replaceable events (a tags)
|
||||||
nostr_filter = NostrFilter(authors=[event.pubkey])
|
|
||||||
nostr_filter.ids = [t[1] for t in event.tags if t[0] == "e"]
|
# Get event IDs from 'e' tags (for regular events)
|
||||||
events_to_delete = await get_events(self.relay_id, nostr_filter, False)
|
event_ids = [t[1] for t in event.tags if t[0] == "e"]
|
||||||
ids = [e.id for e in events_to_delete if not e.is_delete_event]
|
|
||||||
await mark_events_deleted(self.relay_id, NostrFilter(ids=ids))
|
# Get event addresses from 'a' tags (for parameterized replaceable events)
|
||||||
|
event_addresses = [t[1] for t in event.tags if t[0] == "a"]
|
||||||
|
|
||||||
|
ids_to_delete = []
|
||||||
|
|
||||||
|
# Handle regular event deletions (e tags)
|
||||||
|
if event_ids:
|
||||||
|
nostr_filter = NostrFilter(authors=[event.pubkey], ids=event_ids)
|
||||||
|
events_to_delete = await get_events(self.relay_id, nostr_filter, False)
|
||||||
|
ids_to_delete.extend(
|
||||||
|
[e.id for e in events_to_delete if not e.is_delete_event]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Handle parameterized replaceable event deletions (a tags)
|
||||||
|
if event_addresses:
|
||||||
|
for addr in event_addresses:
|
||||||
|
# Parse address format: kind:pubkey:d-tag
|
||||||
|
parts = addr.split(":")
|
||||||
|
if len(parts) == 3:
|
||||||
|
kind_str, addr_pubkey, d_tag = parts
|
||||||
|
try:
|
||||||
|
kind = int(kind_str)
|
||||||
|
# Only delete if the address pubkey matches the deletion event author
|
||||||
|
if addr_pubkey == event.pubkey:
|
||||||
|
# NOTE: Use "#d" alias, not "d" directly (Pydantic Field alias)
|
||||||
|
nostr_filter = NostrFilter(
|
||||||
|
authors=[addr_pubkey],
|
||||||
|
kinds=[kind],
|
||||||
|
**{"#d": [d_tag]}, # Use alias to set d field
|
||||||
|
)
|
||||||
|
events_to_delete = await get_events(
|
||||||
|
self.relay_id, nostr_filter, False
|
||||||
|
)
|
||||||
|
ids_to_delete.extend(
|
||||||
|
[
|
||||||
|
e.id
|
||||||
|
for e in events_to_delete
|
||||||
|
if not e.is_delete_event
|
||||||
|
]
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
logger.warning(
|
||||||
|
f"Deletion request pubkey mismatch: {addr_pubkey} != {event.pubkey}"
|
||||||
|
)
|
||||||
|
except ValueError:
|
||||||
|
logger.warning(f"Invalid kind in address: {addr}")
|
||||||
|
else:
|
||||||
|
logger.warning(
|
||||||
|
f"Invalid address format (expected kind:pubkey:d-tag): {addr}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Only mark events as deleted if we found specific IDs
|
||||||
|
if ids_to_delete:
|
||||||
|
await mark_events_deleted(self.relay_id, NostrFilter(ids=ids_to_delete))
|
||||||
|
|
||||||
async def _handle_request(
|
async def _handle_request(
|
||||||
self, subscription_id: str, nostr_filter: NostrFilter
|
self, subscription_id: str, nostr_filter: NostrFilter
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue