Spaces:
Sleeping
Sleeping
rename
Browse files- src/handlers/MessageHandler.ts +44 -0
- src/services/RoomManager.ts +20 -0
- src/types.ts +1 -0
src/handlers/MessageHandler.ts
CHANGED
|
@@ -30,6 +30,8 @@ export class MessageHandler {
|
|
| 30 |
}
|
| 31 |
|
| 32 |
const { room_id, username, message } = parsedData
|
|
|
|
|
|
|
| 33 |
// Normalize action to ensure case-insensitivity matches logic
|
| 34 |
const action = parsedData.action.toLowerCase()
|
| 35 |
|
|
@@ -64,6 +66,48 @@ export class MessageHandler {
|
|
| 64 |
}
|
| 65 |
break
|
| 66 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
case SocketAction.MESSAGE:
|
| 68 |
roomManager.broadcast(
|
| 69 |
room_id,
|
|
|
|
| 30 |
}
|
| 31 |
|
| 32 |
const { room_id, username, message } = parsedData
|
| 33 |
+
let { new_username } = parsedData
|
| 34 |
+
if (!new_username) new_username = username
|
| 35 |
// Normalize action to ensure case-insensitivity matches logic
|
| 36 |
const action = parsedData.action.toLowerCase()
|
| 37 |
|
|
|
|
| 66 |
}
|
| 67 |
break
|
| 68 |
|
| 69 |
+
case SocketAction.RENAME: {
|
| 70 |
+
if (!new_username || new_username === username) {
|
| 71 |
+
socket.send(
|
| 72 |
+
JSON.stringify({
|
| 73 |
+
error: 'Invalid new username',
|
| 74 |
+
status: 0,
|
| 75 |
+
})
|
| 76 |
+
)
|
| 77 |
+
return
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
const renamed = roomManager.renameUser(
|
| 81 |
+
room_id,
|
| 82 |
+
username,
|
| 83 |
+
new_username,
|
| 84 |
+
socket
|
| 85 |
+
)
|
| 86 |
+
|
| 87 |
+
if (!renamed) {
|
| 88 |
+
socket.send(
|
| 89 |
+
JSON.stringify({
|
| 90 |
+
error: 'Username rename failed',
|
| 91 |
+
status: 0,
|
| 92 |
+
})
|
| 93 |
+
)
|
| 94 |
+
return
|
| 95 |
+
}
|
| 96 |
+
|
| 97 |
+
roomManager.broadcast(
|
| 98 |
+
room_id,
|
| 99 |
+
JSON.stringify({
|
| 100 |
+
message: `${username} is now known as ${new_username}`,
|
| 101 |
+
username: new_username,
|
| 102 |
+
old_username: username,
|
| 103 |
+
room_id,
|
| 104 |
+
action: 'rename',
|
| 105 |
+
status: 1,
|
| 106 |
+
})
|
| 107 |
+
)
|
| 108 |
+
break
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
case SocketAction.MESSAGE:
|
| 112 |
roomManager.broadcast(
|
| 113 |
room_id,
|
src/services/RoomManager.ts
CHANGED
|
@@ -19,6 +19,26 @@ export class RoomManager {
|
|
| 19 |
this.rooms.get(roomId)?.set(username, socket)
|
| 20 |
}
|
| 21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
/**
|
| 23 |
* Removes a user from a room.
|
| 24 |
* Cleans up the room if it becomes empty.
|
|
|
|
| 19 |
this.rooms.get(roomId)?.set(username, socket)
|
| 20 |
}
|
| 21 |
|
| 22 |
+
renameUser(
|
| 23 |
+
roomId: string,
|
| 24 |
+
username: string,
|
| 25 |
+
newUsername: string,
|
| 26 |
+
socket: WebSocket
|
| 27 |
+
): boolean {
|
| 28 |
+
const room = this.rooms.get(roomId)
|
| 29 |
+
if (!room) return false
|
| 30 |
+
|
| 31 |
+
if (!room.has(username)) return false
|
| 32 |
+
if (room.has(newUsername)) return false
|
| 33 |
+
|
| 34 |
+
// Remove old username
|
| 35 |
+
room.delete(username)
|
| 36 |
+
|
| 37 |
+
// Add new username with same socket
|
| 38 |
+
room.set(newUsername, socket)
|
| 39 |
+
return true
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
/**
|
| 43 |
* Removes a user from a room.
|
| 44 |
* Cleans up the room if it becomes empty.
|
src/types.ts
CHANGED
|
@@ -2,6 +2,7 @@ export enum SocketAction {
|
|
| 2 |
JOIN = 'join',
|
| 3 |
LEAVE = 'leave',
|
| 4 |
MESSAGE = 'message',
|
|
|
|
| 5 |
}
|
| 6 |
|
| 7 |
export interface WebSocketMessage {
|
|
|
|
| 2 |
JOIN = 'join',
|
| 3 |
LEAVE = 'leave',
|
| 4 |
MESSAGE = 'message',
|
| 5 |
+
RENAME = 'rename',
|
| 6 |
}
|
| 7 |
|
| 8 |
export interface WebSocketMessage {
|