Files
faction_war_dispatch_bot/routers/discord_mappings.py

86 lines
2.5 KiB
Python

"""Discord ID to Torn ID mapping management endpoints."""
import json
from pathlib import Path
from fastapi import APIRouter, HTTPException
from typing import Optional
from models import DiscordMappingRequest
from services.bot_assignment import BotAssignmentManager
router = APIRouter(prefix="/api", tags=["discord_mappings"])
# Global reference to assignment manager (set by main.py)
assignment_manager: Optional[BotAssignmentManager] = None
def set_assignment_manager(manager: BotAssignmentManager):
#Set the global assignment manager reference.
global assignment_manager
assignment_manager = manager
@router.get("/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", {})}
@router.post("/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}
@router.delete("/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")