Spaces:
Sleeping
Sleeping
| #!/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 | |
| 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') | |
| 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') | |
| def logout(): | |
| # Clear session | |
| session.clear() | |
| return redirect(url_for('login')) | |
| 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") | |
| 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") | |
| 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) | |
| 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) |