Приватный Чат На Node.js — Что Может Быть Проще?

Здравствуйте друзья! Был вечер, делать было нечего.

Рассматривая пример чата в Socket.IO, я заинтересовался возможностями сделать чат приватным без особых ухищрений.

Идея не нова и довольно проста – вы выбираете свой пол и возраст, указываете желаемый пол и возраст собеседника, и вперед! Своеобразная рулетка.

Итак, начнем с требований:

  1. Форма заявки – с указанием пола и возраста (как для себя, так и для собеседника);
  2. Возможность создания приватных комнат (при отсутствии подходящего собеседника);
  3. Подключение к приватной комнате (при наличии собеседника);
  4. Анонимность (мы не сохраняем никакие пользовательские данные).



Что нам нужно?

Node.JS (0.6.14 на момент написания) с модулями Express и Socket.io. Дополнительно используются перо, стилус, i18n и утилита.

Итак, начнем.



Подключение нового пользователя

Здесь все довольно просто.

Мы создаем объект пользователя, увеличиваем счетчики и обновляем номера клиентов.

  
  
  
   

var user = {}; var uid = socket.store.id; var room_id = uid + "_room"; online++; total++; socket.broadcast.emit('online', total, free); socket.emit('online', total, free); user.id = socket.store.id; users[socket.store.id] = user;



Логин пользователя

Под входом мы подразумеваем вход в сам чат – после выбора необходимых параметров на начальной форме.

Сам механизм выбора собеседника реализован в виде простого цикла (не знаю, насколько быстро он будет работать при большой нагрузке).

Проверяем введенные параметры, сравниваем их и, если они совпадают, инициируем подключение к другому пользователю или оставляем ждать.



socket.on('nickname', function (nick, m_sex, m_age, c_sex, c_age, fn) { if (nicknames[socket.user_id]) { fn(true); } else { fn(false); nicknames[socket.store.id] = socket.nickname = socket.store.id; socket.user_id = socket.store.id; socket.gender = m_sex; var user = users[socket.store.id]; user.m_sex = m_sex; user.m_age = m_age; user.c_sex = c_sex; user.c_age = c_age; user.active = 0; free++; // Check existing rooms for(var __room in rooms){ if(user.active == 0){ _room = rooms[__room]; if(_room.c_sex == m_sex && _room.c_age == m_age && _room.m_sex == c_sex && _room.m_age == c_age && _room.active == 0){ room_id = _room.id; _room.active = 1; _room.nicknames[socket.user_id] = socket.user_id; user.active = 1 free--; console.log(' room finded! this - ' + room_id); } } } // Create own room if(user.active == 0){ console.log(' no room finded :( create own - ' + room_id); var room = {}; room.id = room_id; room.m_sex = m_sex; room.m_age = m_age; room.c_sex = c_sex; room.c_age = c_age; room.active = 0 room.nicknames = {}; room.nicknames[socket.user_id] = socket.user_id; rooms[room_id] = room; socket.emit("user message", "System", i18n.__("waiting")); } users[socket.store.id] = user; socket.join(room_id); socket.broadcast.to(room_id).

emit('announcement', socket.user_id + ' ' + i18n.__('connected')); socket.broadcast.to(room_id).

emit('nicknames', rooms[room_id].

nicknames); socket.emit('nicknames', rooms[room_id].

nicknames); } });

Все, что осталось сделать, это фактически позволить пользователям общаться друг с другом.



Отправка сообщений



socket.on('user message', function (msg) { msg = sanitize(msg).

entityEncode(); console.log(' message from ' + socket.user_id + ' to room ' + room_id + ": " + msg); socket.broadcast.to(room_id).

emit('user message', socket.gender == 1 ? i18n.__("he") : i18n.__("she") , msg); });

А на самом деле.



Выход



socket.on('disconnect', function () { online--; total--; socket.broadcast.emit('online', total, free); if (!socket.user_id) return; if(free > 0) free--; socket.broadcast.emit('online', total, free); console.log(socket.user_id); socket.leave(room_id); socket.broadcast.to(room_id).

emit('announcement', socket.user_id + ' ' + i18n.__('disconnected')); if(rooms[room_id]) delete rooms[room_id].

nicknames[socket.user_id]; if(rooms[room_id]) socket.broadcast.to(room_id).

emit('nicknames', rooms[room_id].

nicknames); delete users[socket.user_id]; delete nicknames[socket.user_id]; delete rooms[room_id]; });

Вот и все.

Протестировано под нагрузкой <10 people, no problems arose :) If the community is interested in the project of such a chat, I’ll post it on github today, it was done just for fun. P.S. Тема написана давно и перенесена из черновиков - поэтому версии указанных продуктов могут быть не актуальными.

P.S.S. Посмотреть в прямом эфире можно здесь - вирт.ин УПД.

Обещанные исходники здесь - github.com/eudj1n/virtin Теги: #node.js #Socket.io #коммуникация #Социальные сети #JavaScript #node.js

Вместе с данным постом часто просматривают: