fmatituy/selectospromanager
0
1from nicegui import app, ui
2from fastapi.responses import FileResponse
3import os
4import asyncio
5import time
6
7import sys
8sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__))))
9
10# 1. CARGA DE CAPA CORE (Infraestructura)
11from core.config import RUN_KWARGS, STATIC_PATH, local_ip
12from core.logger import logger
13from database.db import init_db
14
15# 2. CARGA DE CAPA ORQUESTADORA (Módulos y Dominio)
16from modules.registry import registry
17
18# Inicialización de Base de Datos y Módulos al Cargar el Script
19app.add_static_files('/static', STATIC_PATH)
20try:
21 init_db()
22 logger.info("Base de datos inicializada")
23 registry.load_all(STATIC_PATH)
24 logger.info("Módulos cargados exitosamente")
25except Exception as e:
26 logger.error(f"ERROR CRÍTICO EN CARGA: {e}")
27 import traceback
28 traceback.print_exc()
29
30# Eventos de Ciclo de Vida del Kernel
31@app.on_startup
32async def on_startup():
33 logger.info("INICIALIZANDO KERNEL SELECTOS PROMANAGER...")
34
35 # El recuperador de cuota en segundo plano (COCO) ha sido deshabilitado a petición del usuario
36 # para evitar gastos innecesarios de cuota.
37 pass
38
39 logger.info("Kernel listo. Sistema operativo.")
40
41@app.on_shutdown
42def on_shutdown():
43 logger.info("APAGANDO SISTEMA. Limpiando recursos...")
44 # El borrado automático ha sido deshabilitado para permitir persistencia de logs
45 # import glob
46 # for f in set(glob.glob('*.log') + glob.glob('server_log*.txt')):
47 # try: os.remove(f)
48 # except: pass
49
50# 3. ENDPOINTS DE INFRAESTRUCTURA (PWA / APK)
51@app.get('/manifest.json')
52def manifest():
53 return {
54 "name": "Selectos ProManager",
55 "short_name": "ProManager",
56 "start_url": "/",
57 "display": "standalone",
58 "background_color": "#1e40af",
59 "theme_color": "#1e40af",
60 "icons": [
61 {
62 "src": "/static/icon.png",
63 "sizes": "192x192",
64 "type": "image/png"
65 },
66 {
67 "src": "/static/icon.png",
68 "sizes": "512x512",
69 "type": "image/png"
70 }
71 ]
72 }
73
74@app.get('/descargar/apk')
75def descargar_apk():
76 apk_path = os.path.join(STATIC_PATH, 'SelectosProManager.apk')
77 if not os.path.exists(apk_path):
78 os.makedirs(STATIC_PATH, exist_ok=True)
79 with open(apk_path, 'w') as f: f.write("Selectos ProManager v1.0.3 - APK Stub.")
80 return FileResponse(apk_path, media_type='application/vnd.android.package-archive', filename='SelectosProManager_v1.0.3.apk')
81
82if __name__ == "__main__":
83 import os
84 # Hugging Face Spaces usa el puerto 7860 por defecto
85 port = int(os.environ.get("PORT", RUN_KWARGS.get('port', 8016)))
86 if "SPACE_ID" in os.environ:
87 port = 7860
88 RUN_KWARGS['port'] = 7860
89 RUN_KWARGS['host'] = '0.0.0.0'
90
91 print(f"[+] Servidor activo en RED LOCAL: http://{local_ip}:{port}")
92 print(f"[+] Acceso Local: http://localhost:{port}")
93
94 ui.run(**RUN_KWARGS)
95 