javascript - 在 Flask SocketIO 聊天中设置动态聊天室

标签 javascript python flask socket.io flask-socketio

我想让我的迷你聊天室的用户动态创建他们的房间。现在我在 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'])

在 js 上。侧面像:

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

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

最佳答案

也许你可以为你的服务器端做这样的事情:

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

我没有测试过这段代码,所以如果有语法错误,或者它不起作用,请原谅我,但我相信它应该。

关于javascript - 在 Flask SocketIO 聊天中设置动态聊天室,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57285551/

相关文章:

javascript - 一张 Google map 上具有多种颜色的多个多边形

python - 通过 Youtube API v3 将视频上传到多个 channel

javascript - JSON 编码 Flask 到 Javascript

python - 将 16 位无符号整数数组转换为位的快速方法

Javascript 获取 flask json

Python、Flask、ffmpeg 视频流 : Video does not work in Firefox

javascript - 动态更新文本框后更新范围值

javascript - 自定义 header 添加到 Access-Control-Request-Headers

javascript - 动态改变 <textarea > 大小、样式

点击终端后Python time.sleep中断