mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 09:31:20 -04:00
53 lines
1.4 KiB
JavaScript
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,
|
|
};
|