import discord from discord.ext import commands from config import ALLOWED_CHANNEL_ID, HIT_CHECK_INTERVAL, REASSIGN_DELAY from cogs.assignments import Assignments from cogs.commands import HitCommands import asyncio import uvicorn from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from pydantic import BaseModel from services.torn_api import update_enemy_faction, update_friendly_faction # ----------------------------- # FastAPI setup # ----------------------------- app = FastAPI() templates = Jinja2Templates(directory="templates") app.mount("/static", StaticFiles(directory="static"), name="static") # ----------------------------- # Dashboard page # ----------------------------- @app.get("/", response_class=HTMLResponse) async def dashboard(request: Request): print(">>> DASHBOARD ROUTE LOADED") return templates.TemplateResponse("dashboard.html", {"request": request}) # ----------------------------- # Pydantic model for JSON payloads # ----------------------------- class FactionRequest(BaseModel): faction_id: int interval: int # ----------------------------- # API Endpoints # ----------------------------- @app.post("/api/update_enemy_faction") async def api_enemy(data: FactionRequest): await update_enemy_faction(data.faction_id, data.interval) return {"status": "enemy loop running", "id": data.faction_id, "interval": data.interval} @app.post("/api/update_friendly_faction") async def api_friendly(data: FactionRequest): await update_friendly_faction(data.faction_id, data.interval) return {"status": "friendly loop running", "id": data.faction_id, "interval": data.interval} # ----------------------------- # Discord bot setup # ----------------------------- intents = discord.Intents.default() intents.message_content = True enrolled_attackers = [] enemy_queue = [] active_assignments = {} round_robin_index = 0 class HitDispatchBot(commands.Bot): async def setup_hook(self): # Load cogs with injected state await self.add_cog( Assignments( self, enemy_queue=enemy_queue, active_assignments=active_assignments, enrolled_attackers=enrolled_attackers, hit_check=HIT_CHECK_INTERVAL, reassign_delay=REASSIGN_DELAY ) ) await self.add_cog( HitCommands( self, enrolled_attackers=enrolled_attackers, enemy_queue=enemy_queue ) ) async def cog_check(self, ctx): return ctx.channel.id == ALLOWED_CHANNEL_ID bot = HitDispatchBot(command_prefix="!", intents=intents) @bot.event async def on_ready(): print(f"Logged in as {bot.user.name}") TOKEN = "YOUR_DISCORD_TOKEN" async def start_bot(): await bot.start(TOKEN) # ----------------------------- # Main entry # ----------------------------- if __name__ == "__main__": loop = asyncio.get_event_loop() # Start Discord bot in background loop.create_task(start_bot()) # Run FastAPI (this will keep the loop alive) uvicorn.run(app, host="127.0.0.1", port=8000)