A
A
Alexey2017-12-21 20:57:04
Socket.io
Alexey, 2017-12-21 20:57:04

Proper use of rooms and state synchronization?

Help solve the problem of implementing rooms in a socket.
What data is there:
user_id - unique user ID in the database (authorization)
team_id - unique team
ID leader_id (aka user_id) - team leader
When connecting, the socket checks authorization and if it finds that the user is in any team in the database, then pushes it to teamroom_[team_id].
So, the main question is how to implement the logic at all, that if the leader decided to kick the user out of the team, the socket could also kick him out of this room (taking into account if the user works in several tabs, which means different ids when connecting).
Is it possible to do this without creating a global array in the node itself, because for now my idea is to only store the keys as a binding to the user_id. More or less like this

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);
  });
});

This is a release when connected, and now if the team leader decided to kick
//тут тоже самое с проверкой, опущу детали
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);
  };
}

I hope the question is clear.

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question