""" ═══════════════════════════════════════════════════════════════ CORVO AI - Complete Teaching Platform Main Application Entry Point Run: python app.py Open: http://localhost:5000 ═══════════════════════════════════════════════════════════════ """ import os from flask import Flask, redirect, url_for, session, flash, render_template, send_from_directory from flask_socketio import SocketIO from config import SECRET_KEY, DEBUG, HOST, PORT, REQUIRED_DIRS # ─── Create Flask app ─── app = Flask(__name__) app.secret_key = SECRET_KEY socketio = SocketIO(app, cors_allowed_origins="*", async_mode='threading') # ─── Create required directories ─── for d in REQUIRED_DIRS: os.makedirs(d, exist_ok=True) # ─── Initialize databases ─── from database.users import init_users_db from database.cards import init_cards_db from database.chat_history import init_chat_history_db init_users_db() init_cards_db() init_chat_history_db() # ─── Initialize AI engines ─── from chat.agent import AIAgent from board.engine import BoardEngine agent = AIAgent() board_engine = BoardEngine() # ─── Register blueprints ─── # Auth from auth.routes import auth_bp, init_auth_socketio init_auth_socketio(socketio) app.register_blueprint(auth_bp) # Chat from chat.routes import chat_bp, init_chat_agent init_chat_agent(agent) app.register_blueprint(chat_bp) # Board from board.routes import board_bp, init_board_engine init_board_engine(board_engine) app.register_blueprint(board_bp) # Exam from exam.routes import exam_bp app.register_blueprint(exam_bp) # Media from media.routes import media_bp, init_media_agent init_media_agent(agent) app.register_blueprint(media_bp) # Market from market.routes import market_bp app.register_blueprint(market_bp) # WebSocket from websocket.events import register_socketio_events register_socketio_events(socketio) # ═══════════════════════════════════════════════════════════════ # ROOT ROUTES # ═══════════════════════════════════════════════════════════════ from auth.helpers import is_session_valid from database.users import load_users_db, get_user from subjects.definitions import SUBJECTS, is_board_enabled @app.route('/') def index(): if is_session_valid(): return redirect(url_for('dashboard')) return redirect(url_for('auth.signup')) @app.route('/dashboard') def dashboard(): if not is_session_valid(): session.clear() flash('انتهت الجلسة، يرجى تسجيل الدخول مرة أخرى.', 'error') return redirect(url_for('auth.login')) username = session['username'] users_db = load_users_db() user_data = users_db.get(username, {}) student_type = user_data.get('student_type', 'علمي') all_subjects = SUBJECTS.get(student_type, []) purchased_subjects = user_data.get('purchased_subjects', ['islamic']) my_subjects = [] for s in all_subjects: if s['id'] in purchased_subjects: subject_info = dict(s) subject_info['board_enabled'] = is_board_enabled(s['id']) my_subjects.append(subject_info) available_subjects = [s for s in all_subjects if s['id'] not in purchased_subjects] return render_template('dashboard.html', username=username, user_data=user_data, my_subjects=my_subjects, available_subjects=available_subjects, balance=user_data.get('balance', 0)) @app.route('/static/') def serve_static(filename): return send_from_directory('static', filename) # ═══════════════════════════════════════════════════════════════ # MAIN # ═══════════════════════════════════════════════════════════════ if __name__ == '__main__': print("\n" + "═" * 60) print(" 🎓 CORVO AI - Complete Teaching Platform") print("═" * 60) print() print(" 📋 Architecture:") print(" ├── auth/ → Login, signup, sessions") print(" ├── chat/ → Text AI chat (multi-subject)") print(" ├── board/ → Interactive whiteboard (multi-subject)") print(" ├── exam/ → MCQ exam generation") print(" ├── media/ → Voice & image processing") print(" ├── market/ → Subject purchasing & cards") print(" ├── websocket/ → Real-time session management") print(" ├── database/ → JSON file persistence") print(" └── subjects/ → Subject definitions & loading") print() print(" 🔧 FEATURES:") print(" ✅ Multi-subject support (chat + board)") print(" ✅ Per-user per-subject chat history") print(" ✅ Interactive whiteboard with TTS") print(" ✅ Board supports ANY subject dynamically") print(" ✅ N → per-subject book page images") print(" ✅ keyword → Icons8 hand-drawn icons") print(" ✅ MCQ exam generation per subject/chapter") print(" ✅ Voice input & image analysis") print(" ✅ Card-based balance & subject purchasing") print() print(f" 🌐 Open: http://localhost:{PORT}") print("═" * 60 + "\n") socketio.run(app, debug=DEBUG, host="0.0.0.0", port=7860, allow_unsafe_werkzeug=True)