126 lines
2.0 KiB
TypeScript
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;
|
|
}
|