lockIn / chat /socket.py
Kankshi's picture
Upload 21 files
c35855b verified
Raw
History Blame Contribute Delete
3.01 kB
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}")