Files
MultiRoombaRover/server/src/services/nicknameService.js
T

53 lines
1.4 KiB
JavaScript

const EventEmitter = require('events');
const io = require('../globals/io');
const logger = require('../globals/logger').child('nicknameService');
const { getRole } = require('./roleService');
const nicknameEvents = new EventEmitter();
function sanitizeNickname(raw) {
if (typeof raw !== 'string') return '';
const trimmed = raw.trim();
if (!trimmed) return '';
const sanitized = trimmed.replace(/\*/g, 'nope');
return sanitized.slice(0, 32);
}
function getNickname(socket) {
return socket?.data?.nickname || '';
}
function setNickname(socket, nickname) {
if (!socket) return null;
const role = getRole(socket);
// if (role === 'spectator') {
// throw new Error('Spectators cannot set nicknames');
// }
const value = sanitizeNickname(nickname);
if (!value) {
throw new Error('Nickname required');
}
socket.data = socket.data || {};
socket.data.nickname = value;
nicknameEvents.emit('change', { socketId: socket.id, nickname: value });
logger.info('Nickname set', { socketId: socket.id, nickname: value });
return value;
}
io.on('connection', (socket) => {
socket.on('nickname:set', ({ nickname } = {}, cb = () => {}) => {
try {
const value = setNickname(socket, nickname);
cb({ success: true, nickname: value });
} catch (err) {
cb({ error: err.message });
}
});
});
module.exports = {
getNickname,
setNickname,
nicknameEvents,
};