Skip to content

Latest commit

 

History

History
76 lines (58 loc) · 3.69 KB

25.md

File metadata and controls

76 lines (58 loc) · 3.69 KB

NIP-25

リアクション

draft optional

リアクションとはkind 7のイベントであり、他のイベントに対しての反応を表現するために使用される。

content+の文字列のものが汎用的なリアクションとして定められており、 これは「いいね」または「賛成」(それぞれ原文ではlike, upvote)として解釈されるべきである (SHOULD) 。

content-であるリアクションは「低評価」または「反対」(それぞれ原文ではdislike, downvote)として解釈されるべきである (SHOULD) 。 また、これらは「いいね」としてカウントされるべきではなく (SHOULD NOT) 、 低評価・反対として投稿に表示してよい (MAY) 。 クライアントはこれらを表示する際、redditのように高評価数-低評価数として1つの数値に集計して表示するか、 あるいはそのまま分けて表示してよい (MAY) 。

contentには、絵文字及びカスタム絵文字(NIP-30)を利用してもよく (MAY) 、この場合「高評価」あるいは「低評価」として解釈してもよい (MAY) 。 また、クライアントは絵文字によるリアクションを投稿に表示してもよい (MAY) 。 もしcontentが空文字列だった場合は、クライアントはそれを"+"として解釈すべきである。

タグ

リアクションイベントには、リアクション対象としているイベントに含まれるe及びpタグを含めるべきである (SHOULD) 。 これにより、各ユーザはメンションされている投稿へのリアクションがあった際、通知を受け取ることが可能になる。 また、クライアントはこのようにして付与されたeタグを使用することで、1つの投稿あるいはスレッド全体に関連する リアクションを取得することが可能となる。

タグのリストの中で最後に現れるeタグでは、リアクション対象となるノートのidを指定しなければならない (MUST) 。

タグのリストの中で最後に現れるpタグでは、リアクション対象となるイベントのpubkeyを指定しなければならない (MUST) 。

リアクションイベントには、リアクションされたイベントの文字列化されたkind番号を値とする kタグを含めてもよい (MAY) 。

Example code

func make_like_event(pubkey: String, privkey: String, liked: NostrEvent) -> NostrEvent {
    var tags: [[String]] = liked.tags.filter { 
    	tag in tag.count >= 2 && (tag[0] == "e" || tag[0] == "p") 
    }
    tags.append(["e", liked.id])
    tags.append(["p", liked.pubkey])
    tags.append(["k", liked.kind])
    let ev = NostrEvent(content: "+", pubkey: pubkey, kind: 7, tags: tags)
    ev.calculate_id()
    ev.sign(privkey: privkey)
    return ev
}

カスタム絵文字によるリアクション

クライアントは、リアクション内容としてNIP-30のカスタム絵文字における:shortcode:を使用してもよい。 ショートコードがリアクションに含まれる場合、クライアントはemojiタグを参照し、 その内容を絵文字として描画すべきである。

{
  "kind": 7,
  "content": ":soapbox:",
  "tags": [
    ["emoji", "soapbox", "https://gleasonator.com/emoji/Gleasonator/soapbox.png"]
  ],
  "pubkey": "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6",
  "created_at": 1682790000
}

contentに含めて良い:shortcode:は1つのみで、emojiタグについても同様に1つのみ指定可能である。