GamesPlayerJoinedPayload games.player.joined@1
Generated at from
openvibe-contracts v0.34.2 and
openvibe-sdk v0.5.0.
- Version
- 1.0.0
- Owner
- games
- Visibility
- first-party
- Status
- active
- Compatibility
- backward
- Schema
https://openvibe.network/contracts/events/payloads/games.player.joined.v1.json
games.player.joined v1 (OpenVibe.Games apps/server/src/platform/gameEvents.ts playerJoinedEvent, via GameEventRecorder.recordJoin from game/gameServer.ts handleHello). A character entered the world: written to Games' event_outbox in a transaction of its own once the session exists and the welcome was sent (a new character's row is first written by its next save). restored is true when the character already existed in the database, false for a new one. Only emitted while Events publishing is configured. No position, appearance, inventory, rank or connection data. Envelope: subject { type: player, id: <player.id> }, visibility subject when the player has a Network subject and internal otherwise, priority low, actor user:<usr_...> or guest:<gst_...> from player.subject, else service:games. No consumer yet.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
player | one of | yes | The character. account network: a signed-in openvibe.network account, keyed by its canonical subject (user usr_..., or guest gst_... for a Network guest session). account guest: a local guest (browser token), or a Network sign-in whose token predates subject ids; no subject then. | |
world | string | yes | World id (the loaded content world, e.g. openvibeville_v2). Also the envelope subject id of games.world.saved. | |
restored | boolean | yes | The character was loaded from the database (false: created by this join). |
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: guest-new
{
"player": {
"id": "01kz4a7r2p9b6g3e8v0z",
"slot": 0,
"name": "Guest 42",
"account": "guest"
},
"world": "openvibeville_v2",
"restored": false
}Valid: network-guest-session
{
"player": {
"id": "01kz4a7r2p9b6g3e8v0y",
"slot": 0,
"name": "Wanderer",
"account": "network",
"subject": {
"type": "guest",
"id": "gst_01JAC7T9W2X4Y6Z8A0B1C3D5E7"
}
},
"world": "openvibeville_v2",
"restored": false
}Valid: network-restored
{
"player": {
"id": "01kz3m8q4d7xw2ht5n9c",
"slot": 1,
"name": "Rustbucket",
"account": "network",
"subject": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
}
},
"world": "openvibeville_v2",
"restored": true
}Rejected: guest-with-subject
{
"player": {
"id": "01kz4a7r2p9b6g3e8v0z",
"slot": 0,
"name": "Guest 42",
"account": "guest",
"subject": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
}
},
"world": "openvibeville_v2",
"restored": false
}Rejected: missing-restored
{
"player": {
"id": "01kz3m8q4d7xw2ht5n9c",
"slot": 1,
"name": "Rustbucket",
"account": "network",
"subject": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
}
},
"world": "openvibeville_v2"
}Rejected: network-without-subject
{
"player": {
"id": "01kz3m8q4d7xw2ht5n9c",
"slot": 1,
"name": "Rustbucket",
"account": "network"
},
"world": "openvibeville_v2",
"restored": true
}Rejected: uppercase-player-id
{
"player": {
"id": "01KZ3M8Q4D7XW2HT5N9C",
"slot": 1,
"name": "Rustbucket",
"account": "network",
"subject": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
}
},
"world": "openvibeville_v2",
"restored": true
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('games.player.joined@1', value); // { valid, errors: [{ path, message }] }