from flask import Flask, render_template_string, request, redirect, url_for, session import random import string import json import os from flask_socketio import SocketIO, join_room, leave_room, emit import hashlib app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key-here' socketio = SocketIO(app) # Путь к JSON-файлам ROOMS_DB = 'rooms.json' USERS_DB = 'users.json' # Загрузка данных из JSON def load_json(file_path, default={}): if os.path.exists(file_path): with open(file_path, 'r') as f: return json.load(f) return default # Сохранение данных в JSON def save_json(file_path, data): with open(file_path, 'w') as f: json.dump(data, f, indent=4) # Инициализация баз данных rooms = load_json(ROOMS_DB) users = load_json(USERS_DB) # Генерация 15-значного токена def generate_token(): return ''.join(random.choices(string.ascii_letters + string.digits, k=15)) # Хеширование пароля def hash_password(password): return hashlib.sha256(password.encode()).hexdigest() # Главная страница (регистрация/вход) @app.route('/', methods=['GET', 'POST']) def index(): if 'username' in session: return redirect(url_for('dashboard')) if request.method == 'POST': action = request.form.get('action') username = request.form.get('username') password = request.form.get('password') if action == 'register': if username in users: return "Пользователь уже существует", 400 users[username] = hash_password(password) save_json(USERS_DB, users) session['username'] = username return redirect(url_for('dashboard')) elif action == 'login': if username in users and users[username] == hash_password(password): session['username'] = username return redirect(url_for('dashboard')) return "Неверный логин или пароль", 401 return render_template_string(''' Видеоконференция

Видеоконференция

''') # Панель управления @app.route('/dashboard', methods=['GET', 'POST']) def dashboard(): if 'username' not in session: return redirect(url_for('index')) if request.method == 'POST': action = request.form.get('action') if action == 'create': token = generate_token() rooms[token] = {'users': [], 'max_users': 5} save_json(ROOMS_DB, rooms) return redirect(url_for('room', token=token)) elif action == 'join': token = request.form.get('token') if token in rooms and len(rooms[token]['users']) < rooms[token]['max_users']: return redirect(url_for('room', token=token)) return "Комната не найдена или переполнена", 404 return render_template_string(''' Панель управления

Добро пожаловать, {{ session['username'] }}

''', session=session) # Выход из системы @app.route('/logout', methods=['POST']) def logout(): session.pop('username', None) return redirect(url_for('index')) # Страница комнаты @app.route('/room/') def room(token): if 'username' not in session: return redirect(url_for('index')) if token not in rooms: return redirect(url_for('dashboard')) return render_template_string(''' Комната {{ token }}

Комната: {{ token }}

''', token=token, session=session) # WebSocket события @socketio.on('join') def handle_join(data): token = data['token'] username = data['username'] if token in rooms and len(rooms[token]['users']) < rooms[token]['max_users']: join_room(token) if username not in rooms[token]['users']: rooms[token]['users'].append(username) save_json(ROOMS_DB, rooms) emit('user_joined', {'username': username, 'users': rooms[token]['users']}, room=token) emit('init_users', {'users': rooms[token]['users']}, to=request.sid) @socketio.on('leave') def handle_leave(data): token = data['token'] username = data['username'] if token in rooms and username in rooms[token]['users']: leave_room(token) rooms[token]['users'].remove(username) save_json(ROOMS_DB, rooms) emit('user_left', {'username': username, 'users': rooms[token]['users']}, room=token) @socketio.on('signal') def handle_signal(data): # Пересылаем сигнал всем в комнате, кроме отправителя emit('signal', data, room=data['token'], skip_sid=request.sid) if __name__ == '__main__': socketio.run(app, host='0.0.0.0', port=7860, debug=True, allow_unsafe_werkzeug=True)