0

I am trying to adapt a piece of code that was coded with socket.io 0.9 that returns a list of clients in a specific room and list of rooms(typical chat-room example)

Users in room

var usersInRoom = io.sockets.clients(room);

List of rooms

socket.on('rooms', function() {
  var tmp = io.sockets.manager.rooms;
  socket.emit('rooms', tmp);
});

tmp looks like this

{
    0: Array[1],
    1: /Lobby: Array[1]
}

So I can show the list in the client with this javascript run on the browser.

socket.on('rooms', function(rooms) {
    $('#room-list').empty();
    debugger;
    for(var room in rooms) {
        room = room.substring(1, room.length);
        if (room != '') {
            $('#room-list').append(divEscapedContentElement(room));
        }
    }

    $('#room-list div').click(function() {
        chatApp.processCommand('/join ' + $(this).text());
        $('#send-message').focus();
    });
});

But for version >1.x I just found the clients/rooms changed. Following some links I found here, I could manage to get a list of rooms by doing this:

socket.on('rooms', function(){
    var tmp = socket.rooms;
    socket.emit('rooms', tmp);
});

The problem here is that socket.rooms returns

{
    0: "RandomString",
    1: "Lobby",
    length: 2
}

And I just need to pass the 'Lobby' room. I don't know from where the random string come from.

EDIT Through some debugging I discovered, the randomstring is the socket.id ... Is it normal this behavior? Returning the room and the socket.id together?

Updated

I finally got some results

Users in room

var usersInRoom = getUsersByRoom('/', room);

function getUsersByRoom(nsp, room) {
    var users = []
    for (var id in io.of(nsp).adapter.rooms[room]) {
        users.push(io.of(nsp).adapter.nsp.connected[id]);
    };
    return users;
};

List of rooms

function getRooms(io){
    var allRooms = io.sockets.adapter.rooms;
    var allClients = io.engine.clients;
    var result = [];
    for(var room in allRooms){
        // check the value is not a 'client-socket-id' but a room's name
        if(!allClients.hasOwnProperty(room)){
            result.push(room);
        }
    }
    return result;
}

Better and more straightforward ways to achieve the results?

These are the links I checked:

How to get room's clients list in socket.io 1.0

socket.io get rooms which socket is currently in

Community
  • 1
  • 1
blfuentes
  • 2,731
  • 5
  • 44
  • 72

1 Answers1

0

It seems there is no better approach, so I will use my own answer. In case any of you has a better solution, I would update the accepted one.

Users in room

var usersInRoom = getUsersByRoom('/', room);

function getUsersByRoom(nsp, room) {
    var users = []
    for (var id in io.of(nsp).adapter.rooms[room]) {
        users.push(io.of(nsp).adapter.nsp.connected[id]);
    };
    return users;
};

List of rooms

function getRooms(io){
    var allRooms = io.sockets.adapter.rooms;
    var allClients = io.engine.clients;
    var result = [];
    for(var room in allRooms){
        // check the value is not a 'client-socket-id' but a room's name
        if(!allClients.hasOwnProperty(room)){
            result.push(room);
        }
    }
    return result;
}
blfuentes
  • 2,731
  • 5
  • 44
  • 72