Seat transfer phrases: carry your games to another device
While seated, "transfer seat" in the masthead mints a spoken-word one-time phrase from the game's own vocabulary (ember-troll-dagger), good for ten minutes. Typing it into the lobby's "claim a transferred seat" box on any other device hands over the seat's token, adds the game to that browser's ledger, and sits you straight down at the table. Phrases are single-use, expire, are voided by a server restart (seats never are), and both devices keep the seat afterward — the phone on the couch and the desktop upstairs can play the same wizard. Verified end to end: mint, claim, rejoin, and a second claim refused. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
bc8013863b
commit
2184721ab4
@@ -14,10 +14,12 @@
|
||||
import { WebSocketServer, WebSocket } from "ws";
|
||||
import type { Command, PlayerId } from "@wizwar/engine";
|
||||
import {
|
||||
claimTransferCode,
|
||||
createRoom,
|
||||
getRoom,
|
||||
joinRoom,
|
||||
loadPersistedRooms,
|
||||
makeTransferCode,
|
||||
redactFor,
|
||||
runCommand,
|
||||
startGame,
|
||||
@@ -131,6 +133,20 @@ wss.on("connection", (socket) => {
|
||||
broadcast(room, (playerId) => ({ type: "state", view: viewForPlayer(room, playerId) }));
|
||||
break;
|
||||
}
|
||||
case "makeTransfer": {
|
||||
const room = session.roomId ? getRoom(session.roomId) : undefined;
|
||||
if (!room || !session.playerId) return send(socket, { type: "error", message: "not in a room" });
|
||||
const result = makeTransferCode(room, session.playerId);
|
||||
if ("error" in result) return send(socket, { type: "error", message: result.error });
|
||||
send(socket, { type: "transferCode", code: result.code, expiresAt: result.expiresAt });
|
||||
break;
|
||||
}
|
||||
case "claimTransfer": {
|
||||
const result = claimTransferCode(String(msg.code ?? ""));
|
||||
if ("error" in result) return send(socket, { type: "error", message: result.error });
|
||||
send(socket, { type: "transferClaimed", seat: result });
|
||||
break;
|
||||
}
|
||||
case "myGames": {
|
||||
// {seats: [{roomId, name, token}]} -> summaries for valid seats.
|
||||
const seats = Array.isArray(msg.seats) ? msg.seats : [];
|
||||
|
||||
Reference in New Issue
Block a user