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)