Spaces:
Sleeping
Sleeping
File size: 4,458 Bytes
cbfb0e7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
#!/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) |