From f5c873ec4d7807cac2d3109bc558dcf54b269ef3 Mon Sep 17 00:00:00 2001 From: Vlad Stan Date: Thu, 9 Feb 2023 12:18:54 +0200 Subject: [PATCH] feat: add support for `NIP22` --- client_manager.py | 19 +++- models.py | 23 +++- .../relay-details/relay-details.html | 102 ++++++++++++++++++ .../components/relay-details/relay-details.js | 17 +++ 4 files changed, 158 insertions(+), 3 deletions(-) diff --git a/client_manager.py b/client_manager.py index 1d40d22..a1add5d 100644 --- a/client_manager.py +++ b/client_manager.py @@ -1,6 +1,6 @@ import json import time -from typing import Any, Awaitable, Callable, List, Optional +from typing import Any, Awaitable, Callable, List, Optional, Tuple from fastapi import WebSocket from loguru import logger @@ -167,6 +167,12 @@ class NostrClientConnection: await self._send_msg(resp_nip20) return None + in_range, message = self._created_at_in_range(e.created_at) + if not in_range: + resp_nip20 += [False, message] + await self._send_msg(resp_nip20) + return None + try: if e.is_replaceable_event(): await delete_events( @@ -186,6 +192,7 @@ class NostrClientConnection: resp_nip20 += [event != None, message] await self._send_msg(resp_nip20) + @property def client_config(self) -> ClientConfig: @@ -241,3 +248,13 @@ class NostrClientConnection: self._event_count_per_timestamp = 0 return self._event_count_per_timestamp > self.client_config.max_events_per_second + + def _created_at_in_range(self, created_at: int) -> Tuple[bool, str]: + current_time = round(time.time()) + if self.client_config.created_at_in_past != 0: + if created_at < (current_time - self.client_config.created_at_in_past): + return False, "created_at is too much into the past" + if self.client_config.created_at_in_future != 0: + if created_at > (current_time + self.client_config.created_at_in_future): + return False, "created_at is too much into the future" + return True, "" \ No newline at end of file diff --git a/models.py b/models.py index b9da88d..71c70d0 100644 --- a/models.py +++ b/models.py @@ -12,6 +12,17 @@ class ClientConfig(BaseModel): max_client_filters = Field(0, alias="maxClientFilters") limit_per_filter = Field(1000, alias="limitPerFilter") max_events_per_second = Field(0, alias="maxEventsPerSecond") + + created_at_days_past = Field(0, alias="createdAtDaysPast") + created_at_hours_past = Field(0, alias="createdAtHoursPast") + created_at_minutes_past = Field(0, alias="createdAtMinutesPast") + created_at_seconds_past = Field(0, alias="createdAtSecondsPast") + + created_at_days_future = Field(0, alias="createdAtDaysFuture") + created_at_hours_future = Field(0, alias="createdAtHoursFuture") + created_at_minutes_future = Field(0, alias="createdAtMinutesFuture") + created_at_seconds_future = Field(0, alias="createdAtSecondsFuture") + allowed_public_keys = Field([], alias="allowedPublicKeys") blocked_public_keys = Field([], alias="blockedPublicKeys") @@ -23,7 +34,15 @@ class ClientConfig(BaseModel): return True # todo: check payment return p in self.allowed_public_keys - + + @property + def created_at_in_past(self) -> int: + return self.created_at_days_past * 86400 + self.created_at_hours_past * 3600 + self.created_at_minutes_past * 60 + self.created_at_seconds_past + + @property + def created_at_in_future(self) -> int: + return self.created_at_days_future * 86400 + self.created_at_hours_future * 3600 + self.created_at_minutes_future * 60 + self.created_at_seconds_future + class Config: allow_population_by_field_name = True class RelayConfig(ClientConfig): @@ -55,7 +74,7 @@ class NostrRelay(BaseModel): def info(cls,) -> dict: return { "contact": "https://t.me/lnbits", - "supported_nips": [1, 9, 11, 15, 20], + "supported_nips": [1, 9, 11, 15, 20, 22], "software": "LNbits", "version": "", } diff --git a/static/components/relay-details/relay-details.html b/static/components/relay-details/relay-details.html index 0b09ec4..e025652 100644 --- a/static/components/relay-details/relay-details.html +++ b/static/components/relay-details/relay-details.html @@ -156,6 +156,108 @@
+
+
Created At in Past:
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + NIP 22: Lower limit within which a relay will consider an + event's created_at to be acceptable. + +
+
+
+
Created At in Future:
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + NIP 22: Upper limit within which a relay will consider an + event's created_at to be acceptable. + +
+
Limit per filter:
diff --git a/static/components/relay-details/relay-details.js b/static/components/relay-details/relay-details.js index 2eaf8fe..a76d28a 100644 --- a/static/components/relay-details/relay-details.js +++ b/static/components/relay-details/relay-details.js @@ -21,6 +21,23 @@ async function relayDetails(path) { } }, + computed: { + hours: function () { + const y = [] + for (let i = 0; i <= 24; i++) { + y.push(i) + } + return y + }, + range60: function () { + const y = [] + for (let i = 0; i <= 60; i++) { + y.push(i) + } + return y + } + }, + methods: { satBtc(val, showUnit = true) { return satOrBtc(val, showUnit, this.satsDenominated)