diff options
| -rw-r--r-- | 53.md | 143 |
1 files changed, 143 insertions, 0 deletions
| @@ -129,3 +129,146 @@ Common use cases include meeting rooms/workshops, watch-together activities, or | |||
| 129 | "sig": "997f62ddfc0827c121043074d50cfce7a528e978c575722748629a4137c45b75bdbc84170bedc723ef0a5a4c3daebf1fef2e93f5e2ddb98e5d685d022c30b622" | 129 | "sig": "997f62ddfc0827c121043074d50cfce7a528e978c575722748629a4137c45b75bdbc84170bedc723ef0a5a4c3daebf1fef2e93f5e2ddb98e5d685d022c30b622" |
| 130 | } | 130 | } |
| 131 | ``` | 131 | ``` |
| 132 | |||
| 133 | ## Interactive Rooms and Meetings | ||
| 134 | ----- | ||
| 135 | |||
| 136 | `draft` `optional` | ||
| 137 | |||
| 138 | Service providers want to offer Interactive Rooms to the Nostr network in such a way that participants can easily log and query by clients. This NIP describes a general framework to advertise rooms and their associated events. | ||
| 139 | |||
| 140 | ## Concepts | ||
| 141 | |||
| 142 | ### Interactive Room (kind:30312) | ||
| 143 | |||
| 144 | A special event with `kind:30312` "Interactive Room" defines the configuration and properties of a virtual interactive space. Each room has a unique identifier and can host multiple events/meetings. | ||
| 145 | |||
| 146 | ```jsonc | ||
| 147 | { | ||
| 148 | "kind": 30312, | ||
| 149 | "tags": [ | ||
| 150 | ["d", "<unique identifier>"], // Required: Room identifier | ||
| 151 | ["room", "<name of the room>"], // Required: Display name | ||
| 152 | ["summary", "<description>"], // Optional: Room description | ||
| 153 | ["image", "<preview image url>"], // Optional: Room image | ||
| 154 | ["status", "<open, private, closed>"], // Required: Room accessibility | ||
| 155 | ["service", "<url>"], // Required: URL to access the room | ||
| 156 | ["endpoint", "<url>"], // Optional: API endpoint for status/info | ||
| 157 | ["t", "<hashtag>"], // Optional: Multiple hashtags allowed | ||
| 158 | ["p", "<pubkey>", "<url>", "<role>", "<proof>"], // Required: At least one provider | ||
| 159 | ["relays", "<url>", "<url>", /*...*/] // Optional: Preferred relays | ||
| 160 | ], | ||
| 161 | "content": "" // Usually empty, may contain additional metadata | ||
| 162 | } | ||
| 163 | ``` | ||
| 164 | |||
| 165 | Room properties: | ||
| 166 | * MUST be either open, private or closed. Closed means the room is not in operation. | ||
| 167 | * MAY specify access control policy for private rooms (e.g. invite-only, payment required) | ||
| 168 | * MAY persist when not in use | ||
| 169 | * MUST have at least one provider with "Host" role | ||
| 170 | * MAY have multiple providers with different roles | ||
| 171 | Provider roles (p tags): | ||
| 172 | * Host: Full room management capabilities | ||
| 173 | * Moderator: Room moderation capabilities | ||
| 174 | * Speaker: Allowed to present/speak | ||
| 175 | * Optional proof field for role verification | ||
| 176 | |||
| 177 | ### Room Meeting (kind:30313) | ||
| 178 | |||
| 179 | A special event with kind:30313 represents a scheduled or ongoing meeting within a room. It MUST reference its parent room using the d tag. | ||
| 180 | |||
| 181 | ```jsonc | ||
| 182 | { | ||
| 183 | "kind": 30313, | ||
| 184 | "tags": [ | ||
| 185 | ["d", "<event-unique-identifier>"], // Required: Event identifier | ||
| 186 | ["a", "30312:<pubkey>:<room-id>", "wss://nostr.example.com"], // Required: Reference to parent room, 'd' from 30312 | ||
| 187 | ["title", "<meeting-title>"], // Required: Meeting title | ||
| 188 | ["summary", "<description>"], // Optional: Meeting description | ||
| 189 | ["image", "<preview image url>"], // Optional: Meeting image | ||
| 190 | ["starts", "<unix timestamp>"], // Required: Start time | ||
| 191 | ["ends", "<unix timestamp>"], // Optional: End time | ||
| 192 | ["status", "<planned, live, ended>"], // Required: Meeting status | ||
| 193 | ["total_participants", "<number>"], // Optional: Total registered | ||
| 194 | ["current_participants", "<number>"], // Optional: Currently active | ||
| 195 | ["p", "<pubkey>", "<url>", "<role>"], // Optional: Participant with role | ||
| 196 | ], | ||
| 197 | "content": "" // Usually empty, may contain additional metadata | ||
| 198 | } | ||
| 199 | ``` | ||
| 200 | |||
| 201 | Event properties: | ||
| 202 | * MUST reference parent room via d tag | ||
| 203 | * MUST have a status (planned/live/ended) | ||
| 204 | * MUST have a start time | ||
| 205 | * MAY track participant counts | ||
| 206 | * MAY include participant roles specific to the event | ||
| 207 | Event management: | ||
| 208 | * Clients SHOULD update event status regularly when live | ||
| 209 | * Events without updates for 1 hour MAY be considered ended | ||
| 210 | * starts and ends timestamps SHOULD be updated when status changes | ||
| 211 | |||
| 212 | Examples | ||
| 213 | |||
| 214 | Interactive Room (kind:30312) | ||
| 215 | |||
| 216 | ```jsonc | ||
| 217 | { | ||
| 218 | "kind": 30312, | ||
| 219 | "tags": [ | ||
| 220 | ["d", "main-conference-room"], | ||
| 221 | ["room", "Main Conference Hall"], | ||
| 222 | ["summary", "Our primary conference space"], | ||
| 223 | ["image", "https://example.com/room.jpg"], | ||
| 224 | ["status", "open"], | ||
| 225 | ["service", "https://meet.example.com/room"], | ||
| 226 | ["endpoint", "https://api.example.com/room"], | ||
| 227 | ["t", "conference"], | ||
| 228 | ["p", "f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca", "wss://nostr.example.com/", "Owner"], | ||
| 229 | ["p", "14aeb..8dad4", "wss://provider2.com/", "Moderator"], | ||
| 230 | ["relays", "wss://relay1.com", "wss://relay2.com"] | ||
| 231 | ], | ||
| 232 | "content": "" | ||
| 233 | } | ||
| 234 | ``` | ||
| 235 | |||
| 236 | Conference Event (kind:30313) | ||
| 237 | |||
| 238 | ```jsonc | ||
| 239 | { | ||
| 240 | "kind": 30313, | ||
| 241 | "tags": [ | ||
| 242 | ["d", "annual-meeting-2025"], | ||
| 243 | ["a", "30312:f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca:main-conference-room", "wss://nostr.example.com"] | ||
| 244 | ["title", "Annual Company Meeting 2025"], | ||
| 245 | ["summary", "Yearly company-wide meeting"], | ||
| 246 | ["image", "https://example.com/meeting.jpg"], | ||
| 247 | ["starts", "1676262123"], | ||
| 248 | ["ends", "1676269323"], | ||
| 249 | ["status", "live"], | ||
| 250 | ["total_participants", "180"], | ||
| 251 | ["current_participants", "175"], | ||
| 252 | ["p", "91cf9..4e5ca", "wss://provider1.com/", "Speaker"], | ||
| 253 | ], | ||
| 254 | "content": "" | ||
| 255 | } | ||
| 256 | ``` | ||
| 257 | ## Room Presence | ||
| 258 | |||
| 259 | New `kind: 10312` provides an event which signals presence of a listener. | ||
| 260 | |||
| 261 | The presence event SHOULD be updated at regular intervals and clients SHOULD filter presence events older than | ||
| 262 | a given time window. | ||
| 263 | |||
| 264 | **This kind `10312` is a regular replaceable event, as such presence can only be indicated in one room at a time.** | ||
| 265 | |||
| 266 | ```json | ||
| 267 | { | ||
| 268 | "kind": 10312, | ||
| 269 | "tags": [ | ||
| 270 | ["a" , "<room-a-tag>", "<relay-hint>", "root"], | ||
| 271 | ["hand", "1"] // hand raised flag | ||
| 272 | ] | ||
| 273 | } | ||
| 274 | ``` | ||