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)