feat(events): an event action's progress() on a live run's public page (MODULE_API 1.12.0)
An event action may declare an optional `progress(envelope)`: how its
step stands while the run is live. Core accepts two shapes and
interprets neither:
- a count: { label, left, of }, rendered "Bandits: 3 of 8 left";
- a percentage: { label, percent }, rendered "The Juggernaut: 62%".
How core asks:
- `events/progress.js` asks each step of a live run whose action has
one. It passes the step's own held ledger rows and the reader's
account id, so the module applies its own visibility.
- Each call has a 2 s deadline. A throw, a late answer or any other
shape is a line not shown, never an error on the page.
- One answer per run and reader is cached for 5 s.
- The public event's live occurrence carries the lines as `progress`.
The route takes an optional session for the reader.
- The page renders them under the phase label and re-reads them every
15 s while the event is live.
Core stays game-agnostic: no game's words are in it. Additive, so a
minor bump. Module-uo declares ^1.10.0, registers no action with
progress(), and its actions and pages are unchanged.
From RunicNPC stage 8 (D304, D305).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
@@ -1318,6 +1318,23 @@ const doc = {
|
||||
'The LABEL of the phase a live run is in, resolved from the version the run pinned. Null unless it is live. The plan behind the event — phases, steps, actions and their params — is never published.',
|
||||
},
|
||||
resultsPublishedAt: { type: 'string', format: 'date-time', nullable: true },
|
||||
progress: {
|
||||
type: 'array',
|
||||
description:
|
||||
'On the live occurrence only: how its steps stand, in step order, in the words their modules chose (MODULE_API 1.12.0). Each line is a `label` with either `left` of `of` ("Bandits: 3 of 8 left") or a `percent` ("The Juggernaut: 62%"). Core renders them as text and interprets nothing. Empty when no step has anything to say, or its module did not answer in time.',
|
||||
items: { $ref: '#/components/schemas/PublicEventProgressLine' },
|
||||
},
|
||||
},
|
||||
},
|
||||
PublicEventProgressLine: {
|
||||
type: 'object',
|
||||
description:
|
||||
'One line of a live run’s progress: a `label` with either `left` of `of`, or a `percent`. Never both.',
|
||||
properties: {
|
||||
label: { type: 'string', example: 'Bandits' },
|
||||
left: { type: 'integer', example: 3 },
|
||||
of: { type: 'integer', example: 8 },
|
||||
percent: { type: 'integer', minimum: 0, maximum: 100, example: 62 },
|
||||
},
|
||||
},
|
||||
PublicEventParticipant: {
|
||||
|
||||
Reference in New Issue
Block a user