packages feed

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