diff --git a/cvmts/src/CollabVMServer.ts b/cvmts/src/CollabVMServer.ts index 4bc7c08..61cbe8c 100644 --- a/cvmts/src/CollabVMServer.ts +++ b/cvmts/src/CollabVMServer.ts @@ -1,7 +1,6 @@ import IConfig from './IConfig.js'; import * as Utilities from './Utilities.js'; import { User, Rank } from './User.js'; -import * as cvm from '@cvmts/cvm-rs'; // I hate that you have to do it like this import CircularBuffer from 'mnemonist/circular-buffer.js'; import Queue from 'mnemonist/queue.js'; @@ -801,17 +800,20 @@ export default class CollabVMServer implements IProtocolHandlers { private sendTurnUpdate(client?: User) { var turnQueueArr = this.TurnQueue.toArray(); - var turntime; + var turntime: number; if (this.indefiniteTurn === null) turntime = this.TurnTime * 1000; else turntime = 9999999999; - var arr = ['turn', turntime.toString(), this.TurnQueue.size.toString()]; - // @ts-ignore - this.TurnQueue.forEach((c) => arr.push(c.username)); + var users: string[] = []; + + this.TurnQueue.forEach((c) => users.push(c.username!)); + var currentTurningUser = this.TurnQueue.peek(); + if (client) { - client.sendMsg(cvm.guacEncode(...arr)); + client.protocol.sendTurnQueue(turntime, users); return; } + this.clients .filter((c) => c !== currentTurningUser && c.connectedToNode) .forEach((c) => { @@ -819,12 +821,12 @@ export default class CollabVMServer implements IProtocolHandlers { var time; if (this.indefiniteTurn === null) time = this.TurnTime * 1000 + (turnQueueArr.indexOf(c) - 1) * this.Config.collabvm.turnTime * 1000; else time = 9999999999; - c.sendMsg(cvm.guacEncode(...arr, time.toString())); + c.protocol.sendTurnQueueWaiting(turntime, users, time); } else { - c.sendMsg(cvm.guacEncode(...arr)); + c.protocol.sendTurnQueue(turntime, users); } }); - if (currentTurningUser) currentTurningUser.sendMsg(cvm.guacEncode(...arr)); + if (currentTurningUser) currentTurningUser.protocol.sendTurnQueue(turntime, users); } private nextTurn() { clearInterval(this.TurnInterval); diff --git a/cvmts/src/GuacamoleProtocol.ts b/cvmts/src/GuacamoleProtocol.ts index 38c9d3e..be41f01 100644 --- a/cvmts/src/GuacamoleProtocol.ts +++ b/cvmts/src/GuacamoleProtocol.ts @@ -326,6 +326,20 @@ export class GuacamoleProtocol extends ProtocolBase implements IProtocol { this.user?.sendMsg(cvm.guacEncode('vote', '3', ms.toString())); } + private getTurnQueueBase(turnTime: number, users: string[]): string[] { + return ['turn', turnTime.toString(), users.length.toString(), ...users]; + } + + sendTurnQueue(turnTime: number, users: string[]): void { + this.user?.sendMsg(cvm.guacEncode(...this.getTurnQueueBase(turnTime, users))); + } + + sendTurnQueueWaiting(turnTime: number, users: string[], waitTime: number): void { + let queue = this.getTurnQueueBase(turnTime, users); + queue.push(waitTime.toString()); + this.user?.sendMsg(cvm.guacEncode(...queue)); + } + sendScreenResize(width: number, height: number): void { this.user?.sendMsg(cvm.guacEncode('size', '0', width.toString(), height.toString())); } diff --git a/cvmts/src/Protocol.ts b/cvmts/src/Protocol.ts index d4185ce..1a368d8 100644 --- a/cvmts/src/Protocol.ts +++ b/cvmts/src/Protocol.ts @@ -136,6 +136,9 @@ export interface IProtocol { sendListResponse(list: ListEntry[]): void; + sendTurnQueue(turnTime: number, users: string[]): void; + sendTurnQueueWaiting(turnTime: number, users: string[], waitTime: number): void + sendVoteStarted(): void; sendVoteStats(msLeft: number, nrYes: number, nrNo: number): void; sendVoteEnded(): void;