-
Notifications
You must be signed in to change notification settings - Fork 0
Socket Events
Contrato completo dos eventos socket.io entre cliente e servidor.
Tipos em shared/src/index.ts:
ServerToClientEvents { state, campaigns }
ClientToServerEvents { ...todos os abaixo... }state: (state: SessionState) => voidSnapshot completo da sessão. Enviado:
- Imediatamente após
connect(todo client recebe). - Após qualquer mutação válida.
campaigns: (list: CampaignSummary[]) => voidLista de campanhas disponíveis (id, title, genre, era). Enviado:
- Imediatamente após
connect. - Quando o cliente pede via
listCampaigns.
setActiveScene: (sceneId: string | null) => voidDefine a cena ativa. null limpa o display. Validado contra isTreatmentAllowed().
setLighting: (patch: Partial<Lighting>) => voidMerge no estado atual. Cores são saneadas; valores fora do range são clamped (intensity em 0..1).
setAudioLayer: (id: string, patch: { playing?: boolean; volume?: number }) => voidAtualiza uma camada. volume clamp em [0,1].
rollDice: (notation: string) => void
customRoll: (result: { notation, rolls, modifier, total, notes? }) => voidrollDice faz parse + sorteio no server. customRoll é pra resultados já calculados (system rules) — server sanitiza e broadcasta.
addCombatant: (
name: string,
initiative: number,
extras?: Record<string, number | boolean>,
hp?: number,
maxHp?: number,
) => void
updateCombatant: (
id: string,
patch: Partial<Pick<Combatant, 'name' | 'initiative' | 'hp' | 'maxHp' | 'statuses' | 'extra'>>,
) => void
removeCombatant: (id: string) => void
nextTurn: () => void
setCombatActive: (active: boolean) => void
clearCombat: () => voidextra é mesclado (não substituído) no updateCombatant. Status array tem cap em 12 itens.
listCampaigns: () => void
selectCampaign: (id: string) => voidselectCampaign recarrega o JSON, tenta restaurar .session.json se for a mesma campanha, ou reseta.
setNotes: (text: string) => voidSubstitui o texto inteiro. Cap em 16384 chars.
addClock: (name: string, segments: number) => void
updateClock: (id: string, patch: { filled?, name?, segments?, color? }) => void
removeClock: (id: string) => void
clearClocks: () => voidVer Clocks. Estado em SessionState.clocks, persiste no .session.json.
setPartyResource: (key: string, value: number) => voidClampado por min/max do PartyResourceDef do sistema ativo. Ver Party Resources.
importCreature5e: (rawJson: string, systemOverride?: string) => void
saveCreature: (entry: Omit<CreatureLibraryEntry, 'id' | 'createdAt'>) => void
deleteCreature: (id: string) => void
spawnCombatantFromCreature: (creatureId: string, initiative: number) => voidPersiste em .creatures.json (global). Ver Creature Library.
saveEncounter: (entry: { name, system, combatants, notes? }) => void
deleteEncounter: (id: string) => void
spawnEncounter: (id: string) => voidPersiste em .encounters.json (global). Ver Encounter Library.
saveTable: (entry: { name: string; entries: string[] }) => void
updateTable: (id: string, patch: { name?: string; entries?: string[] }) => void
deleteTable: (id: string) => voidPersiste em .tables.json (global). A rolagem é local no cliente. Ver Random Tables.
setSceneMusic: (sceneId: string, music: SceneMusic | null) => voidVincula um contexto do Spotify a uma cena; ao ativar a cena, o servidor manda tocar. Persiste em .scene-music.json (indexado por campanha). Ver Spotify.
Pra completar a referência:
| Método | Rota | Detalhes |
|---|---|---|
| GET | /spotify/login |
OAuth start (302 → Spotify) |
| GET | /spotify/callback |
OAuth callback (302 → /control) |
| GET | /spotify/state |
SpotifyState JSON |
| GET | /spotify/playlists |
{ playlists: SpotifyPlaylist[] } |
| POST | /spotify/command |
corpo: SpotifyCommand, retorna { ok }
|
| POST | /system/open-assets |
loopback-only; abre file manager |
| GET | /assets/* |
static files de assets/
|
| GET |
/* (fallback SPA) |
serve client/dist/index.html
|
Toda entrada socket passa por server/src/validate.ts:
-
toFiniteInt(n)— sóNumber.isFinite(n) ? n : 0. -
clamp(n, min, max)— bound. -
sanitizeRolls(arr)— array de inteiros, limites de tamanho. -
sanitizeNotes(arr)— strings, até 8 itens × 80 chars. -
sanitizeStatuses(arr)— até 12, strings curtas. -
sanitizeExtras(obj)— só number/boolean values, chaves curtas. -
isSafeCssColor(s)— só hex/rgb/named seguros. -
capNotation(s)— corta strings absurdas (>200 chars).
Filosofia: trust no caller, never crash. Entrada inválida → ignore silenciosamente; nunca propaga undefined pro broadcast.
Setup
Conteúdo
Ferramentas
- Combat Tracker
- Creature Library
- Encounter Library
- Clocks
- Party Resources
- Random Tables
- Dice and Roll History
- GM Notes
- RPG Systems
Display
Arquitetura