From 75e6b615144ed76fb2a7ef8daf523ff66d3f95d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nu=C5=A1a=20Puk=C5=A1i=C4=8D?= Date: Sun, 8 Jun 2025 16:58:16 +0200 Subject: [PATCH] Demo page for events, tags and mentions --- src/Controller/EventController.php | 17 +++-- src/Service/NostrClient.php | 3 +- templates/event/index.html.twig | 101 ++++++++++++++--------------- 3 files changed, 62 insertions(+), 59 deletions(-) diff --git a/src/Controller/EventController.php b/src/Controller/EventController.php index e692b02..495c212 100644 --- a/src/Controller/EventController.php +++ b/src/Controller/EventController.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Controller; use App\Service\NostrClient; +use App\Service\NostrLinkParser; use App\Service\RedisCacheService; use Exception; use nostriphant\NIP19\Bech32; @@ -22,7 +23,7 @@ class EventController extends AbstractController * @throws Exception */ #[Route('/e/{nevent}', name: 'nevent', requirements: ['nevent' => '^nevent1.*'])] - public function index($nevent, NostrClient $nostrClient, RedisCacheService $redisCacheService, LoggerInterface $logger): Response + public function index($nevent, NostrClient $nostrClient, RedisCacheService $redisCacheService, NostrLinkParser $nostrLinkParser, LoggerInterface $logger): Response { $logger->info('Accessing event page', ['nevent' => $nevent]); @@ -76,6 +77,13 @@ class EventController extends AbstractController throw new NotFoundHttpException('Event not found'); } + // Parse event content for Nostr links + $nostrLinks = []; + if (isset($event->content)) { + $nostrLinks = $nostrLinkParser->parseLinks($event->content); + $logger->info('Parsed Nostr links from content', ['count' => count($nostrLinks)]); + } + // If author is included in the event, get metadata $authorMetadata = null; if (isset($event->pubkey)) { @@ -83,10 +91,12 @@ class EventController extends AbstractController $npub = $key->convertPublicKeyToBech32($event->pubkey); $authorMetadata = $redisCacheService->getMetadata($npub); } - // Render template with the event data + + // Render template with the event data and extracted Nostr links return $this->render('event/index.html.twig', [ 'event' => $event, - 'author' => $authorMetadata + 'author' => $authorMetadata, + 'nostrLinks' => $nostrLinks ]); } catch (Exception $e) { @@ -95,4 +105,3 @@ class EventController extends AbstractController } } } - diff --git a/src/Service/NostrClient.php b/src/Service/NostrClient.php index 82c09fc..dfa825a 100644 --- a/src/Service/NostrClient.php +++ b/src/Service/NostrClient.php @@ -267,7 +267,7 @@ class NostrClient */ public function getEventById(string $eventId, array $relays = []): ?object { - $this->logger->info('Getting event by ID', ['event_id' => $eventId]); + $this->logger->info('Getting event by ID', ['event_id' => $eventId, 'relays' => $relays]); // Use provided relays or default if empty $relaySet = empty($relays) ? $this->defaultRelaySet : $this->createRelaySet($relays); @@ -281,6 +281,7 @@ class NostrClient // Process the response $events = $this->processResponse($request->send(), function($event) { + $this->logger->debug('Received event', ['event' => $event]); return $event; }); diff --git a/templates/event/index.html.twig b/templates/event/index.html.twig index b17a590..e6f7cd3 100644 --- a/templates/event/index.html.twig +++ b/templates/event/index.html.twig @@ -27,43 +27,38 @@ + {% if nostrLinks is defined and nostrLinks|length > 0 %} + + {% endif %} + @@ -78,7 +73,6 @@ padding: 1.5rem; background: #fff; border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); } .event-header { @@ -90,19 +84,6 @@ padding-bottom: 1rem; } - .author-info { - display: flex; - align-items: center; - gap: 1rem; - } - - .author-picture { - width: 50px; - height: 50px; - border-radius: 50%; - object-fit: cover; - } - .event-content { font-size: 1.1rem; line-height: 1.6; @@ -110,6 +91,29 @@ white-space: pre-wrap; } + .nostr-links { + margin: 1.5rem 0; + padding: 1rem; + background-color: #f9f9f9; + border-radius: 4px; + } + + .link-list { + list-style: none; + padding-left: 0; + } + + .link-list li { + margin-bottom: 0.5rem; + word-break: break-all; + } + + .link-type { + color: #6c757d; + font-size: 0.9rem; + margin-left: 0.5rem; + } + .event-footer { display: flex; justify-content: space-between; @@ -118,7 +122,7 @@ border-top: 1px solid #eee; } - .event-tags, .event-references { + .event-tags { flex: 1; } @@ -130,16 +134,5 @@ .event-tags li, .event-references li { margin-bottom: 0.5rem; } - - .event-id { - margin-top: 1.5rem; - color: #888; - text-align: right; - } - - .nip05 { - color: #0066cc; - font-size: 0.9rem; - } {% endblock %}