|
@@ -14,6 +14,7 @@ socketio = SocketIO(app, cors_allowed_origins="*", logger=True, engineio_logger=
|
|
|
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
|
|
|
|
rooms = {}
|
|
|
+user_rooms = {}
|
|
|
|
|
|
@socketio.on('connect')
|
|
|
def on_connect():
|
|
@@ -22,47 +23,59 @@ def on_connect():
|
|
|
@socketio.on('disconnect')
|
|
|
def on_disconnect():
|
|
|
logging.info(f"Client disconnected: {request.sid}")
|
|
|
- room = rooms.get(request.sid)
|
|
|
+ room = user_rooms.get(request.sid)
|
|
|
if room:
|
|
|
leave_room(room)
|
|
|
- del rooms[request.sid]
|
|
|
- socketio.emit('user_left', request.sid, room=room)
|
|
|
+ username = rooms[room].pop(request.sid, None)
|
|
|
+ del user_rooms[request.sid]
|
|
|
+ if username:
|
|
|
+ socketio.emit('update_user_list', list(rooms[room].values()), room=room)
|
|
|
+ if not rooms[room]:
|
|
|
+ del rooms[room]
|
|
|
+ socketio.emit('user_left', username, room=room)
|
|
|
|
|
|
@socketio.on('join')
|
|
|
def on_join(data):
|
|
|
room = data['room']
|
|
|
+ username = data['username']
|
|
|
join_room(room)
|
|
|
- rooms[request.sid] = room
|
|
|
- logging.info(f"User {request.sid} joined room {room}")
|
|
|
- socketio.emit('user_joined', request.sid, room=room, skip_sid=request.sid)
|
|
|
- socketio.emit('message', {'type': 'system', 'msg': '新用户加入'}, room=room)
|
|
|
+ if room not in rooms:
|
|
|
+ rooms[room] = {}
|
|
|
+ rooms[room][request.sid] = username
|
|
|
+ user_rooms[request.sid] = room
|
|
|
+ logging.info(f"User {username} ({request.sid}) joined room {room}")
|
|
|
+ socketio.emit('user_joined', username, room=room, skip_sid=request.sid)
|
|
|
+ socketio.emit('update_user_list', list(rooms[room].values()), room=room)
|
|
|
+ socketio.emit('message', {'type': 'system', 'msg': f'{username} 加入了房间'}, room=room)
|
|
|
|
|
|
@socketio.on('leave')
|
|
|
def on_leave():
|
|
|
- room = rooms.get(request.sid)
|
|
|
+ room = user_rooms.get(request.sid)
|
|
|
if room:
|
|
|
+ username = rooms[room].pop(request.sid, None)
|
|
|
leave_room(room)
|
|
|
- del rooms[request.sid]
|
|
|
- logging.info(f"User {request.sid} left room {room}")
|
|
|
- socketio.emit('user_left', request.sid, room=room)
|
|
|
- socketio.emit('message', {'type': 'system', 'msg': '用户离开'}, room=room)
|
|
|
+ del user_rooms[request.sid]
|
|
|
+ logging.info(f"User {username} ({request.sid}) left room {room}")
|
|
|
+ socketio.emit('user_left', username, room=room)
|
|
|
+ socketio.emit('update_user_list', list(rooms[room].values()), room=room)
|
|
|
+ socketio.emit('message', {'type': 'system', 'msg': f'{username} 离开了房间'}, room=room)
|
|
|
|
|
|
@socketio.on('offer')
|
|
|
def handle_offer(data):
|
|
|
- data['sender'] = request.sid
|
|
|
- logging.info(f"Offer from {request.sid} to {data.get('target')}")
|
|
|
+ data['sender'] = rooms[user_rooms[request.sid]][request.sid]
|
|
|
+ logging.info(f"Offer from {data['sender']} to {data.get('target')}")
|
|
|
socketio.emit('offer', data, room=data.get('target'))
|
|
|
|
|
|
@socketio.on('answer')
|
|
|
def handle_answer(data):
|
|
|
- data['sender'] = request.sid
|
|
|
- logging.info(f"Answer from {request.sid} to {data.get('target')}")
|
|
|
+ data['sender'] = rooms[user_rooms[request.sid]][request.sid]
|
|
|
+ logging.info(f"Answer from {data['sender']} to {data.get('target')}")
|
|
|
socketio.emit('answer', data, room=data.get('target'))
|
|
|
|
|
|
@socketio.on('candidate')
|
|
|
def handle_candidate(data):
|
|
|
- data['sender'] = request.sid
|
|
|
- logging.info(f"ICE candidate from {request.sid} to {data.get('target')}")
|
|
|
+ data['sender'] = rooms[user_rooms[request.sid]][request.sid]
|
|
|
+ logging.info(f"ICE candidate from {data['sender']} to {data.get('target')}")
|
|
|
socketio.emit('candidate', data, room=data.get('target'))
|
|
|
|
|
|
@app.route('/room/<room_id>')
|