import os
import asyncio
from datetime import datetime
from contextlib import asynccontextmanager
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
from fastapi.middleware.cors import CORSMiddleware
from ai_engine import engine
from telegram_bot import bot
from modules.agents import MODULES, run_module
from jarvis_links import get_all_links, get_random_template
@asynccontextmanager
async def lifespan(app: FastAPI):
asyncio.create_task(bot.start_polling())
print("🚀 Jarvis Empire started!")
yield
bot.stop()
app = FastAPI(title="JARVIS EMPIRE", lifespan=lifespan)
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
connections = []
activity_log = []
def log_activity(action: str, details: str = ""):
entry = {"time": datetime.now().strftime("%H:%M:%S"), "action": action, "details": details}
activity_log.insert(0, entry)
if len(activity_log) > 50:
activity_log.pop()
DASHBOARD_HTML = """
JARVIS EMPIRE
🤖 JARVIS BRAIN
JARVIS
⚡ Sistem online. Selamat datang, Master Haryono. Semua modul affiliate aktif.
⚡ MODULES
📡 OUTPUT
Jalankan modul untuk melihat output
// Output modul muncul di sini...
💰 AFFILIATE LINKS
🏠 HOSTINGER
hostinger.com?REFERRALCODE=FCIHARY08HBD
💵 ~$60-100/sale
🛒 SHOPEE
https://s.shopee.co.id/6pvyNUFq9A
💵 2-10%/sale
📋 ACTIVITY LOG
--:--BOOTSystem initialized
"""
@app.get("/", response_class=HTMLResponse)
async def dashboard():
return DASHBOARD_HTML
@app.get("/api/status")
async def get_status():
stats = engine.get_stats()
return {
"status": "online",
"available_providers": len(stats["available"]),
"providers": stats["available"],
"active_provider": stats["active_provider"],
"modules": list(MODULES.keys()),
"timestamp": datetime.now().isoformat()
}
@app.post("/api/chat")
async def chat(data: dict):
message = data.get("message", "")
if not message:
return {"response": "Pesan kosong.", "provider": "none"}
result = await engine.think(message)
log_activity("CHAT", message[:30])
return {"response": result["response"], "provider": result["provider"]}
@app.post("/api/module")
async def run_module_api(data: dict):
module_name = data.get("module", "")
if module_name not in MODULES:
return {"error": "Not found", "output": "Module tidak ditemukan.", "module": module_name, "provider": "none"}
kwargs = {k: v for k, v in data.items() if k != "module"}
try:
result = await MODULES[module_name].run(**kwargs)
log_activity("MODULE", module_name)
return {"module": result.get("module", module_name), "output": result.get("output", ""), "provider": result.get("provider", "unknown")}
except Exception as e:
return {"error": str(e), "output": f"Error: {str(e)}", "module": module_name, "provider": "none"}
@app.get("/api/template/{platform}")
async def get_template(platform: str):
template = get_random_template(platform)
return {"template": template, "platform": platform}
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
connections.append(websocket)
try:
while True:
await websocket.receive_text()
except WebSocketDisconnect:
if websocket in connections:
connections.remove(websocket)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860)