コードレビューを受けて修正しました。
コードレビュー以降に変更した部分は以下です。
- 取得したroom名からスラッシュをとる(正規表現)
- clientがどのroomにもjoinしていないときは、全員に送信するようにする
- 切断時の処理
- clientが複数roomにjoinできないようにする
room = room.replace(/\//, '');
- 「/」を「/」に置換する
- Javascriptの正規表現は奥が深そうでした。ちゃんと調べます。
//clientがデフォルト以外のどのroomにもjoinしていないときは、全員に送信
if(!roomsn[1] && roomsn[0] ===''){
io.sockets.emit('msg push', {name: msg.name, text: msg.text});
}
socket.on('disconnect', function(){
//接続人数を-1して送信
count--;
io.sockets.emit('count', count);
//clientが接続しているroom名を取得
var rooms = io.sockets.manager.roomClients[socket.id];
//keyを取り出す
var roomsn = Object.keys(rooms);
roomsn.forEach(function(room){
if(room !==''){
//スラッシュをとる
room = room.replace(/\//,'');
//人数を-1
roomList[room]--;
//人数が0人以下になったらroomListから削除
if(roomList[room] <= 0){
delete roomList[room];
}
}
});
//roomListの更新
io.sockets.emit('roomList', roomList);
});
- clientが接続しているroom名を取得→keyを取り出す→空でなければスラッシュをとる→そのroomの人数を-1
- 人数を-1して0以下になったらroomListから削除
socket.on("enter", function(rname){
//clientがjoinしているroom名を取得する
var rooms = io.sockets.manager.roomClients[socket.id];
//keyを取り出す
var roomsn = Object.keys(rooms);
roomsn.forEach(function(room){
//default('')以外に空でないroomsn要素があるとき
if(roomsn[1] && room !==''){
//スラッシュをとる
room = room.replace(/\//, '');
//そのroomから退室する
socket.leave(room);
roomList[room]--;
//人数が0人以下になったらroomListから削除
if(roomList[room] <= 0){
delete roomList[room];
}
}
});
//roomListを確認(略)
//roomにjoin(略)
//roomListを更新(略)
});
- 3の切断とほぼ同じ処理。
作ってみました!
https://github.com/tokunami/chat-sample