File size: 4,630 Bytes
a7476ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7eec780
a7476ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7eec780
3a72b90
7eec780
 
3a72b90
 
 
 
7eec780
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a72b90
 
 
 
7eec780
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a7476ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import WebSocket from 'ws'
import { RoomManager } from '../services/RoomManager.js'
import { SocketAction } from '../types.js'

export class MessageHandler {
    static handle(
        rawMessage: string,
        socket: WebSocket,
        roomManager: RoomManager
    ): void {
        let parsedData: any

        try {
            parsedData = JSON.parse(rawMessage)
        } catch (error) {
            console.error('Error parsing JSON:', error)
            socket.send(JSON.stringify({ error: 'Invalid JSON', status: 0 }))
            return
        }

        // Basic validation to ensure required fields exist
        if (!parsedData.room_id || !parsedData.username || !parsedData.action) {
            socket.send(
                JSON.stringify({
                    error: 'Missing fields: room_id, username, or action',
                    status: 0,
                })
            )
            return
        }

        const { room_id, username, message } = parsedData
        let { new_username } = parsedData
        // Normalize action to ensure case-insensitivity matches logic
        const action = parsedData.action.toLowerCase()

        switch (action) {
            case SocketAction.JOIN:
                roomManager.joinRoom(room_id, username, socket)
                roomManager.broadcast(
                    room_id,
                    JSON.stringify({
                        message: `${username} has joined the ${room_id} chat!`,
                        username: `${username}`,
                        room_id: `${room_id}`,
                        action: `join`,
                        status: 1,
                    })
                )
                break

            case SocketAction.LEAVE:
                const clientLeft = roomManager.leaveRoom(room_id, username)
                if (clientLeft) {
                    roomManager.broadcast(
                        room_id,
                        JSON.stringify({
                            message: `${username} has left the ${room_id} chat!`,
                            username: `${username}`,
                            room_id: `${room_id}`,
                            action: `leave`,
                            status: 1,
                        })
                    )
                }
                break

            case SocketAction.RENAME: {
                if (!new_username) {
                    socket.send(
                        JSON.stringify({
                            message: `somebody tried to steal ${new_username}!`,
                            username: username,
                            room_id,
                            action: 'rename',
                            status: 0,
                        })
                    )
                    return
                }

                const renamed = roomManager.renameUser(
                    room_id,
                    username,
                    new_username,
                    socket
                )

                if (!renamed) {
                    socket.send(
                        JSON.stringify({
                            message: `somebody tried to steal ${new_username}!`,
                            username: username,
                            room_id,
                            action: 'rename',
                            status: 0,
                        })
                    )
                    return
                }

                roomManager.broadcast(
                    room_id,
                    JSON.stringify({
                        message: `${username} is now known as ${new_username}`,
                        username: new_username,
                        old_username: username,
                        room_id,
                        action: 'rename',
                        status: 1,
                    })
                )
                break
            }

            case SocketAction.MESSAGE:
                roomManager.broadcast(
                    room_id,
                    JSON.stringify({
                        message: `${message}`,
                        username: `${username}`,
                        room_id: `${room_id}`,
                        action: `message`,
                        status: 1,
                    })
                )
                break

            default:
                socket.send(
                    JSON.stringify({
                        error: `Unknown action: ${action}`,
                        status: 0,
                    })
                )
                break
        }
    }
}