@Azperin
Дилетант

Правильное использование комнат и синхронизация состояния?

Помогите решить задачу по реализации комнат в сокетио.
Какие данные есть:
user_id - уникальный ид юзера в базе (авторизация)
team_id - уникальный ид команды
leader_id (он же user_id) - лидер команды

При коннекте, сокет чекает авторизацию и если находит в базе что пользователь в какой-либо команде, то запихивает его в комнату teamroom_[team_id].

Дак вот, основной вопрос, как можно вообще реализовать логику, что если лидер решил выкинуть пользователя из команды, сокетио тоже смог кикнуть его из этой румы (при учете если допустим пользователь работает в несколько вкладок, что означает разные ид при коннекте).

Можно ли это сделать без создания глобального массива в самой ноде, потому что пока у меня идея только хранить ключи как привязка к юзер_ид. Примерно так

var globalUsers = [];
//выглядеть он будет как

io.sockets.on('connection', function(socket) {
  //получили всю инфу о пользователе и имеет такие параметры
  var user_id = 2;
  var team_id = 8;
  var teamlead = false;
  var currentSocketid = 'Dsakdoqwd8' //не помню как там правильно получить, но вы поняли, это ид текущего подключения
  if (team_id > 0) {
   //сама проверка для тимы сейчас не важна, 
     socket.join('team'+team_id);
  };
  //засовываем его и подключение в глобальный массив
  if (globalUsers.indexOf('user'+user_id) === -1) {
    //если такого user_id в массиве еще ниразу небыло, то создаем
    globalUsers.push('user'+user_id);
    //и засовываем текущее подключение
    globalUsers['user'+user_id].uids.push(currentSocketid);
  } else {
    //если нашли, то сразу пихаем
   globalUsers['user'+user_id].uids.push(currentSocketid);
  };
  socket.on('disconnect', function () {
  //тут, если были валидные юзер_ид и тим_ид, сплайсом убираем из массива
   var connectionIndex = globalUsers['user'+user_id].indexOf(currentSocketid);
  globalUsers['user'+user_id].splice(connectionIndex,1);
  });
});


Это релизация при подключении, а теперь если тимлид решил кикнуть

//тут тоже самое с проверкой, опущу детали
socket.on('kickuser', function(user_id) {
  //по такому же принципу, как выше, чекаем ид в глобальном массиве и допустим мы нашли его

  for (var i = 0; i < globalUsers['user'+user_id].length; i++) {
     //тут пока не знаю как правильно сделать лив
     var targetSocketId = globalUsers['user'+user_id].uids[i];
     targetSockeId.leave('team', team_id);
     globalUsers['user'+user_id].uids.splice(i,1);
  };
}


Надеюсь понятен вопрос.
  • Вопрос задан
  • 34 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы