NIP-52
概要
この仕様ではある特定の瞬間または時の間の出来事を表現するカレンダーイベントを定義する。これらのカレンダーイベントは パラメータつき上書き可能であり、
NIP-09 によって削除可能である。
このNIPに特有の「カレンダーイベント ( calendar event
) 」という用語と異なり、「イベント ( event
) 」という用語はNostrのイベントを表すためにNIPで一般的に使われている。これらの2つの用語を識別するために、ここでは両者を区別する。
カレンダーイベント
カレンダーイベントには「日時ベースカレンダーイベント」と「時刻ベースカレンダーイベント」の2種類がある。カレンダーイベントは後述する「カレンダー」の一部である必要はない。
日時ベースカレンダーイベント
このカレンダーイベントは、ある日時に始まり、未来の異なる日時の前に終わる。日時ベースカレンダーイベントは記念日や祝日、休暇など、時間やタイムゾーンが重要でない終日または複数日の出来事に適している。
このフォーマットではパラメータつき上書き可能イベントkind 31922
を使う。
これらのイベントの .content
は任意であり、カレンダーイベントの詳細な説明でなければならない。
タグのリストは次の通りである。
d
(必須) universally unique identifier (UUID). カレンダーイベントを作製するクライアントによって生成される。
name
(必須) カレンダーイベントの名称。
start
(必須) ISO 8601形式 (YYYY-MM-DD) の開始日 (開始日を含む) 。 end
が存在したとき、これよりも前でなければならない。
end
(任意) ISO 8601形式 (YYYY-MM-DD) の終了日 (終了日を含まない) 。省略されたとき、カレンダーイベントは start
と同日に終了する。
location
(任意) カレンダーイベントの場所 (住所, GPS座標, 会議室名, ビデオ通話のリンク)
g
(任意)
NIP-12 で例として提案されているように、カレンダーイベントに検索可能な物理的位置を関連付けるための
ジオハッシュ。
p
(任意, 反復可能) 参加者の32バイトのhex公開鍵、任意の推奨リレーURL、会議における参加者の役割。
t
(任意, 反復可能) カレンダーイベントを分類するためのハッシュタグ。
r
(任意, 反復可能) ウェブページ、文書、ビデオ通話、録画された動画などへの参照/リンク。
31922.json{
"id": <32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>,
"pubkey": <32-bytes lowercase hex-encoded public key of the event creator>,
"created_at": <Unix timestamp in seconds>,
"kind": "31922",
"content": "<description of calendar event>",
"tags": [
["d", "<UUID>"],
["name", "<name of calendar event>"],
// Dates
["start", "<YYYY-MM-DD>"],
["end", "<YYYY-MM-DD>"],
// Location
["location", "<location>"],
["g", "<geohash>"],
// Participants
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "<role>"],
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "<role>"],
// Hashtags
["t", "<tag>"],
["t", "<tag>"],
// Reference links
["r", "<url>"],
["r", "<url>"]
]
}
時刻ベースカレンダーイベント
このカレンダーイベントは開始時刻と終了時刻の間にまたがる。
このフォーマットではパラメータつき上書き可能イベントkind 31923
を使う。
これらのイベントの .content
は任意であり、カレンダーイベントの詳細な説明でなければならない。
タグのリストは次の通りである。
d
(必須) universally unique identifier (UUID). カレンダーイベントを作製するクライアントによって生成される。
name
(必須) カレンダーイベントの名称。
start
(必須) 秒単位のUNIX時刻 (開始時を含む) 。 end
が存在したとき、これよりも前でなければならない。
end
(任意) 秒単位のUNIX時刻 (終了時を含まない) 。省略されたとき、カレンダーイベントは即座に終了する。
start_tzid
(任意) IANA Time Zone Databaseによって定義された開始時刻のタイムゾーン (e.g., America/Costa_Rica
) 。
end_tzid
(任意) IANA Time Zone Databaseによって定義された終了時刻のタイムゾーン (e.g., America/Costa_Rica
) 。 end_tzid
が省略され、かつ start_tzid
が存在する場合、終了時刻のタイムゾーンは開始時刻のタイムゾーンと同じになる。
location
(任意) カレンダーイベントの場所 (住所, GPS座標, 会議室名, ビデオ通話のリンク)
g
(任意)
NIP-12 で例として提案されているように、カレンダーイベントに検索可能な物理的位置を関連付けるための
ジオハッシュ。
p
(任意, 反復可能) 参加者の32バイトのhex公開鍵、任意の推奨リレーURL、会議における参加者の役割。
t
(任意, 反復可能) カレンダーイベントを分類するためのハッシュタグ。
r
(任意, 反復可能) ウェブページ、文書、ビデオ通話、録画された動画などへの参照/リンク。
31923.json{
"id": <32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>,
"pubkey": <32-bytes lowercase hex-encoded public key of the event creator>,
"created_at": <Unix timestamp in seconds>,
"kind": "31923",
"content": "<description of calendar event>",
"tags": [
["d", "<UUID>"],
["name", "<name of calendar event>"],
// Timestamps
["start", "<Unix timestamp in seconds>"],
["end", "<Unix timestamp in seconds>"],
["start_tzid", "<IANA Time Zone Database identifier>"],
["end_tzid", "<IANA Time Zone Database identifier>"],
// Location
["location", "<location>"],
["g", "<geohash>"],
// Participants
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "<role>"],
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "<role>"],
// Hashtags
["t", "<tag>"],
["t", "<tag>"],
// Reference links
["r", "<url>"],
["r", "<url>"]
]
}
カレンダー
カレンダーはカレンダーイベントの集合であり、kind 31924
を用いたカスタム上書き可能なリストイベントとして表現される。ユーザーは複数のカレンダーを持つことができる。プライベート、仕事、旅行、待ち合わせ、会議といった、個々の目的に応じてカレンダーイベントを分類するためにカレンダーを作製することができる。
このフォーマットでは、以下に説明するタグのリストを持つ、kind 31924
のカスタム上書き可能なリストを用いる。
d
(必須) カレンダーの名称。
a
(反復可能) kind 31922
もしくはkind 31923
のカレンダーイベントへの参照タグ。
31924.json{
"kind": 31924,
"tags": [
["d", "<calendar name>"],
["a", "<31922 or 31923>:<calendar event author pubkey>:<d-identifier of calendar event>", "<optional relay url>"],
["a", "<31922 or 31923>:<calendar event author pubkey>:<d-identifier of calendar event>", "<optional relay url>"]
]
}
カレンダーイベントRSVP
カレンダーイベントRSVPはユーザーの出席意思を示すためのカレンダーイベントへの応答である。
RSVPはフランス語の "Répondez s'il vous plaît" (お返事下さい) に由来する頭文字だと思われる (
RSVP - Wikipedia) 。

カレンダーイベントがあるユーザーの公開鍵をタグ付けしている場合、それはカレンダーイベント作製者がそのユーザーを招待していると解釈することができる。クライアントはユーザーにPSVPを促すことを選択してもよい (MAY) 。
たとえカレンダーイベントにタグ付けされていなくても、どのユーザーもRSVPをすることはできる。クライアントはカレンダーイベント作製者にRSVPしたユーザーを招待することを促すことを選択してもよい (MAY) 。また、クライアントはこれらのPSVPを無視することを選択してもよい (MAY) 。
このNIPは、PSVPしたユーザーがタグ付けされていないとき、カレンダーイベントに出席する権限が誰に与えられるかを意図的に定義しない。この意味を決定するのはカレンダーイベント作製者次第である。
またこのNIPは、RSVPが提出された後にカレンダーイベントが変更されたとき、何が生じるかを意図的に定義しない。
このフォーマットではパラメータつき上書き可能イベントkind 31925
を使う。
これらのイベントの .content
は任意であり、カレンダーイベントへの応答についてよりコンテキストを加えた自由形式の記述でなければならない。
タグのリストは次の通りである。
a
(必須) kind 31922
もしくはkind 31923
のカレンダーイベントへの参照タグ。
d
(必須) universally unique identifier (UUID). カレンダーイベントを作製するクライアントによって生成される。
L
(必須)
NIP-32 によるラベル名前空間
status
。
l
(必須)
NIP-32 によるラベル名前空間
status
に属するラベル
accepted
,
declined
,
tentative
。
L
(任意)
NIP-32 によるラベル名前空間
freebusy
。同じラベル名前空間の下に対応する
l
タグが存在する場合にのみ存在する。
l
(任意)
NIP-32 によるラベル名前空間
status
に属するラベル
free
,
busy
。カレンダーイベントの期間中にユーザーが空いているか忙しいかを決定する。このタグは、
status
ラベルが
declined
に設定されているとき、省略または無視されなければならない。同じラベル名前空間の下に対応する
l
タグが存在する場合にのみ存在する。
未解決の制約
プライベートイベントはない。
意図的にサポートしないシナリオ
定期的なカレンダーイベントは多くの複雑性を伴うため、ソフトウェアや人間が対処するのは困難である。この複雑性には被招待者間のタイムゾーンの違い、サマータイム、うるう年、複数のカレンダーシステム、スケジュールやその他のメタデータの単発的な変更などが含まれる。
このNIPは意図的に定期的なカレンダーイベントを除外し、この複雑さをクライアント側に押し付けている。もし望むならばクライアントが手動で実装する。すなわち、メタデータが重複する個々のカレンダーイベントは定期的なカレンダーイベントを表す。