#!/usr/bin/env python3 """ WHACKY CHAT APP - COMPLETE VERSION A modern, whacky Flask-SocketIO chat application """ from flask import Flask, render_template, request, redirect, url_for, session from flask_socketio import SocketIO, emit import secrets import os # Hugging Face Spaces compatibility PORT = int(os.environ.get("PORT", 7860)) HOST = os.environ.get("HOST", "0.0.0.0") app = Flask(__name__) app.config['SECRET_KEY'] = secrets.token_hex(16) # Configure SocketIO for Hugging Face Spaces socketio = SocketIO( app, cors_allowed_origins='*', async_mode='eventlet', logger=True, engineio_logger=True ) # Store connected users and user counter connected_users = {} user_counter = 0 @app.route('/') def index(): # If user is not logged in, redirect to login if 'user_number' not in session: return redirect(url_for('login')) return render_template('chat.html') @app.route('/login', methods=['GET', 'POST']) def login(): global user_counter if request.method == 'POST': # Get username from form username = request.form.get('username', '').strip() if username: user_counter += 1 user_number = f"{user_counter:02d}" # Format as two digits (01, 02, etc.) # Store user info in session session['user_number'] = user_number session['username'] = username return redirect(url_for('index')) return render_template('login.html') @app.route('/logout') def logout(): # Clear session session.clear() return redirect(url_for('login')) @socketio.on('connect') def handle_connect(): if 'user_number' not in session: return False # Reject connection if not logged in user_number = session['user_number'] username = session['username'] user_id = request.sid # Add user to connected users connected_users[user_id] = { 'user_number': user_number, 'username': username, 'user_id': user_id } # Send welcome message to the new user emit('user_assigned', { 'user_number': user_number, 'username': username, 'message': f'Welcome {username}! You are user #{user_number}' }) # Notify all users about the new user emit('user_joined', { 'user_number': user_number, 'username': username, 'message': f'{username} (User #{user_number}) has joined the chat!', 'total_users': len(connected_users) }, broadcast=True) print(f"User {username} (#{user_number}) connected") @socketio.on('disconnect') def handle_disconnect(): user_id = request.sid if user_id in connected_users: user_info = connected_users[user_id] user_number = user_info['user_number'] username = user_info['username'] del connected_users[user_id] # Notify all users about the user leaving emit('user_left', { 'user_number': user_number, 'username': username, 'message': f'{username} (User #{user_number}) has left the chat!', 'total_users': len(connected_users) }, broadcast=True) print(f"User {username} (#{user_number}) disconnected") @socketio.on('send_message') def handle_message(data): if 'user_number' not in session: return user_number = session['user_number'] username = session['username'] # Broadcast message to all users emit('new_message', { 'user_number': user_number, 'username': username, 'message': data['message'], 'timestamp': data.get('timestamp', '') }, broadcast=True) @socketio.on('typing') def handle_typing(data): if 'user_number' not in session: return user_number = session['user_number'] username = session['username'] emit('user_typing', { 'user_number': user_number, 'username': username }, broadcast=True, include_self=False) if __name__ == '__main__': print("🚀 Starting Whacky Chat App - Complete Version...") print(f"📡 Server running on http://{HOST}:{PORT}") print("✅ Ready for Hugging Face Spaces deployment!") socketio.run(app, debug=True, host=HOST, port=PORT)