from datetime import datetime from flask_socketio import SocketIO, join_room, leave_room, emit from chat.manager import add_user_to_room, remove_user_from_room, get_room_members # SocketIO instance — imported and attached to app in app.py socketio = SocketIO(cors_allowed_origins="*") # Optional: store recent messages per room in memory message_history = {} # --------------------------------------------------------------------------- # connect # --------------------------------------------------------------------------- @socketio.on('connect') def on_connect(): from flask import request print(f"[+] Client connected: {request.sid}") # --------------------------------------------------------------------------- # join_room # --------------------------------------------------------------------------- @socketio.on('join_room') def on_join(data): from flask import request room = data.get('room') if not room: emit('error', {'message': 'Room name is required'}) return sid = request.sid join_room(room) # Flask-SocketIO room join add_user_to_room(room, sid) # Track in our manager members = len(get_room_members(room)) print(f"[+] {sid} joined room '{room}' ({members} members)") # Send recent history to the joining client history = message_history.get(room, []) emit('room_joined', { 'room': room, 'message': f"You joined room '{room}'", 'history': history[-20:] # Last 20 messages }) # Notify others in the room emit('user_joined', { 'message': f"A new user joined '{room}'", 'members': members }, to=room, include_self=False) # --------------------------------------------------------------------------- # send_message # --------------------------------------------------------------------------- @socketio.on('send_message') def on_message(data): from flask import request room = data.get('room') message = data.get('message', '').strip() if not room or not message: emit('error', {'message': 'Room and message are required'}) return payload = { 'message': message, 'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'sender': request.sid[:8] # Short anonymous sender ID } # Store in history if room not in message_history: message_history[room] = [] message_history[room].append(payload) # Broadcast to everyone in the room (including sender) emit('receive_message', payload, to=room) print(f"[MSG] room='{room}' | {payload['sender']}: {message}") # --------------------------------------------------------------------------- # disconnect # --------------------------------------------------------------------------- @socketio.on('disconnect') def on_disconnect(): from flask import request sid = request.sid remove_user_from_room(sid) print(f"[-] Client disconnected: {sid}")