diff --git a/src/client/index.html b/src/client/index.html new file mode 100644 index 000000000..ec03b8d1b --- /dev/null +++ b/src/client/index.html @@ -0,0 +1,23 @@ + + +
+ + +${msg.author}: ${msg.text} (${msg.time})
`, + ) + .join(''); + } else if (data.type === 'message') { + document.getElementById('messages').innerHTML += + `${data.message.author}: ${data.message.text} (${data.message.time})
`; + } else if (data.type === 'deleted') { + alert('Room deleted!'); + location.reload(); + } +}; + +function joinRoom() { + username = document.getElementById('username').value; + room = document.getElementById('room').value; + + if (!username || !room) { + return alert('Enter username and room name'); + } + + ws.send(JSON.stringify({ type: 'join', username, room })); + document.getElementById('chat').style.display = 'block'; + document.getElementById('roomTitle').innerText = `Room: ${room}`; +} + +function sendMessage() { + const message = document.getElementById('messageInput').value; + + if (!message) { + return; + } + + ws.send( + JSON.stringify({ + type: 'message', + username, + room, + text: message, + }), + ); + document.getElementById('messageInput').value = ''; +} + +window.joinRoom = joinRoom; +window.sendMessage = sendMessage; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index ad9a93a7c..000000000 --- a/src/index.js +++ /dev/null @@ -1 +0,0 @@ -'use strict'; diff --git a/src/server/index.js b/src/server/index.js new file mode 100644 index 000000000..451eb02b1 --- /dev/null +++ b/src/server/index.js @@ -0,0 +1,77 @@ +/* eslint-disable no-console */ +'use strict'; +import express from 'express'; +import { WebSocketServer } from 'ws'; +import cors from 'cors'; +import dotenv from 'dotenv'; +import { + createRoom, + renameRoom, + deleteRoom, + addMessage, + getMessages, +} from './rooms.js'; + +dotenv.config(); + +const app = express(); +const PORT = process.env.PORT || 5000; + +app.use(cors()); +app.use(express.json()); + +const server = app.listen(PORT); +// , () => +// console.log(`Server running on http://localhost:${PORT}`),); + +const wss = new WebSocketServer({ server }); + +wss.on('connection', (ws) => { + console.log(`New connection`); + + ws.on('message', (data) => { + const { type, username, room, text, newRoom } = JSON.parse(data); + + if (type === 'join') { + ws.room = room; + createRoom(room); + ws.send(JSON.stringify({ type: 'history', messages: getMessages(room) })); + } + + if (type === 'message' && ws.room) { + const message = { + author: username, + time: new Date().toLocaleTimeString(), + text, + }; + + addMessage(ws.room, message); + + wss.clients.forEach((client) => { + if (client.readyState === 1 && client.room === ws.room) { + client.send(JSON.stringify({ type: 'message', message })); + } + }); + } + + if (type === 'create') { + createRoom(room); + } + + if (type === 'rename') { + renameRoom(room, newRoom); + } + + if (type === 'delete') { + deleteRoom(room); + + wss.clients.forEach((client) => { + if (client.room === room) { + client.send(JSON.stringify({ type: 'deleted' })); + } + }); + } + }); + + ws.on('close', () => console.log(`User disconnected`)); +}); diff --git a/src/server/rooms.js b/src/server/rooms.js new file mode 100644 index 000000000..b976c7716 --- /dev/null +++ b/src/server/rooms.js @@ -0,0 +1,30 @@ +const rooms = {}; // { roomName: [{ author, time, text }] } + +const createRoom = (room) => { + if (!rooms[room]) { + rooms[room] = []; + } +}; + +const renameRoom = (oldRoom, newRoom) => { + if (rooms[oldRoom]) { + rooms[newRoom] = [...rooms[oldRoom]]; + delete rooms[oldRoom]; + } +}; + +const deleteRoom = (room) => { + delete rooms[room]; +}; + +const addMessage = (room, message) => { + if (rooms[room]) { + rooms[room].push(message); + } +}; + +const getMessages = (room) => { + return rooms[room] || []; +}; + +export { createRoom, renameRoom, deleteRoom, addMessage, getMessages };