This commit is contained in:
legop3
2025-11-17 14:29:15 -05:00
parent 922f0b1188
commit fb04103593
9 changed files with 102 additions and 13 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -5,8 +5,8 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>webui</title>
<script type="module" crossorigin src="/assets/index-we2n3Zya.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-C9u9txZ3.css">
<script type="module" crossorigin src="/assets/index-BvgUoEqO.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DwQ38q3M.css">
</head>
<body>
<div id="root"></div>
+5 -2
View File
@@ -146,11 +146,14 @@ function pickRover() {
}
function describeAssignment(socketId) {
const roverId = assignments.get(socketId) || null;
const assignedRoverId = assignments.get(socketId) || null;
const adminRoverId = assignedRoverId ? null : roverManager.getPrimaryRoverForSocket(socketId);
const waitingIndex = waiting.has(socketId) ? Array.from(waiting).indexOf(socketId) : -1;
const roverId = assignedRoverId || adminRoverId || null;
const waitingStatus = waiting.has(socketId);
return {
roverId,
status: roverId ? 'assigned' : waiting.has(socketId) ? 'waiting' : null,
status: assignedRoverId ? 'assigned' : adminRoverId ? 'admin' : waitingStatus ? 'waiting' : null,
queuePosition: waitingIndex >= 0 ? waitingIndex + 1 : null,
};
}
+23
View File
@@ -115,6 +115,7 @@ function removeSocket(socket) {
record.drivers.delete(socket.id);
}
turnService.driverRemoved(roverId, socket.id);
managerEvents.emit('driver', { socketId: socket.id, roverId, action: 'remove' });
}
socketToRovers.delete(socket.id);
disableSpectator(socket);
@@ -147,6 +148,7 @@ function requestControl(roverId, socket, options = {}) {
socket.join(record.room);
turnService.driverAdded(roverId, socket.id, force && isAdmin(socket));
socket.emit('controlGranted', { roverId });
managerEvents.emit('driver', { socketId: socket.id, roverId, action: 'add' });
sendAlert({
color: COLORS.success,
title: 'Control Granted',
@@ -168,6 +170,7 @@ function releaseControl(roverId, socket) {
}
socket.leave(record.room);
turnService.driverRemoved(roverId, socket.id);
managerEvents.emit('driver', { socketId: socket.id, roverId, action: 'remove' });
}
function isDriver(roverId, socket) {
@@ -180,6 +183,24 @@ function canDrive(roverId, socket) {
return turnService.canDrive(roverId, socket) || isAdmin(socket);
}
function getRoversForSocket(socketId) {
const joined = socketToRovers.get(socketId);
if (!joined || joined.size === 0) {
return [];
}
return Array.from(joined);
}
function getPrimaryRoverForSocket(socketId) {
const joined = socketToRovers.get(socketId);
if (!joined || joined.size === 0) {
return null;
}
const iterator = joined.values();
const first = iterator.next();
return first.done ? null : first.value;
}
module.exports = {
upsertRover,
removeRover,
@@ -196,6 +217,8 @@ module.exports = {
disableSpectator,
rovers,
managerEvents,
getRoversForSocket,
getPrimaryRoverForSocket,
};
roleEvents.on('change', ({ socket, role }) => {
+9
View File
@@ -64,6 +64,15 @@ managerEvents.on('lock', ({ roverId, locked }) => {
syncAll();
});
managerEvents.on('driver', ({ socketId }) => {
if (!socketId) return;
const socket = io.sockets.sockets.get(socketId);
if (socket) {
logger.info('Driver assignment change; syncing session', socketId);
syncSocket(socket);
}
});
turnEvents.on('activeDriver', () => {
logger.info('Active driver change; syncing all clients');
syncAll();