126 lines
3.7 KiB
Python
126 lines
3.7 KiB
Python
# main.py
|
|
import discord
|
|
from discord.ext import commands
|
|
import config as app_config
|
|
from cogs.assignments import Assignments
|
|
from cogs.commands import HitCommands
|
|
|
|
import asyncio
|
|
import uvicorn
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.staticfiles import StaticFiles
|
|
|
|
from services.bot_assignment import BotAssignmentManager
|
|
|
|
# Import routers
|
|
from routers import pages, factions, assignments, discord_mappings, config, auth, activity
|
|
from routers import bot as bot_router
|
|
|
|
|
|
# FastAPI Setup
|
|
app = FastAPI()
|
|
|
|
app.mount("/static", StaticFiles(directory="static"), name="static")
|
|
|
|
# Include all routers
|
|
app.include_router(auth.router)
|
|
app.include_router(pages.router)
|
|
app.include_router(factions.router)
|
|
app.include_router(assignments.router)
|
|
app.include_router(bot_router.router)
|
|
app.include_router(discord_mappings.router)
|
|
app.include_router(config.router)
|
|
app.include_router(activity.router)
|
|
|
|
|
|
# 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):
|
|
await self.add_cog(
|
|
Assignments(
|
|
self,
|
|
enemy_queue=enemy_queue,
|
|
active_assignments=active_assignments,
|
|
enrolled_attackers=enrolled_attackers,
|
|
hit_check=app_config.HIT_CHECK_INTERVAL,
|
|
reassign_delay=app_config.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 == app_config.ALLOWED_CHANNEL_ID
|
|
|
|
bot = HitDispatchBot(command_prefix="!", intents=intents)
|
|
|
|
# Initialize bot assignment manager
|
|
assignment_manager = None
|
|
|
|
@bot.event
|
|
async def on_ready():
|
|
global assignment_manager
|
|
print(f"Discord bot logged in as {bot.user.name} (ID: {bot.user.id})")
|
|
print(f"Bot is in {len(bot.guilds)} server(s)")
|
|
|
|
# Initialize assignment manager
|
|
assignment_manager = BotAssignmentManager(bot)
|
|
|
|
# Set assignment manager in routers
|
|
bot_router.set_assignment_manager(assignment_manager)
|
|
discord_mappings.set_assignment_manager(assignment_manager)
|
|
|
|
print("Bot assignment manager initialized")
|
|
|
|
async def start_bot():
|
|
try:
|
|
print("Starting Discord bot...")
|
|
await bot.start(app_config.DISCORD_TOKEN)
|
|
except discord.LoginFailure:
|
|
print("ERROR: Invalid Discord token! Please set DISCORD_TOKEN in config.py")
|
|
except Exception as e:
|
|
print(f"ERROR starting Discord bot: {e}")
|
|
|
|
# Main Entry Point
|
|
async def main():
|
|
# Parse command-line arguments
|
|
import argparse
|
|
import os
|
|
|
|
# Read from environment variables first, then fall back to defaults
|
|
default_port = int(os.getenv("PORT", "8000"))
|
|
default_host = os.getenv("HOST", "127.0.0.1")
|
|
|
|
parser = argparse.ArgumentParser(description="Faction War Dispatch Bot")
|
|
parser.add_argument("--port", type=int, default=default_port, help=f"Port to run the application on (default: {default_port})")
|
|
parser.add_argument("--host", type=str, default=default_host, help=f"Host to bind to (default: {default_host})")
|
|
args = parser.parse_args()
|
|
|
|
# Start Discord bot in background
|
|
bot_task = asyncio.create_task(start_bot())
|
|
|
|
# Configure and run FastAPI server
|
|
config = uvicorn.Config(app, host=args.host, port=args.port, log_level="info")
|
|
server = uvicorn.Server(config)
|
|
|
|
print(f"Starting server on {args.host}:{args.port}")
|
|
await server.serve()
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|