diff --git a/client_manager.py b/client_manager.py index 634e3c1..211318c 100644 --- a/client_manager.py +++ b/client_manager.py @@ -129,13 +129,15 @@ class NostrClientConnection: self.relay_id, NostrFilter(kinds=[e.kind], authors=[e.pubkey]) ) await create_event(self.relay_id, e) - await self.broadcast_event(self, e) + if self.broadcast_event: + await self.broadcast_event(self, e) if e.is_delete_event(): await self.__handle_delete_event(e) resp_nip20 += [True, ""] except ValueError: resp_nip20 += [False, "invalid: wrong event `id` or `sig`"] - except Exception: + except Exception as ex: + logger.debug(ex) event = await get_event(self.relay_id, e.id) # todo: handle NIP20 in detail resp_nip20 += [event != None, f"error: failed to create event"] diff --git a/crud.py b/crud.py index 28c986d..da78eab 100644 --- a/crud.py +++ b/crud.py @@ -117,14 +117,14 @@ async def get_event(relay_id: str, id: str) -> Optional[NostrEvent]: async def mark_events_deleted(relay_id: str, filter: NostrFilter): if filter.is_empty(): return None - _, where, values = build_where_clause(relay_id, filter) + _, where, values = filter.to_sql_components(relay_id) await db.execute(f"""UPDATE nostrrelay.events SET deleted=true WHERE {" AND ".join(where)}""", tuple(values)) async def delete_events(relay_id: str, filter: NostrFilter): if filter.is_empty(): return None - _, where, values = build_where_clause(relay_id, filter) + _, where, values = filter.to_sql_components(relay_id) query = f"""DELETE from nostrrelay.events WHERE {" AND ".join(where)}""" await db.execute(query, tuple(values)) @@ -168,7 +168,7 @@ async def get_event_tags( def build_select_events_query(relay_id:str, filter:NostrFilter): - inner_joins, where, values = build_where_clause(relay_id, filter) + inner_joins, where, values = filter.to_sql_components(relay_id) query = f""" SELECT id, pubkey, created_at, kind, content, sig @@ -183,46 +183,3 @@ def build_select_events_query(relay_id:str, filter:NostrFilter): query += f" LIMIT {filter.limit}" return values, query - -def build_where_clause(relay_id:str, filter:NostrFilter): - inner_joins = [] - where = ["deleted=false", "nostrrelay.events.relay_id = ?"] - values: List[Any] = [relay_id] - - if len(filter.e): - values += filter.e - e_s = ",".join(["?"] * len(filter.e)) - inner_joins.append("INNER JOIN nostrrelay.event_tags e_tags ON nostrrelay.events.id = e_tags.event_id") - where.append(f" (e_tags.value in ({e_s}) AND e_tags.name = 'e')") - - if len(filter.p): - values += filter.p - p_s = ",".join(["?"] * len(filter.p)) - inner_joins.append("INNER JOIN nostrrelay.event_tags p_tags ON nostrrelay.events.id = p_tags.event_id") - where.append(f" p_tags.value in ({p_s}) AND p_tags.name = 'p'") - - if len(filter.ids) != 0: - ids = ",".join(["?"] * len(filter.ids)) - where.append(f"id IN ({ids})") - values += filter.ids - - if len(filter.authors) != 0: - authors = ",".join(["?"] * len(filter.authors)) - where.append(f"pubkey IN ({authors})") - values += filter.authors - - if len(filter.kinds) != 0: - kinds = ",".join(["?"] * len(filter.kinds)) - where.append(f"kind IN ({kinds})") - values += filter.kinds - - if filter.since: - where.append("created_at >= ?") - values += [filter.since] - - if filter.until: - where.append("created_at < ?") - values += [filter.until] - - - return inner_joins, where, values \ No newline at end of file diff --git a/models.py b/models.py index bb69edc..ad13718 100644 --- a/models.py +++ b/models.py @@ -2,7 +2,7 @@ import hashlib import json from enum import Enum from sqlite3 import Row -from typing import List, Optional +from typing import Any, List, Optional, Tuple from pydantic import BaseModel, Field from secp256k1 import PublicKey @@ -48,9 +48,6 @@ class NostrRelay(BaseModel): } - - - class NostrEventType(str, Enum): EVENT = "EVENT" REQ = "REQ" @@ -169,3 +166,46 @@ class NostrFilter(BaseModel): and (not self.since) and (not self.until) ) + + def to_sql_components(self, relay_id: str) -> Tuple[List[str], List[str], List[Any]]: + inner_joins: List[str] = [] + where = ["deleted=false", "nostrrelay.events.relay_id = ?"] + values: List[Any] = [relay_id] + + if len(self.e): + values += self.e + e_s = ",".join(["?"] * len(self.e)) + inner_joins.append("INNER JOIN nostrrelay.event_tags e_tags ON nostrrelay.events.id = e_tags.event_id") + where.append(f" (e_tags.value in ({e_s}) AND e_tags.name = 'e')") + + if len(self.p): + values += self.p + p_s = ",".join(["?"] * len(self.p)) + inner_joins.append("INNER JOIN nostrrelay.event_tags p_tags ON nostrrelay.events.id = p_tags.event_id") + where.append(f" p_tags.value in ({p_s}) AND p_tags.name = 'p'") + + if len(self.ids) != 0: + ids = ",".join(["?"] * len(self.ids)) + where.append(f"id IN ({ids})") + values += self.ids + + if len(self.authors) != 0: + authors = ",".join(["?"] * len(self.authors)) + where.append(f"pubkey IN ({authors})") + values += self.authors + + if len(self.kinds) != 0: + kinds = ",".join(["?"] * len(self.kinds)) + where.append(f"kind IN ({kinds})") + values += self.kinds + + if self.since: + where.append("created_at >= ?") + values += [self.since] + + if self.until: + where.append("created_at < ?") + values += [self.until] + + + return inner_joins, where, values