diff --git a/crud.py b/crud.py index 82fb056..1def952 100644 --- a/crud.py +++ b/crud.py @@ -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 diff --git a/relay/client_connection.py b/relay/client_connection.py index 7c0fdde..afc67c2 100644 --- a/relay/client_connection.py +++ b/relay/client_connection.py @@ -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: @@ -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: @@ -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: @@ -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) @@ -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 [ [ @@ -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): diff --git a/relay/filter.py b/relay/filter.py index 835b893..4bd4db0 100644 --- a/relay/filter.py +++ b/relay/filter.py @@ -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)