lib/nostr/event/types/encrypted_direct_message_event.ex

defmodule Nostr.Event.Types.EncryptedDirectMessageEvent do
  @moduledoc """
  Encrypted direct message event management, including event creation and parsing
  """

  require Logger

  defstruct [:decrypted, :decryption_error, event: %Nostr.Event{}]

  alias Nostr.Event
  alias Nostr.Event.Types.EncryptedDirectMessageEvent
  alias Nostr.Keys.PublicKey

  @type t :: %EncryptedDirectMessageEvent{}

  @kind 4

  @spec create(String.t() | nil, K256.Schnorr.verifying_key(), <<_::256>>) ::
          EncryptedDirectMessageEvent.t()
  def create(content, local_pubkey, remote_pubkey) do
    hex_pubkey = PublicKey.to_hex(remote_pubkey)

    tags = [["p", hex_pubkey]]

    event =
      %{Event.create(content, local_pubkey) | kind: @kind, tags: tags}
      |> Event.add_id()

    %EncryptedDirectMessageEvent{event: event}
  end

  def parse(%{"content" => content} = body) do
    event = %{Event.parse(body) | content: content}

    case event.kind do
      @kind ->
        {:ok, %EncryptedDirectMessageEvent{event: event}}

      kind ->
        {:error,
         "Tried to parse a encrypted direct message event with kind #{kind} instead of #{@kind}"}
    end
  end
end