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つのみ指定可能である。