Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crud.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ async def delete_events(relay_id: str, nostr_filter: NostrFilter):
else:
# Simple DELETE without JOINs
query = f"DELETE FROM events WHERE {' AND '.join(where)}"

await db.execute(query, values)
# todo: delete tags

Expand Down
27 changes: 19 additions & 8 deletions relay/client_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ async def notify_event(self, event: NostrEvent) -> bool:
resp = event.serialize_response(nostr_filter.subscription_id)
await self._send_msg(resp)
return True
else:
logger.info(
f"[NOSTRRELAY CLIENT] ❌ Filter didn't match for event {event.id}"
)
return False

def _is_direct_message_for_other(self, event: NostrEvent) -> bool:
Expand All @@ -97,6 +101,10 @@ def _is_direct_message_for_other(self, event: NostrEvent) -> bool:
async def _broadcast_event(self, e: NostrEvent):
if self.broadcast_event:
await self.broadcast_event(self, e)
else:
logger.warning(
f"[NOSTRRELAY CLIENT] ❌ No broadcast_event callback available for event {e.id}"
)

async def _handle_message(self, data: List) -> List:
if len(data) < 2:
Expand All @@ -119,9 +127,13 @@ async def _handle_message(self, data: List) -> List:
return []
subscription_id = data[1]
# Handle multiple filters in REQ message
# First remove existing filters for this subscription_id
self._remove_filter(subscription_id)
responses = []
for filter_data in data[2:]:
response = await self._handle_request(subscription_id, NostrFilter.parse_obj(filter_data))
response = await self._handle_request(
subscription_id, NostrFilter.parse_obj(filter_data)
)
responses.extend(response)
return responses
if message_type == NostrEventType.CLOSE:
Expand Down Expand Up @@ -172,12 +184,12 @@ async def _handle_event(self, e: NostrEvent):

if d_tag_value:
deletion_filter = NostrFilter(
kinds=[e.kind],
kinds=[e.kind],
authors=[e.pubkey],
**{"#d": [d_tag_value]},
until=e.created_at
until=e.created_at,
)

await delete_events(self.relay_id, deletion_filter)
if not e.is_ephemeral_event:
await create_event(e)
Expand Down Expand Up @@ -237,8 +249,7 @@ async def _handle_request(
return [["NOTICE", f"This is a paid relay: '{self.relay_id}'"]]

nostr_filter.subscription_id = subscription_id
self._remove_filter(subscription_id)
if self._can_add_filter():
if not self._can_add_filter():
max_filters = self.config.max_client_filters
return [
[
Expand Down Expand Up @@ -269,8 +280,8 @@ async def _handle_auth(self):

def _can_add_filter(self) -> bool:
return (
self.config.max_client_filters != 0
and len(self.filters) >= self.config.max_client_filters
self.config.max_client_filters == 0
or len(self.filters) < self.config.max_client_filters
)

def _auth_challenge_expired(self):
Expand Down
2 changes: 1 addition & 1 deletion relay/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def to_sql_components(self, relay_id: str) -> tuple[list[str], list[str], dict]:
d_s = ",".join([f"'{d}'" for d in self.d])
d_join = "INNER JOIN nostrrelay.event_tags d_tags ON nostrrelay.events.id = d_tags.event_id"
d_where = f" d_tags.value in ({d_s}) AND d_tags.name = 'd'"

inner_joins.append(d_join)
where.append(d_where)

Expand Down
Loading