在FlaskSocketIO聊天中设置动态聊天室

3

我希望能让我的小型聊天室的用户动态地创建他们自己的房间。目前,我在Flask服务器应用程序中使用了常量:

# Predefined rooms for chat
ROOMS = ["Lounge", "news", "games", "coding", "food", "cars"]

用户加入/离开的路由在flask中:

@socketio.on('join')
def on_join(data):
    username = data["username"]
    room = data["room"]
    join_room(room)
    # Notofication about new user joined room
    send({"msg": username + " has joined the " + room + " room."}, room=room)

@socketio.on('leave')
def on_leave(data):
    leave_room(data['room'])
    # Notification about leaving users
    send({'msg': data['username'] + " has left the " + data['room']}, room=data['room'])

在 JavaScript 方面,它是这样的:

// Select a room
document.querySelectorAll('.select-room').forEach(p => {
    p.onclick = () => {
        let newRoom = p.innerHTML
        // Check if user already in the room
        if (newRoom === room) {
            msg = `You are already in ${room} room.`;
            printSysMsg(msg);
        } else {
            leaveRoom(room);
            joinRoom(newRoom);
            room = newRoom;
        }
    };
});

// Trigger 'join' event
    function joinRoom(room) {
        // Join room
        socket.emit('join', {'username': username, 'room': room});

// Trigger 'leave' event if user was previously on a room
    function leaveRoom(room) {
        socket.emit('leave', {'username': username, 'room': room});

我该如何让用户动态地加入他们创建的房间?

1
这是与选择自定义房间所需的JavaScript UI更改有关的问题,还是与Socket.IO服务器有关的特定问题? - Miguel Grinberg
@Miguel,我认为两种情况都是如此,我不知道如何让用户在双方创建动态房间。 - Szegerege
我能回答的部分是 Socket.IO 方面。这很简单,只需使用所需的房间名称即可。房间在第一次使用时创建,因此创建房间唯一需要做的事情就是让某人加入它。 - Miguel Grinberg
我认为你的函数缺少一个闭合的花括号...希望在你的真实代码中不是这样的。 - Nv7
1个回答

3
也许你可以在服务器端执行类似这样的操作:
@socketio.on('join')
def on_join(data):
    username = data["username"]
    room = data["room"]
    join_room(room)
    # Notofication about new user joined room
    send({"msg": username + " has joined the " + room + " room."}, room=room)

@socketio.on('leave')
def on_leave(data):
    leave_room(data['room'])
    # Notification about leaving users
    send({'msg': data['username'] + " has left the " + data['room']}, room=data['room'])

@socketio.on('new_room')
def new_room(data):
    ROOMS.append(data['new_room_name'])
    room = data['new_room_name']
    username = data['username']
    join_room(data['new_room_name'])
    # Notification about new user joined room
    send({"msg": username + " has created the " + room + " room."}, room=room)

还有客户端:

// Select a room
document.querySelectorAll('.select-room').forEach(p => {
    p.onclick = () => {
        let newRoom = p.innerHTML
        // Check if user already in the room
        if (newRoom === room) {
            msg = `You are already in ${room} room.`;
            printSysMsg(msg);
        } else {
            leaveRoom(room);
            joinRoom(newRoom);
            room = newRoom;
        }
    };
});

// Trigger 'join' event
    function joinRoom(room) {
        // Join room
        socket.emit('join', {'username': username, 'room': room});
    }

// Trigger 'leave' event if user was previously on a room
    function leaveRoom(room) {
        socket.emit('leave', {'username': username, 'room': room});
    }

// Trigger this event when a new room needs to be created
    function newRoom(room) {
        socket.emit('new_room', {'username': username, 'room': room});
    }

我没有测试过这段代码,如果存在语法错误或无法正常工作,请谅解。但我相信它应该可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接