riddhiman commited on
Commit
cc2dbe0
·
verified ·
1 Parent(s): f746a82

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +23 -14
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, normalizeDisplayCarColor } from './src/utils/carColors.js';
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 resolveAuthorizedColor(username, requestedColor) {
 
 
 
 
187
  const normalizedRequested = normalize.color(requestedColor || '#8cf4ff');
188
- const specialColor = getSpecialCarColorForName(username, null);
189
- if (specialColor) return specialColor;
190
- if (isSpecialCarColor(normalizedRequested)) return normalizeDisplayCarColor(normalizedRequested);
 
 
 
 
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
- && player.disconnected
423
- && player.username.toLowerCase() === username.toLowerCase()
424
- && player.reconnectToken === reconnectToken
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