Я хочу сделать что-то вроде:
var room = io.sockets.in('some super awesome room');
room.on('join', function () {
/* stuff */
});
room.on('leave', function () {
/* stuff */
});
Похоже, это не работает. Возможно ли это?
Чтобы проиллюстрировать желаемое поведение:
io.sockets.on('connection', function (socket) {
socket.join('some super awesome room'); // should fire the above 'join' event
});
Недавно обеспокоенный с той же проблемой. Код ниже должен быть ответом на то, что Вы ищете. Это не может быть самое изящное решение, но работы.
выгода вместо того, чтобы использовать socket.join("something")
, необходимо использовать что-то вроде этого this.roomHandler.room(socket,"room1","join")
.
class myserver{
constructor(){
this.io = require('socket.io')(85);
this.io.on('connection', (socket) => {
console.log("New User")
this.roomHandler.room(socket,"room1","join")
this.roomHandler.room(socket,"room2","join")
//this.roomHandler.room(socket,"room3","join")
this.roomHandler.room(socket,"room3","leave")
console.log("---")
console.log(this.roomHandler.roomsOfUser)
socket.on('disconnect', (reason) => {
this.roomHandler.disconnect(socket, reason)
console.log(this.roomHandler.roomsOfUser)
})
})
//Room Event Handler Definition
this.roomHandler = {
disconnect:(socket, reason)=>{
if(this.roomHandler.roomsOfUser[socket.id]){
this.roomHandler.roomsOfUser[socket.id].forEach(room => {
this.roomHandler.room(socket, room, "disconnect")
})
delete this.roomHandler.roomsOfUser[socket.id];
}
},
roomEvents : {},
roomsOfUser: {},
room:(socket,room,action)=>{//Join Or Leave
if(typeof socket == "object" && typeof socket.join == "function"){
if(typeof room=="string"){
//Room Join
if(action=="join"){
socket.join(room)
this.roomHandler.roomOn(room,"join",socket)
//Create, append room collection for user
if(this.roomHandler.roomsOfUser[socket.id]){
this.roomHandler.roomsOfUser[socket.id].push(room)
}else{
this.roomHandler.roomsOfUser[socket.id] = [room]
}
//Room Leave
}else if(action == "leave"){
if(this.roomHandler.roomsOfUser[socket.id][room]){//Really in the room?
socket.leave(room)
this.roomHandler.roomOn(room,"leave", socket)
}
//User Disconnected
}else if(action == "disconnect"){
this.roomHandler.roomOn(room,"leave", socket)
}else{
console.log("Undefined room action.")
}
}else{ console.log("Unqualified name for room."); }
}else{ console.error("Not a legit socket object",socket); socket.join("aaa") }
},
roomOn:(room, event, socket)=>{
if (typeof this.roomHandler.roomEvents[room] == "function"){
this.roomHandler.roomEvents[room](event,socket)
}else{
console.log(`No event found for ${room}`, this.roomHandler.roomEvents)
}
},
roomRegister:(room,callback)=>{
if (typeof room == "string" && typeof callback == "function") {
console.log(`Callback registered for ${room}`)
this.roomHandler.roomEvents[room] = callback
}else{
console.log("Room name or callback is invalid.")
}
}
}
//END OF HANDLER
//Register Functions for room events.
this.roomHandler.roomRegister("room1",(event,socket)=>{
console.log(`${event} for room1 BY ${socket.id}`)
})
this.roomHandler.roomRegister("room2",(event,socket)=>{
console.log(`${event} for room2 BY ${socket.id}`)
})
this.roomHandler.roomRegister("room3",(event,socket)=>{
console.log(`${event} for room3 BY ${socket.id}`)
})
}
}
const server = new myserver();