91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
from contextlib import asynccontextmanager
|
|
import os
|
|
from fastapi import FastAPI
|
|
from fastapi.staticfiles import StaticFiles
|
|
import httpx
|
|
from app.api import admin_daily_quests, inventory, news, users, skins, capes, meta, server, store, pranks, marketplace, marketplace_ws, bonuses, case, promo, voice_ws
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
|
|
from app.core.config import CAPES_DIR, CAPES_STORE_DIR, SKINS_DIR
|
|
from app.services.promo import PromoService
|
|
from app.webhooks import telegram
|
|
from app.db.database import users_collection, sessions_collection
|
|
|
|
|
|
###################### БОТ ######################
|
|
|
|
BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
|
|
PUBLIC_WEBHOOK_URL = os.getenv("PUBLIC_WEBHOOK_URL") # https://minecraft.api.popa-popa.ru/telegram/webhook
|
|
WEBHOOK_SECRET = os.getenv("TELEGRAM_WEBHOOK_SECRET", "")
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
# ===== STARTUP =====
|
|
|
|
# TTL для сессий (автоочистка)
|
|
await sessions_collection.create_index(
|
|
"expires_at",
|
|
expireAfterSeconds=0
|
|
)
|
|
|
|
await users_collection.create_index("expires_at", expireAfterSeconds=0)
|
|
await users_collection.create_index("telegram_user_id", unique=True, sparse=True)
|
|
|
|
if BOT_TOKEN and PUBLIC_WEBHOOK_URL:
|
|
payload = {"url": PUBLIC_WEBHOOK_URL}
|
|
if WEBHOOK_SECRET:
|
|
payload["secret_token"] = WEBHOOK_SECRET
|
|
|
|
async with httpx.AsyncClient(timeout=20) as client:
|
|
await client.post(
|
|
f"https://api.telegram.org/bot{BOT_TOKEN}/setWebhook",
|
|
json=payload,
|
|
)
|
|
|
|
await PromoService().ensure_indexes()
|
|
|
|
yield
|
|
|
|
# ===== SHUTDOWN =====
|
|
async with httpx.AsyncClient(timeout=20) as client:
|
|
await client.post(
|
|
f"https://api.telegram.org/bot{BOT_TOKEN}/deleteWebhook"
|
|
)
|
|
|
|
|
|
app = FastAPI(lifespan=lifespan)
|
|
|
|
##################################################
|
|
|
|
app.include_router(meta.router)
|
|
app.include_router(users.router)
|
|
app.include_router(skins.router)
|
|
app.include_router(capes.router)
|
|
app.include_router(server.router)
|
|
app.include_router(store.router)
|
|
app.include_router(pranks.router)
|
|
app.include_router(marketplace.router)
|
|
app.include_router(marketplace_ws.router)
|
|
app.include_router(case.router)
|
|
app.include_router(inventory.router)
|
|
app.include_router(bonuses.router)
|
|
app.include_router(news.router)
|
|
app.include_router(telegram.router)
|
|
app.include_router(admin_daily_quests.router)
|
|
app.include_router(promo.router)
|
|
app.include_router(voice_ws.router)
|
|
|
|
# Монтируем статику
|
|
app.mount("/skins", StaticFiles(directory=str(SKINS_DIR)), name="skins")
|
|
app.mount("/capes", StaticFiles(directory=str(CAPES_DIR)), name="capes")
|
|
app.mount("/capes_store", StaticFiles(directory=str(CAPES_STORE_DIR)), name="capes_store")
|
|
|
|
# CORS, middleware и т.д.
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|