nostr-1.3.0.0: lib/Nostr/Nip65.hs
{-# LANGUAGE OverloadedStrings #-}
{-|
Module : Nostr.Nip65
Description : NIP-65 Relay List Metadata
Copyright : (c) Emre YILMAZ, 2026
License : MIT
Maintainer : z@emre.xyz
This module provides support for NIP-65, which allows users to advertise
which relays they use to read and write events.
-}
module Nostr.Nip65
( -- * Constants
kindRelayListMetadata
-- * Types
, RelayMarker(..)
, RelayListEntry(..)
-- * Helpers
, mkRelayListTag
, parseRelayListTag
) where
import Data.Text (Text)
import qualified Data.Text as T
import Nostr.Event (Tag, Kind)
-- | Event kind for Relay List Metadata (10002)
kindRelayListMetadata :: Kind
kindRelayListMetadata = 10002
-- | Determines if a relay is used for reading, writing, or both.
data RelayMarker
= ReadMarker
| WriteMarker
| BothMarker
deriving (Show, Eq)
-- | Represents a single relay entry in the list
data RelayListEntry = RelayListEntry
{ rleUrl :: Text
, rleMarker :: RelayMarker
} deriving (Show, Eq)
-- | Create a tag for a relay list entry
mkRelayListTag :: RelayListEntry -> Tag
mkRelayListTag (RelayListEntry url BothMarker) = ["r", url]
mkRelayListTag (RelayListEntry url ReadMarker) = ["r", url, "read"]
mkRelayListTag (RelayListEntry url WriteMarker) = ["r", url, "write"]
-- | Parse a tag into a RelayListEntry if possible
parseRelayListTag :: Tag -> Maybe RelayListEntry
parseRelayListTag ["r", url] = Just $ RelayListEntry url BothMarker
parseRelayListTag ["r", url, "read"] = Just $ RelayListEntry url ReadMarker
parseRelayListTag ["r", url, "write"] = Just $ RelayListEntry url WriteMarker
parseRelayListTag _ = Nothing