mirror of
https://github.com/nostr-protocol/nips.git
synced 2024-12-23 00:45:53 -05:00
Adds reading state
This commit is contained in:
parent
d7be8afa24
commit
e87baf2651
53
63.md
53
63.md
|
@ -6,22 +6,28 @@ Build Your Own Adventure
|
||||||
|
|
||||||
`draft` `optional`
|
`draft` `optional`
|
||||||
|
|
||||||
This NIP introduces `kind:296` and `kind:297` as text-based notes designed to create interactive stories. These notes include options for navigating to subsequent notes, allowing readers to continue exploring the story. `Kind:296` serves as the root event for the story, while `kind:297` represents individual scenes within the narrative.
|
This NIP introduces `kind:296` and `kind:297` as text-based notes designed to create interactive stories. These notes include options for navigating to subsequent notes, allowing readers to continue exploring the story. `Kind:296` serves as starting events for the reader, while `kind:297` represents individual scenes within the narrative.
|
||||||
|
|
||||||
The idea is to emulate "choose your own adventure" books, where each reader's journey through the story is unique.
|
The idea is to emulate "choose your own adventure" books, where each reader's journey through the story is unique.
|
||||||
|
|
||||||
Story events can include an optional `title` tag and multiple `option` tags that point to the next possible scenes.
|
Scene events MAY include an optional `title` tag and multiple `option` tags that point to the next possible scenes.
|
||||||
|
|
||||||
Clients SHOULD render the options in a way that allows users to select and seamlessly navigate to the corresponding posts.
|
Clients SHOULD render the options in a way that allows users to select and seamlessly navigate to the corresponding posts.
|
||||||
|
|
||||||
### Example for kind:296 (Root Scene)
|
### Example for kind:296 (Prologue)
|
||||||
|
|
||||||
|
Prologue events are entry points in the story.
|
||||||
|
|
||||||
|
They SHOULD contain `title`, `summary` and `image` to help clients render a preview of the story.
|
||||||
|
|
||||||
```jsonc
|
```jsonc
|
||||||
{
|
{
|
||||||
"kind": 296,
|
"kind": 296,
|
||||||
"content": "<the beginning of the story>",
|
"content": "<the beginning of the story>",
|
||||||
"tags": [
|
"tags": [
|
||||||
["title", "<short title for this part of the story>"],
|
["title", "<short title for the prologue>"],
|
||||||
|
["summary", "<summary for preview>"],
|
||||||
|
["image", "<image url for preview>"],
|
||||||
|
|
||||||
["option", "<description>", "<event_id>", "<relay_hint>"],
|
["option", "<description>", "<event_id>", "<relay_hint>"],
|
||||||
["option", "<description>", "<event_id>", "<relay_hint>"],
|
["option", "<description>", "<event_id>", "<relay_hint>"],
|
||||||
|
@ -32,12 +38,14 @@ Clients SHOULD render the options in a way that allows users to select and seaml
|
||||||
|
|
||||||
### Example for kind:297 (Scene)
|
### Example for kind:297 (Scene)
|
||||||
|
|
||||||
|
Scenes describe a given point in a story with potential options.
|
||||||
|
|
||||||
```jsonc
|
```jsonc
|
||||||
{
|
{
|
||||||
"kind": 297,
|
"kind": 297,
|
||||||
"content": "<continuation of the story>",
|
"content": "<description of the scene>",
|
||||||
"tags": [
|
"tags": [
|
||||||
["title", "<short title for this part of the story>"],
|
["title", "<short title for this scene>"],
|
||||||
|
|
||||||
["option", "<description>", "<event_id>", "<relay_hint>"],
|
["option", "<description>", "<event_id>", "<relay_hint>"],
|
||||||
["option", "<description>", "<event_id>", "<relay_hint>"],
|
["option", "<description>", "<event_id>", "<relay_hint>"],
|
||||||
|
@ -48,4 +56,35 @@ Clients SHOULD render the options in a way that allows users to select and seaml
|
||||||
|
|
||||||
The story concludes when no `option` tags are present.
|
The story concludes when no `option` tags are present.
|
||||||
|
|
||||||
The `.content` field SHOULD follow the same formatting rules as `kind:1`.
|
The `.content` field SHOULD follow the same formatting rules as `kind:1`.
|
||||||
|
|
||||||
|
## Reading State
|
||||||
|
|
||||||
|
Kind `30296` stores the latest state of the story.
|
||||||
|
|
||||||
|
The `d` tag of the replaceable event MUST match the root event's id.
|
||||||
|
|
||||||
|
The `e` tag points to the latest scene the user has read.
|
||||||
|
|
||||||
|
```jsonc
|
||||||
|
{
|
||||||
|
"kind": 30296,
|
||||||
|
"tags": [
|
||||||
|
["d", "<root_event_id>"],
|
||||||
|
|
||||||
|
// cached to simplify preview purposes
|
||||||
|
["title", "<root_event_title>"],
|
||||||
|
["summary", "<root_event_summary>"],
|
||||||
|
["image", "<image url for preview>"],
|
||||||
|
|
||||||
|
// root with relay hint
|
||||||
|
["E", "<root_event_id>", "<relay_hint>"],
|
||||||
|
|
||||||
|
// current scene with relay hint
|
||||||
|
["e", "<event_id>", "<relay_hint>"],
|
||||||
|
|
||||||
|
// reading status
|
||||||
|
["status", "<new|reading|done>"]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user