Files
faction_war_dispatch_bot/main.py
2025-11-26 16:35:23 -05:00

103 lines
2.7 KiB
Python

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)