2024-08-22 04:26:17 -04:00
|
|
|
import { Rank, User } from '../User';
|
2024-08-21 07:10:58 -04:00
|
|
|
|
|
|
|
|
// We should probably put this in the binproto repository or something
|
2024-08-22 03:50:04 -04:00
|
|
|
export enum ProtocolUpgradeCapability {
|
|
|
|
|
BinRects = 'bin'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export enum ProtocolRenameStatus {
|
|
|
|
|
Ok = 0,
|
|
|
|
|
UsernameTaken = 1,
|
|
|
|
|
UsernameInvalid = 2,
|
|
|
|
|
UsernameNotAllowed = 3
|
2024-08-21 07:10:58 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ScreenRect {
|
|
|
|
|
x: number;
|
|
|
|
|
y: number;
|
|
|
|
|
data: Buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ListEntry {
|
|
|
|
|
id: string;
|
|
|
|
|
name: string;
|
|
|
|
|
thumbnail: Buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ProtocolChatHistory {
|
|
|
|
|
user: string;
|
|
|
|
|
msg: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ProtocolAddUser {
|
|
|
|
|
username: string;
|
|
|
|
|
rank: Rank;
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-22 03:50:04 -04:00
|
|
|
export interface ProtocolFlag {
|
|
|
|
|
username: string;
|
|
|
|
|
countryCode: string;
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-21 07:10:58 -04:00
|
|
|
// Protocol handlers. This is implemented by a layer that wants to listen to CollabVM protocol messages.
|
2024-08-22 04:29:17 -04:00
|
|
|
export interface IProtocolMessageHandler {
|
2024-08-21 07:10:58 -04:00
|
|
|
onNop(user: User): void;
|
|
|
|
|
|
|
|
|
|
onNoFlag(user: User): void;
|
|
|
|
|
|
|
|
|
|
// Called when the client requests a capability upgrade
|
|
|
|
|
onCapabilityUpgrade(user: User, capability: Array<String>): boolean;
|
|
|
|
|
|
|
|
|
|
onLogin(user: User, token: string): void;
|
|
|
|
|
|
|
|
|
|
// Called on turn request
|
|
|
|
|
onTurnRequest(user: User, forfeit: boolean): void;
|
|
|
|
|
|
|
|
|
|
onVote(user: User, choice: number): void;
|
|
|
|
|
|
|
|
|
|
onList(user: User): void;
|
|
|
|
|
onConnect(user: User, node: string): void;
|
|
|
|
|
onView(user: User, node: string, viewMode: number): void;
|
|
|
|
|
|
2024-08-21 20:15:14 -04:00
|
|
|
// Admin handlers
|
2024-08-21 07:10:58 -04:00
|
|
|
onAdminLogin(user: User, password: string): void;
|
|
|
|
|
onAdminMonitor(user: User, node: string, command: string): void;
|
2024-08-21 20:15:14 -04:00
|
|
|
onAdminRestore(user: User, node: string): void;
|
|
|
|
|
onAdminReboot(user: User, node: string): void;
|
|
|
|
|
onAdminBanUser(user: User, username: string): void;
|
|
|
|
|
onAdminForceVote(user: User, choice: number): void;
|
|
|
|
|
onAdminMuteUser(user: User, username: string, temporary: boolean): void;
|
|
|
|
|
onAdminKickUser(user: User, username: string): void;
|
|
|
|
|
onAdminEndTurn(user: User, username: string): void;
|
|
|
|
|
onAdminClearQueue(user: User, node: string): void;
|
|
|
|
|
onAdminRename(user: User, target: string, newName: string): void;
|
|
|
|
|
onAdminGetIP(user: User, username: string): void;
|
|
|
|
|
onAdminBypassTurn(user: User): void;
|
|
|
|
|
onAdminRawMessage(user: User, message: string): void;
|
|
|
|
|
onAdminToggleTurns(user: User, enabled: boolean): void;
|
|
|
|
|
onAdminIndefiniteTurn(user: User): void;
|
|
|
|
|
onAdminHideScreen(user: User, show: boolean): void;
|
|
|
|
|
onAdminSystemMessage(user: User, message: string): void;
|
|
|
|
|
|
|
|
|
|
onRename(user: User, newName: string | undefined): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
onChat(user: User, message: string): void;
|
|
|
|
|
|
|
|
|
|
onKey(user: User, keysym: number, pressed: boolean): void;
|
|
|
|
|
onMouse(user: User, x: number, y: number, buttonMask: number): void;
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-22 03:50:04 -04:00
|
|
|
// Abstracts away all of the protocol details from the CollabVM server,
|
|
|
|
|
// allowing it to be protocol-independent (as long as the client and server
|
|
|
|
|
// are able to speak the same protocol.)
|
2024-08-21 07:10:58 -04:00
|
|
|
export interface IProtocol {
|
2024-08-21 22:26:36 -04:00
|
|
|
// Protocol implementation stuff
|
|
|
|
|
|
2024-08-22 03:50:04 -04:00
|
|
|
// Parses a single message and fires the given handler with deserialized arguments.
|
2024-08-21 07:10:58 -04:00
|
|
|
// This function does not catch any thrown errors; it is the caller's responsibility
|
|
|
|
|
// to handle errors. It should, however, catch invalid parameters without failing.
|
2024-08-22 03:50:04 -04:00
|
|
|
//
|
|
|
|
|
// This function will perform conversion to text if it is required.
|
2025-06-15 15:03:13 -04:00
|
|
|
processMessage(user: User, handler: IProtocolMessageHandler, buffer: Buffer): boolean;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
|
|
|
|
// Senders
|
|
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendNop(user: User): void;
|
|
|
|
|
sendSync(user: User, now: number): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendAuth(user: User, authServer: string): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendCapabilities(user: User, caps: ProtocolUpgradeCapability[]): void;
|
2024-08-22 03:50:04 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendConnectFailResponse(user: User): void;
|
|
|
|
|
sendConnectOKResponse(user: User, votes: boolean): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendLoginResponse(user: User, ok: boolean, message: string | undefined): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendAdminLoginResponse(user: User, ok: boolean, modPerms: number | undefined): void;
|
|
|
|
|
sendAdminMonitorResponse(user: User, output: string): void;
|
|
|
|
|
sendAdminIPResponse(user: User, username: string, ip: string): void;
|
2024-08-21 22:18:11 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendChatMessage(user: User, username: '' | string, message: string): void;
|
|
|
|
|
sendChatHistoryMessage(user: User, history: ProtocolChatHistory[]): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendAddUser(user: User, users: ProtocolAddUser[]): void;
|
|
|
|
|
sendRemUser(user: User, users: string[]): void;
|
|
|
|
|
sendFlag(user: User, flag: ProtocolFlag[]): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendSelfRename(user: User, status: ProtocolRenameStatus, newUsername: string, rank: Rank): void;
|
|
|
|
|
sendRename(user: User, oldUsername: string, newUsername: string, rank: Rank): void;
|
2024-08-22 04:08:13 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendListResponse(user: User, list: ListEntry[]): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendTurnQueue(user: User, turnTime: number, users: string[]): void;
|
|
|
|
|
sendTurnQueueWaiting(user: User, turnTime: number, users: string[], waitTime: number): void;
|
2024-08-22 04:04:12 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendVoteStarted(user: User): void;
|
|
|
|
|
sendVoteStats(user: User, msLeft: number, nrYes: number, nrNo: number): void;
|
|
|
|
|
sendVoteEnded(user: User): void;
|
|
|
|
|
sendVoteCooldown(user: User, ms: number): void;
|
2024-08-21 22:36:22 -04:00
|
|
|
|
2025-06-15 15:03:13 -04:00
|
|
|
sendScreenResize(user: User, width: number, height: number): void;
|
2024-08-21 07:10:58 -04:00
|
|
|
|
|
|
|
|
// Sends a rectangle update to the user.
|
2025-06-15 15:03:13 -04:00
|
|
|
sendScreenUpdate(user: User, rect: ScreenRect): void;
|
2024-08-21 22:26:36 -04:00
|
|
|
}
|