Adds reading state

This commit is contained in:
Vitor Pamplona 2024-11-25 16:34:15 -05:00
parent d7be8afa24
commit e87baf2651

51
63.md
View File

@ -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>"],
@ -49,3 +57,34 @@ 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>"]
]
}
```