Update index.js
Browse files
index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
import { createServer } from 'node:http';
|
| 2 |
import { randomUUID } from 'node:crypto';
|
| 3 |
import { Server } from 'socket.io';
|
| 4 |
-
import { getSpecialCarColorForName, isSpecialCarColor
|
| 5 |
import { createRandomSeed } from './src/utils/math.js';
|
| 6 |
|
| 7 |
// ==========================================
|
|
@@ -183,11 +183,19 @@ const validate = {
|
|
| 183 |
color: (color) => REGEX.PROFILE_COLOR.test(color),
|
| 184 |
};
|
| 185 |
|
| 186 |
-
function
|
|
|
|
|
|
|
|
|
|
|
|
|
| 187 |
const normalizedRequested = normalize.color(requestedColor || '#8cf4ff');
|
| 188 |
-
const
|
| 189 |
-
|
| 190 |
-
if (
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
return normalizedRequested;
|
| 192 |
}
|
| 193 |
|
|
@@ -418,10 +426,10 @@ function addSocketToRoom(socket, room, username, color) {
|
|
| 418 |
|
| 419 |
function canRejoinPlayer(player, username, reconnectToken) {
|
| 420 |
return Boolean(
|
| 421 |
-
player
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
);
|
| 426 |
}
|
| 427 |
|
|
@@ -548,7 +556,8 @@ io.on('connection', (socket) => {
|
|
| 548 |
const requestedColor = normalize.color(payload.color || '#8cf4ff');
|
| 549 |
|
| 550 |
if (!validateProfile(roomId, username, requestedColor, ack)) return;
|
| 551 |
-
const color = resolveAuthorizedColor(username, requestedColor);
|
|
|
|
| 552 |
if (rooms.has(roomId)) return reject(ack, 'room_exists', 'Room already exists.', 'roomId');
|
| 553 |
|
| 554 |
removeSocketFromRoom(socket.id);
|
|
@@ -566,12 +575,12 @@ io.on('connection', (socket) => {
|
|
| 566 |
const reconnectToken = String(payload.reconnectToken || '').trim();
|
| 567 |
|
| 568 |
if (!validateProfile(roomId, username, requestedColor, ack)) return;
|
| 569 |
-
const color = resolveAuthorizedColor(username, requestedColor);
|
|
|
|
| 570 |
|
| 571 |
const room = rooms.get(roomId);
|
| 572 |
if (!room) return reject(ack, 'room_not_found', 'Room does not exist.', 'roomId');
|
| 573 |
|
| 574 |
-
// Handle rejoining a match already in progress.
|
| 575 |
if (room.status !== ROOM_STATUS.WAITING) {
|
| 576 |
const rejoiningPlayerEntry = Array.from(room.players.entries())
|
| 577 |
.find(([_, player]) => canRejoinPlayer(player, username, reconnectToken));
|
|
@@ -589,7 +598,6 @@ io.on('connection', (socket) => {
|
|
| 589 |
return respond(ack, { ok: true, room: serializeRoom(room), rejoined: true, reconnectToken: rejoiningPlayer.reconnectToken });
|
| 590 |
}
|
| 591 |
|
| 592 |
-
// Normal Join
|
| 593 |
if (getActivePlayerCount(room) >= CONFIG.MAX_ROOM_PLAYERS) return reject(ack, 'room_full', 'Room is full.', 'roomId');
|
| 594 |
if (isAttrTaken(room, 'username', username)) return reject(ack, 'username_taken', 'Username taken.', 'username');
|
| 595 |
if (isAttrTaken(room, 'color', color)) return reject(ack, 'color_taken', 'Color taken.', 'color');
|
|
@@ -619,7 +627,8 @@ io.on('connection', (socket) => {
|
|
| 619 |
const requestedColor = normalize.color(payload.color ?? player.color);
|
| 620 |
|
| 621 |
if (!validateProfile(room.id, username, requestedColor, ack)) return;
|
| 622 |
-
const color = resolveAuthorizedColor(username, requestedColor);
|
|
|
|
| 623 |
if (isAttrTaken(room, 'username', username, socket.id)) return reject(ack, 'username_taken', 'Username taken.', 'username');
|
| 624 |
if (isAttrTaken(room, 'color', color, socket.id)) return reject(ack, 'color_taken', 'Color taken.', 'color');
|
| 625 |
|
|
|
|
| 1 |
import { createServer } from 'node:http';
|
| 2 |
import { randomUUID } from 'node:crypto';
|
| 3 |
import { Server } from 'socket.io';
|
| 4 |
+
import { getSpecialCarColorForName, isSpecialCarColor } from './src/utils/carColors.js';
|
| 5 |
import { createRandomSeed } from './src/utils/math.js';
|
| 6 |
|
| 7 |
// ==========================================
|
|
|
|
| 183 |
color: (color) => REGEX.PROFILE_COLOR.test(color),
|
| 184 |
};
|
| 185 |
|
| 186 |
+
function getReservedColorForUsername(username) {
|
| 187 |
+
return getSpecialCarColorForName(username, null);
|
| 188 |
+
}
|
| 189 |
+
|
| 190 |
+
function resolveAuthorizedColor(username, requestedColor, ack) {
|
| 191 |
const normalizedRequested = normalize.color(requestedColor || '#8cf4ff');
|
| 192 |
+
const reservedColor = getReservedColorForUsername(username);
|
| 193 |
+
|
| 194 |
+
if (reservedColor) return reservedColor;
|
| 195 |
+
if (isSpecialCarColor(normalizedRequested)) {
|
| 196 |
+
reject(ack, 'restricted_color', 'That special color is reserved for specific players.', 'color');
|
| 197 |
+
return null;
|
| 198 |
+
}
|
| 199 |
return normalizedRequested;
|
| 200 |
}
|
| 201 |
|
|
|
|
| 426 |
|
| 427 |
function canRejoinPlayer(player, username, reconnectToken) {
|
| 428 |
return Boolean(
|
| 429 |
+
player &&
|
| 430 |
+
player.disconnected &&
|
| 431 |
+
player.username.toLowerCase() === username.toLowerCase() &&
|
| 432 |
+
player.reconnectToken === reconnectToken
|
| 433 |
);
|
| 434 |
}
|
| 435 |
|
|
|
|
| 556 |
const requestedColor = normalize.color(payload.color || '#8cf4ff');
|
| 557 |
|
| 558 |
if (!validateProfile(roomId, username, requestedColor, ack)) return;
|
| 559 |
+
const color = resolveAuthorizedColor(username, requestedColor, ack);
|
| 560 |
+
if (!color) return;
|
| 561 |
if (rooms.has(roomId)) return reject(ack, 'room_exists', 'Room already exists.', 'roomId');
|
| 562 |
|
| 563 |
removeSocketFromRoom(socket.id);
|
|
|
|
| 575 |
const reconnectToken = String(payload.reconnectToken || '').trim();
|
| 576 |
|
| 577 |
if (!validateProfile(roomId, username, requestedColor, ack)) return;
|
| 578 |
+
const color = resolveAuthorizedColor(username, requestedColor, ack);
|
| 579 |
+
if (!color) return;
|
| 580 |
|
| 581 |
const room = rooms.get(roomId);
|
| 582 |
if (!room) return reject(ack, 'room_not_found', 'Room does not exist.', 'roomId');
|
| 583 |
|
|
|
|
| 584 |
if (room.status !== ROOM_STATUS.WAITING) {
|
| 585 |
const rejoiningPlayerEntry = Array.from(room.players.entries())
|
| 586 |
.find(([_, player]) => canRejoinPlayer(player, username, reconnectToken));
|
|
|
|
| 598 |
return respond(ack, { ok: true, room: serializeRoom(room), rejoined: true, reconnectToken: rejoiningPlayer.reconnectToken });
|
| 599 |
}
|
| 600 |
|
|
|
|
| 601 |
if (getActivePlayerCount(room) >= CONFIG.MAX_ROOM_PLAYERS) return reject(ack, 'room_full', 'Room is full.', 'roomId');
|
| 602 |
if (isAttrTaken(room, 'username', username)) return reject(ack, 'username_taken', 'Username taken.', 'username');
|
| 603 |
if (isAttrTaken(room, 'color', color)) return reject(ack, 'color_taken', 'Color taken.', 'color');
|
|
|
|
| 627 |
const requestedColor = normalize.color(payload.color ?? player.color);
|
| 628 |
|
| 629 |
if (!validateProfile(room.id, username, requestedColor, ack)) return;
|
| 630 |
+
const color = resolveAuthorizedColor(username, requestedColor, ack);
|
| 631 |
+
if (!color) return;
|
| 632 |
if (isAttrTaken(room, 'username', username, socket.id)) return reject(ack, 'username_taken', 'Username taken.', 'username');
|
| 633 |
if (isAttrTaken(room, 'color', color, socket.id)) return reject(ack, 'color_taken', 'Color taken.', 'color');
|
| 634 |
|