mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 09:31:20 -04:00
ip list (testing)
This commit is contained in:
@@ -165,7 +165,31 @@ function pickRover() {
|
||||
if (candidates.length === 0) {
|
||||
return null;
|
||||
}
|
||||
candidates.sort((a, b) => a.drivers.size - b.drivers.size);
|
||||
const dockedRank = (rover) => {
|
||||
if (!rover) return 0;
|
||||
if (rover.docked === true) return -1;
|
||||
if (rover.docked === false) return 1;
|
||||
const sensors = rover.lastSensor?.decoded || rover.lastSensor?.sensors || null;
|
||||
const docked = sensors?.chargingSources?.homeBase;
|
||||
if (docked === true) return -1;
|
||||
if (docked === false) return 1;
|
||||
return 0;
|
||||
};
|
||||
const idleRank = (rover) => (rover?.drivers?.size === 0 ? 1 : 0);
|
||||
candidates.sort((a, b) => {
|
||||
const aEmpty = idleRank(a);
|
||||
const bEmpty = idleRank(b);
|
||||
if (aEmpty !== bEmpty) return bEmpty - aEmpty;
|
||||
const aDockRank = dockedRank(a);
|
||||
const bDockRank = dockedRank(b);
|
||||
if (aEmpty === 1 && aDockRank !== bDockRank) {
|
||||
return bDockRank - aDockRank;
|
||||
}
|
||||
if (a.drivers.size !== b.drivers.size) {
|
||||
return a.drivers.size - b.drivers.size;
|
||||
}
|
||||
return bDockRank - aDockRank;
|
||||
});
|
||||
return candidates[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -22,10 +22,33 @@ logger.info('Discord invite loaded:', discordInvite ? 'present' : 'not configure
|
||||
logger.info('Ko-fi link loaded:', kofiLink ? 'present' : 'not configured');
|
||||
|
||||
const ACTIVITY_SYNC_COOLDOWN_MS = 3000;
|
||||
const ADMIN_ROLES = new Set(['admin', 'lockdown', 'lockdown-admin']);
|
||||
let lastActivitySync = 0;
|
||||
let pendingActivitySync = null;
|
||||
|
||||
function buildUserEntry(socket) {
|
||||
function extractSocketIp(socket) {
|
||||
if (!socket) return null;
|
||||
const headers = socket.handshake?.headers || {};
|
||||
const forwardedFor = headers['x-forwarded-for'];
|
||||
if (typeof forwardedFor === 'string' && forwardedFor.trim()) {
|
||||
return forwardedFor.split(',')[0].trim();
|
||||
}
|
||||
if (Array.isArray(forwardedFor) && forwardedFor.length) {
|
||||
return String(forwardedFor[0]).trim();
|
||||
}
|
||||
const realIp = headers['x-real-ip'];
|
||||
if (typeof realIp === 'string' && realIp.trim()) {
|
||||
return realIp.trim();
|
||||
}
|
||||
return (
|
||||
socket.handshake?.address ||
|
||||
socket.conn?.remoteAddress ||
|
||||
socket.request?.connection?.remoteAddress ||
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
function buildUserEntry(socket, includeIp = false) {
|
||||
if (!socket) return null;
|
||||
const role = getRole(socket);
|
||||
const assignment = assignmentService.describeAssignment(socket.id);
|
||||
@@ -35,12 +58,14 @@ function buildUserEntry(socket) {
|
||||
nickname: getNickname(socket) || null,
|
||||
role,
|
||||
roverId: primaryRover || assignment?.roverId || null,
|
||||
ip: includeIp ? extractSocketIp(socket) : null,
|
||||
};
|
||||
}
|
||||
|
||||
function buildSession(socket) {
|
||||
const includeIps = ADMIN_ROLES.has(getRole(socket));
|
||||
const users = Array.from(io.sockets.sockets.values())
|
||||
.map((sock) => buildUserEntry(sock))
|
||||
.map((sock) => buildUserEntry(sock, includeIps))
|
||||
.filter(Boolean);
|
||||
return {
|
||||
socketId: socket?.id || null,
|
||||
|
||||
Reference in New Issue
Block a user