Socket.io + node js Rooms Как разделить комнаты на стороне socket.io?
Всем привет, такая проблема, написал чат на socket.io + node js. Разделил на комнаты с помощью обычных проверок в blade. Все комнаты выводятся в site/chats Отдельная комната site/chats/номер_чата Проблема в том, что если любой пользователь будет писать в какой нибудь комнате, выводится будет во-всех комнатах. Все ID чатов и сообщений хранятся в базе, пытался делать проверку на ID, не получается. (Приложил скриншот на проверку которая работает!) + скрин пример поля из базы Но это не решение, т. к это сделано для единственного чата, мы проверили, что если chat_id который мы получаем по классу из блейда будет равняться этому ID чата, то есть 1 к 1, тогда пусть печатает, когда сокет хочет подгрузить это "Печатает..." в другом чате, проверка ему отказывает. И я не знаю как сюда подставлять, я не могу сделать просто chat_id === chat_id иначе будет подгружать из блейда одно и тоже и оно всё ровно везде будет выводить это слово и сообщения. Сижу второй день не могу решить.... Заранее Спасибо!
Серверная часть:
const express = require("express")
const cors = require('cors')
const socket = require("socket.io")
const fs = require("fs")
const https = require('https')
// App setup
const PORT = 8443
const app = express()
app.use(cors())
const server = https.createServer(options, app).listen(PORT);
// Socket setup
const io = socket(server)
io.on('connection', (socket) => {
let addedUser = false;
// когда клиент выдает "новое сообщение", оно прослушивается и выполняется
socket.on('new message', (data) => {
// we tell the client to execute 'new message'
socket.broadcast.emit('new message', {
username: socket.username,
message: data
});
});
// когда клиент выдает команду "Добавить пользователя", он слушает и выполняет
socket.on('add user', (username) => {
if (addedUser) return;
// мы сохраняем имя пользователя в сеансе сокета для этого клиента
socket.username = username;
// Эхо глобально (все клиенты), что человек подключился
socket.broadcast.emit('user joined', {
username: socket.username
});
});
// когда клиент "печатает", мы передаем его другим
socket.on('typing', () => {
socket.broadcast.emit('typing', {
username: socket.username
});
});
// когда клиент издает команду "прекратить печатать", мы передаем ее другим
socket.on('stop typing', () => {
socket.broadcast.emit('stop typing', {
username: socket.username
});
});
// когда пользователь отключается.. выполните это
socket.on('disconnect', () => {
if (addedUser) {
// Эхо глобально, что этот клиент ушел
socket.broadcast.emit('user left', {
username: socket.username
});
}
});
});
Клиентская часть:
$(function() {
var FADE_TIME = 150; // ms
var TYPING_TIMER_LENGTH = 400; // ms
var COLORS = [
'#e21400', '#91580f', '#f8a700', '#f78b00',
'#58dc00', '#287b00', '#a8f07a', '#4ae8c4',
'#3b88eb', '#3824aa', '#a700ff', '#d300e7'
];
// Initialize variables
var $window = $(window);
var $messages = $('.messages'); // Область сообщений
var $userone = $('.userone'); // Область сообщений
var $usertwo = $('.usertwo'); // Область сообщений
var $authId = $('.authId'); // Область сообщений
var $chat_id = $('.chat_id'); // Область сообщений
var $buy_user = $('.buy_user'); // Область сообщений
var $inputMessage = $('.inputMessage'); // Поле ввода сообщения
let $enter = $('.enter');
// Запрос на установку имени пользователя
var username;
var connected = true;
var typing = false;
var lastTypingTime;
var socket = io.connect('https://site:8443');
var chat_id = $chat_id.val();
// Устанавливает имя пользователя клиента
socket.emit('add user', username);
// Для определения ID Чата
var usertwo = $usertwo.val();
var authId = $authId.val();
var userone = $userone.val();
var chat_id = $chat_id.val();
var buy_user = $buy_user.val();
// Отправляет сообщение в чат
const sendMessage = () => {
var message = $inputMessage.val();
// Не допускайте введения разметки в сообщение
message = cleanInput(message);
// если есть непустое сообщение и соединение сокета
if (message) {
// Сохраняем в базу
var request = new XMLHttpRequest();
request.open("GET", "/send?text="+message+"&chat_id="+chat_id+"&buy_user="+buy_user);
request.send();
$inputMessage.val('');
addChatMessage({
username: username,
message: message
});
// скажите серверу, чтобы он выполнил "новое сообщение" и отправил один параметр
socket.emit('new message', message);
}
}
// Зарегистрируйте сообщение
const log = (message, options) => {
var $el = $('<li>').addClass('log').text(message);
addMessageElement($el, options);
}
// Добавляет сообщение визуального чата в список сообщений
const addChatMessage = (data, options) => {
var $messageBodyDiv = $('<span class="messageBody">')
.text(data.message);
var typingClass = data.typing ? 'typing' : '';
var $messageDiv = $('<li class="message"/>')
.data('username', data.username)
.addClass(typingClass)
.append($messageBodyDiv);
addMessageElement($messageDiv, options);
}
// Добавляет визуальное сообщение ввода чата
const addChatTyping = (data) => {
data.typing = true;
data.message = 'Печатает...';
addChatMessage(data);
}
// Удаляет визуальное сообщение ввода чата
const removeChatTyping = (data) => {
getTypingMessages(data).fadeOut(function () {
$(this).remove();
});
}
const addMessageElement = (el, options) => {
var $el = $(el);
// Параметры настройки по умолчанию
if (!options) {
options = {};
}
if (typeof options.fade === 'undefined') {
options.fade = true;
}
if (typeof options.prepend === 'undefined') {
options.prepend = false;
}
// Применить параметры
if (options.fade) {
$el.hide().fadeIn(FADE_TIME);
}
if (options.prepend) {
$messages.prepend($el);
} else {
$messages.append($el);
}
$messages[0].scrollTop = $messages[0].scrollHeight;
}
// Предотвращает вход от необходимости вводят разметки
const cleanInput = (input) => {
return $('<div/>').text(input).html();
}
// Обновляет событие ввода текста
const updateTyping = () => {
if (!typing) {
typing = true;
socket.emit('typing');
}
lastTypingTime = (new Date()).getTime();
}
// Получает сообщения пользователя "X is typing"
const getTypingMessages = (data) => {
return $('.typing.message').filter(function (i) {
return $(this).data('username') === data.username;
});
}
// События клавиатуры
$window.keydown(event => {
// Когда клиент нажимает ENTER на своей клавиатуре
if (event.which === 13) {
sendMessage();
socket.emit('stop typing');
typing = false;
}
});
$enter.click(function() {
sendMessage()
socket.emit('stop typing')
typing = false
})
$inputMessage.on('input', () => {
updateTyping();
});
// Фокус ввода при нажатии на границу ввода сообщения
$inputMessage.click(() => {
$inputMessage.focus();
});
// События сокета
// Всякий раз, когда сервер выдает "новое сообщение", обновляйте тело чата
socket.on('new message', (data) => {
addChatMessage(data);
});
socket.on('user joined', (data) => {
// log('Онлайн');
// addParticipantsMessage(data);
});
// Всякий раз, когда сервер выдает сообщение "пользователь ушел", регистрируйте его в теле чата
socket.on('user left', (data) => {
log(data.username + ' не в чате');
// addParticipantsMessage(data);
removeChatTyping(data);
});
// Всякий раз, когда сервер выдает "typing", покажите сообщение typing
socket.on('typing', (data) => {
addChatTyping(data);
});
// Всякий раз, когда сервер выдает "stop typing", убейте сообщение ввода
socket.on('stop typing', (data) => {
removeChatTyping(data);
});
socket.on('disconnect', () => {
// log('you have been disconnected');
});
});

