From 4c63be54eab75f69b5616868e855be51e97b793c Mon Sep 17 00:00:00 2001 From: notnull Date: Tue, 23 Jul 2019 14:44:34 -0400 Subject: [PATCH] added namespaces --- server/socket/index.js | 66 +++++++++++------------ src/App.js | 120 ++++++++++++++++++++--------------------- 2 files changed, 89 insertions(+), 97 deletions(-) diff --git a/server/socket/index.js b/server/socket/index.js index c55b79b..ac0ec70 100644 --- a/server/socket/index.js +++ b/server/socket/index.js @@ -2,64 +2,62 @@ module.exports = io => { io.on('connection', async socket => { console.log(`A socket connection to the server has been made: ${socket.id}`) socket.join('#chat', () => { - socket.emit('get my rooms', socket.rooms) + sendAllRooms() + sendAllUsers() }) socket.on('message', message => { - io.to(message.room).emit(message) + console.log(`send a message to room ${message.room}: ${message}`) + io.of(message.room).emit('message', message) }) socket.on('get all users', () => { console.log('get all users') - console.log(Object.keys(io.sockets.sockets)) - }) - - socket.on('get all rooms', () => { - console.log('get all rooms') - console.log( - Object.keys(io.sockets.adapter.rooms) - .filter(r => r[0] === '#') - .map(k => ({ - roomName: k, - sockets: Object.keys(io.sockets.adapter.rooms[k]['sockets']), - })) - ) + sendAllUsers() }) socket.on('get my rooms', () => { console.log('get my rooms') - console.log(Object.keys(socket.rooms)) + sendAllRooms() }) - socket.on('join a room', roomName => { - console.log('join a room') + socket.on('join', roomName => { + console.log('join:', roomName) socket.join(roomName, () => { - socket.emit('get my rooms') + sendAllRooms() }) }) - socket.on('leave a room', () => { - console.log('leave a room') + socket.on('part', () => { + console.log('part') }) - socket.on('join', payload => { - console.log(payload.room) - socket.join({ room: payload.room }, () => { - socket.emit('got user rooms', Object.keys(socket.rooms)) + socket.on('get all rooms', () => sendAllRooms()) + socket.on('send all clients', () => { + // https://socket.io/docs/server-api/#namespace-clients-callback + io.clients((error, clients) => { + if (error) throw error + console.log(clients) }) }) + + const sendAllRooms = () => { + console.log('get all rooms') + const allRooms = Object.keys(io.sockets.adapter.rooms) + .filter(r => r[0] === '#') + .map(k => ({ + roomName: k, + sockets: Object.keys(io.sockets.adapter.rooms[k]['sockets']), + })) + io.emit('got all rooms', allRooms) + } + + const sendAllUsers = () => + socket.emit('got all users', Object.keys(io.sockets.sockets)) + socket.on('disconnect', async () => { io.emit('user disconnected', { socketId: socket.id }) console.log(`${socket.id} has disconnected.`) - io.emit( - 'received rooms', - Object.keys(io.sockets.adapter.rooms) - .filter(r => r[0] === '#') - .map(k => ({ - roomName: k, - sockets: Object.keys(io.sockets.adapter.rooms[k]['sockets']), - })) - ) }) }) } diff --git a/src/App.js b/src/App.js index 6a9230c..e62b529 100644 --- a/src/App.js +++ b/src/App.js @@ -1,7 +1,7 @@ import React from 'react' import socket from './socket' -import { Navbar, Nav, Dropdown, DropdownButton, Button } from 'react-bootstrap' +import { Navbar, Nav, Dropdown, Button } from 'react-bootstrap' import uuid from 'uuid' import moment from 'moment' @@ -10,9 +10,8 @@ const initialState = { messages: [], message: '', allRooms: [], - myRooms: [], room: '/', - users: [], + allUsers: [], user: {}, } @@ -23,7 +22,7 @@ class App extends React.Component { this.socket = socket this.handleChange = this.handleChange.bind(this) this.handleSubmit = this.handleSubmit.bind(this) - this.joinRoom = this.joinRoom.bind(this) + this.join = this.join.bind(this) } async fetchData() { @@ -32,9 +31,11 @@ class App extends React.Component { componentDidMount() { this.fetchData() - this.socket.on('message', msg => { - const messages = this.state.messages.concat(msg) - this.setState({ messages }) + this.socket.on('connect', () => { + console.log('connected!') + this.socket.emit('get all rooms') + const user = { socketId: this.socket.id } + this.setState({ user }) }) this.socket.on('user connected', payload => { @@ -45,14 +46,19 @@ class App extends React.Component { console.log('a user disconnected.', payload) }) - this.socket.on('received rooms', rooms => { - console.log(rooms) - this.setState({ rooms }) + this.socket.on('got all rooms', allRooms => { + console.log('got all rooms:', allRooms) + this.setState({ allRooms }) }) - this.socket.on('get user rooms', roomArray => { - const myRooms = roomArray.filter(roomString => roomString[0] === '#') - this.setState({ myRooms }) + this.socket.on('got all users', allUsers => { + console.log('got all users:', allUsers) + this.setState({ allUsers }) + }) + + this.socket.on('message', msg => { + const messages = this.state.messages.concat(msg) + this.setState({ messages }) }) } @@ -60,8 +66,18 @@ class App extends React.Component { this.setState({ [e.target.name]: e.target.value }) } + parseCommand() { + const args = this.state.message.split(' ') + const cmd = args[0].slice(1) + console.log('command:', cmd) + if (cmd === 'join') this.socket.emit('join', args[1]) + this.setState({ message: '' }) + } handleSubmit(e) { e.preventDefault() + + if (this.state.message[0] === '/') return this.parseCommand() + const message = { id: uuid(), date: moment().format('MMMM D YYYY, h:mm a'), @@ -79,8 +95,8 @@ class App extends React.Component { renderError() { return
something went wrong.
} - joinRoom(room) { - this.socket.emit('join', { room }) + join(room) { + this.socket.emit('join', room) } sendMessage(msg) { this.socket.emit('message', msg) @@ -99,9 +115,9 @@ class App extends React.Component { - {this.state.users.map(r => ( + {this.state.allUsers.map(u => ( - {r.roomName} + {u} ))} @@ -113,37 +129,16 @@ class App extends React.Component { {this.state.allRooms.map(r => ( - + this.joinRoom(r.roomName)} + > {r.roomName} ))} - - - @@ -154,37 +149,36 @@ class App extends React.Component { id="sidebar2" >
User Channels
-

this currently shows all channels

- {this.state.myRooms.map(r => ( - - ))} + {this.state.allRooms + .filter(r => r.sockets.includes(this.state.user.socketId)) + .map(r => ( + + ))} {/*Main Section*/}
{/*Main Section Header*/}
-

current channel

+

Channel: {this.state.room}

{/*Main Section Content*/}
- {this.state.messages - .filter(m => m.room === this.state.room) - .map(m => ( -
-
{m.date}
-
{m.socketId}
-
{m.text}
-
- ))} + {this.state.messages.map(m => ( +
+
{m.date}
+
{m.socketId}
+
{m.text}
+
+ ))}