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, Form from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from services.torn_api import update_enemy_faction, update_friendly_faction 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}) # ----------------------------- # API Endpoints # ----------------------------- @app.post("/api/enemy") async def api_enemy(faction_id: int, interval: int): await update_enemy_faction(faction_id, interval) return {"status": "enemy loop running", "id": faction_id, "interval": interval} @app.post("/api/friendly") async def api_friendly(faction_id: int, interval: int): await update_friendly_faction(faction_id, interval) return {"status": "friendly loop running", "id": faction_id, "interval": interval} # Discord 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) 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)