File size: 6,180 Bytes
6e3d57b
 
 
 
 
 
 
 
 
 
3747525
6e3d57b
 
305d870
6e3d57b
 
 
5492f08
6e3d57b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485895c
6e3d57b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89b759b
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
"""
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  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/<path:filename>')
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("     โœ… <page>N</page> โ†’ per-subject book page images")
    print("     โœ… <svg>keyword</svg> โ†’ 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)