mj_bale_chat/main.py
2026-01-25 11:29:33 +00:00

129 lines
4.0 KiB
Python
Executable File

# app.py
from fastapi import FastAPI
from contextlib import asynccontextmanager
from core.core import ElasticHelper, Formatter, RequestManager
from fastapi.middleware.cors import CORSMiddleware
from router.bale.bale import router as bale_router
from router.bale.bale import initialize_webhook
from router.bale.bale_handle import BaleBot, UserManager
from core.operation import Operation
from dotenv import load_dotenv
import os
# --- Lifespan manager ---
@asynccontextmanager
async def lifespan(app: FastAPI):
# 🚀 Startup — همه موارد مقداردهی اولیه باید اینجا باشند
print("🚀 Starting up Bale-Bot Backend system...")
# فقط یک بار در ابتدای برنامه `.env` را بارگذاری کنیم
load_dotenv()
TOKEN = os.getenv("BALE_TOKEN")
ES_URL = os.getenv("ES_URL")
ES_PASSWORD = os.getenv("ES_PASSWORD")
ES_USER_NAME = os.getenv("ES_USER_NAME")
ES_INDEX_NAME = os.getenv("ES_INDEX_NAME")
GLOBAL_DOMAIN = os.getenv("GLOBAL_DOMAIN")
BACK_END_HOST= os.getenv("BACK_END_HOST")
BACK_END_PORT= os.getenv("BACK_END_PORT")
BACK_END_URL = f"http://{BACK_END_HOST}:{BACK_END_PORT}"
# 🔍 گرفتن تنظیمات
required_vars = {
"TOKEN": TOKEN,
"ES_URL": ES_URL,
"ES_PASSWORD": ES_PASSWORD,
"ES_USER_NAME": ES_USER_NAME,
"ES_INDEX_NAME": ES_INDEX_NAME,
"GLOBAL_DOMAIN": GLOBAL_DOMAIN,
}
missing = [k for k, v in required_vars.items() if not v]
if missing:
raise EnvironmentError(
f"Missing required environment variables: {missing}\nPLZ add the required field in the .env file !"
)
app.state.es_helper = ElasticHelper(
es_url=ES_URL,
es_pass=ES_PASSWORD,
es_user=ES_USER_NAME,
)
app.state.base_url = f"https://tapi.bale.ai/bot{TOKEN}"
app.state.webhook_url = f"{GLOBAL_DOMAIN}/webhook/{TOKEN}"
app.state.set_webhook_url = f"https://tapi.bale.ai/bot{TOKEN}/setWebhook"
app.state.es_index_name = ES_INDEX_NAME
app.state.bale_token = TOKEN
# اجباری است برای ربات
initialize_webhook(
webhook_url=app.state.webhook_url,
set_webhook_url=app.state.set_webhook_url,
)
app.state.user_manager = UserManager()
app.state.formatter = Formatter()
app.state.request_manager = RequestManager(
host_url=BACK_END_URL,
)
app.state.operation = Operation(
request_manager=app.state.request_manager,
)
# بله بات
bale_bot = BaleBot(
operation=app.state.operation,
user_manager=app.state.user_manager,
es_helper=app.state.es_helper,
es_index_name=app.state.es_index_name,
token=app.state.bale_token,
formatter= app.state.formatter,
back_end_url = BACK_END_URL,
request_manager = app.state.request_manager,
)
app.state.bale_bot = bale_bot
print("✅✅✅ Bale-Bot Initialized ✅✅✅")
yield # برنامه در این حالت اجرا می‌شود
print("🛑 Shutting down Bale-Bot Backend system...")
# --- Application factory ---
def create_app() -> FastAPI:
app = FastAPI(
title="Bale-Bot Backend",
version="0.1.0",
lifespan=lifespan,
# برای محیط production، می‌توانید docs + redoc را غیرفعال کنید
# docs_url=None, redoc_url=None
)
# 🌐 CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # فقط در dev — در prod لیست دقیق دامنه‌ها را بگذارید
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 🏠 Health routes
@app.get("/", include_in_schema=False)
async def health_check():
return {"status": "ok", "message": "Bale-Bot Backend is running"}
@app.get("/ping", include_in_schema=False)
async def ping():
return {"pong": True}
# 📦 روت‌ها
app.include_router(bale_router)
return app
############## Create app
app = create_app()