Здравствуйте друзья! Был вечер, делать было нечего.
Рассматривая пример чата в Socket.IO, я заинтересовался возможностями сделать чат приватным без особых ухищрений.
Идея не нова и довольно проста – вы выбираете свой пол и возраст, указываете желаемый пол и возраст собеседника, и вперед! Своеобразная рулетка.
Итак, начнем с требований:
- Форма заявки – с указанием пола и возраста (как для себя, так и для собеседника);
- Возможность создания приватных комнат (при отсутствии подходящего собеседника);
- Подключение к приватной комнате (при наличии собеседника);
- Анонимность (мы не сохраняем никакие пользовательские данные).
Что нам нужно?
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
-
Как Удалить Вирус-Червь С Компьютера
19 Oct, 24 -
Настройка Let`s Encrypt В Microsoft Azure
19 Oct, 24 -
Как Украсть Миллион?
19 Oct, 24 -
Mein Config: Обзор Точечных Файлов
19 Oct, 24 -
Я Даю Тебе Идею
19 Oct, 24 -
Форма Входа На Хабр
19 Oct, 24