CoolFace
Apppublic

fmatituy/selectospromanager

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes
main.py95 linesDownload Raw Back to src
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