Basic Discord functionality with assignments

This commit is contained in:
2026-01-25 18:56:11 -05:00
parent ee7114d25d
commit 055abd501f
9 changed files with 431 additions and 5 deletions

111
main.py
View File

@@ -1,7 +1,7 @@
# main.py (updated)
import discord
from discord.ext import commands
from config import ALLOWED_CHANNEL_ID, HIT_CHECK_INTERVAL, REASSIGN_DELAY
from config import ALLOWED_CHANNEL_ID, HIT_CHECK_INTERVAL, REASSIGN_DELAY, DISCORD_TOKEN
from cogs.assignments import Assignments
from cogs.commands import HitCommands
@@ -21,6 +21,7 @@ from pydantic import BaseModel
from services.server_state import STATE, Member
from services.torn_api import populate_friendly, populate_enemy, start_friendly_status_loop, start_enemy_status_loop
from services.bot_assignment import BotAssignmentManager
# ============================================================
# FastAPI Setup
@@ -56,6 +57,10 @@ class RemoveAssignmentRequest(BaseModel):
class BotControl(BaseModel):
action: str # "start" or "stop"
class DiscordMappingRequest(BaseModel):
torn_id: int
discord_id: int
# ================================
# Helper: load JSON file into STATE
# ================================
@@ -201,13 +206,98 @@ async def api_clear_assignments():
# =============================
# Bot control endpoint
# =============================
@app.get("/api/bot_status")
async def api_bot_status():
"""Get current bot status"""
active_count = len(assignment_manager.active_targets) if assignment_manager else 0
return {
"bot_running": STATE.bot_running,
"active_assignments": active_count,
"discord_mappings_count": len(assignment_manager.discord_mapping) if assignment_manager else 0
}
@app.post("/api/bot_control")
async def api_bot_control(req: BotControl):
if req.action not in ("start", "stop"):
raise HTTPException(status_code=400, detail="invalid action")
STATE.bot_running = (req.action == "start")
# Start or stop the assignment manager
if assignment_manager:
if req.action == "start":
await assignment_manager.start()
else:
await assignment_manager.stop()
return {"status": "ok", "bot_running": STATE.bot_running}
# =============================
# Discord Mapping endpoints
# =============================
@app.get("/api/discord_mappings")
async def get_discord_mappings():
"""Get all Torn ID to Discord ID mappings"""
path = Path("data/discord_mapping.json")
if not path.exists():
return {"mappings": {}}
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
return {"mappings": data.get("mappings", {})}
@app.post("/api/discord_mapping")
async def add_discord_mapping(req: DiscordMappingRequest):
"""Add or update a Torn ID to Discord ID mapping"""
path = Path("data/discord_mapping.json")
# Load existing mappings
if path.exists():
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
else:
data = {"comment": "Map Torn player IDs to Discord user IDs", "mappings": {}}
# Update mapping
data["mappings"][str(req.torn_id)] = str(req.discord_id)
# Save back
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2)
# Reload in assignment manager
if assignment_manager:
assignment_manager.load_discord_mapping()
return {"status": "ok", "torn_id": req.torn_id, "discord_id": req.discord_id}
@app.delete("/api/discord_mapping/{torn_id}")
async def remove_discord_mapping(torn_id: int):
"""Remove a Discord mapping"""
path = Path("data/discord_mapping.json")
if not path.exists():
raise HTTPException(status_code=404, detail="No mappings found")
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
# Remove mapping
if str(torn_id) in data.get("mappings", {}):
del data["mappings"][str(torn_id)]
# Save back
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2)
# Reload in assignment manager
if assignment_manager:
assignment_manager.load_discord_mapping()
return {"status": "ok", "torn_id": torn_id}
else:
raise HTTPException(status_code=404, detail="Mapping not found")
# ============================================================
# Reset Groups Endpoint
@@ -257,14 +347,27 @@ class HitDispatchBot(commands.Bot):
bot = HitDispatchBot(command_prefix="!", intents=intents)
# Initialize bot assignment manager
assignment_manager = None
@bot.event
async def on_ready():
print(f"Logged in as {bot.user.name}")
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)")
TOKEN = "YOUR_DISCORD_TOKEN"
# Initialize assignment manager
assignment_manager = BotAssignmentManager(bot)
print("✓ Bot assignment manager initialized")
async def start_bot():
await bot.start(TOKEN)
try:
print("Starting Discord bot...")
await bot.start(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