mlpcardgame/src/network/types.ts

126 lines
2.0 KiB
TypeScript

import { DataConnection } from "peerjs";
import LocalClient from "./LocalClient";
export interface LocalPlayer {
kind: "local";
name: string;
client: LocalClient;
}
export interface NetworkPlayer {
kind: "remote";
name: string;
conn: DataConnection;
}
export type Player = NetworkPlayer | LocalPlayer;
export interface PeerMetadata {
name: string;
}
export interface Room {
info: RoomInfo;
players: Record<string, Player>;
}
export interface RoomInfo {
max_players: number;
password: string;
game?: GameInfo;
}
type GameInfo = MatchInfo | DraftInfo;
interface MatchInfo {
game_type: "match";
player1: string;
player2: string;
}
interface SetDraftInfo {
draft_type: "set";
set: string;
}
interface BlockDraftInfo {
draft_type: "block";
block: string;
}
interface CubeDraftInfo {
draft_type: "cube";
url: string;
seeded: boolean;
}
type DraftInfo = {
game_type: "draft";
} & (SetDraftInfo | BlockDraftInfo | CubeDraftInfo);
// Message schemas
export type NetworkMessage =
| PasswordRequest
| PasswordResponse
| LeaveRequest
| ErrorMessage
| RoomInfoMessage
| JoinMessage
| LeaveMessage
| RenameMessage
| ChatMessage
| AckMessage;
export interface PasswordRequest {
kind: "password-req";
}
export interface PasswordResponse {
kind: "password-resp";
password: string;
}
export interface RoomInfoMessage {
kind: "room-info";
room: RoomInfo;
players: string[];
}
export interface LeaveRequest {
kind: "leave-req";
}
export interface JoinMessage {
kind: "player-joined";
name: string;
}
export interface LeaveMessage {
kind: "player-left";
name: string;
}
export interface RenameMessage {
kind: "rename";
oldname: string;
newname: string;
}
export interface ChatMessage {
kind: "chat";
from: string;
to: string; // "" means everyone
message: string;
}
export interface AckMessage {
kind: "ok";
what: string;
}
export interface ErrorMessage {
kind: "error";
error: string;
}