186 lines
6.3 KiB
Python
186 lines
6.3 KiB
Python
#Faction data population and status management endpoints.
|
|
import json
|
|
from pathlib import Path
|
|
from fastapi import APIRouter, Request, HTTPException
|
|
|
|
from models import FactionRequest
|
|
from services.server_state import STATE
|
|
from services.torn_api import (
|
|
populate_friendly,
|
|
populate_enemy,
|
|
start_friendly_status_loop,
|
|
start_enemy_status_loop,
|
|
stop_friendly_status_loop,
|
|
stop_enemy_status_loop
|
|
)
|
|
from services.activity_log import activity_logger
|
|
from utils import load_json_list
|
|
from utils.auth import get_current_user
|
|
|
|
router = APIRouter(prefix="/api", tags=["factions"])
|
|
|
|
|
|
@router.post("/populate_friendly")
|
|
async def api_populate_friendly(request: Request, data: FactionRequest):
|
|
# Get username for logging
|
|
try:
|
|
user_info = get_current_user(request)
|
|
username = user_info.get("username", "Unknown")
|
|
except:
|
|
username = "Unknown"
|
|
|
|
try:
|
|
await activity_logger.log_action(
|
|
username,
|
|
"Populate Friendly",
|
|
f"Starting population for faction {data.faction_id}"
|
|
)
|
|
|
|
result = await populate_friendly(data.faction_id)
|
|
|
|
if not result:
|
|
await activity_logger.log_action(
|
|
username,
|
|
"Populate Friendly Failed",
|
|
f"Failed to populate faction {data.faction_id} - API returned False (check API key, faction ID, or network)"
|
|
)
|
|
raise HTTPException(status_code=500, detail="Failed to populate friendly faction - check logs")
|
|
|
|
# Return members list for frontend (already in STATE from populate_friendly)
|
|
members = [m.model_dump() for m in STATE.friendly.values()]
|
|
|
|
await activity_logger.log_action(
|
|
username,
|
|
"Populate Friendly Success",
|
|
f"Populated {len(members)} members from faction {data.faction_id}"
|
|
)
|
|
|
|
return {"status": "friendly populated", "id": data.faction_id, "members": members}
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
error_msg = f"Error populating friendly faction {data.faction_id}: {type(e).__name__}: {str(e)}"
|
|
await activity_logger.log_action(username, "Populate Friendly Error", error_msg)
|
|
raise HTTPException(status_code=500, detail=error_msg)
|
|
|
|
|
|
@router.post("/populate_enemy")
|
|
async def api_populate_enemy(request: Request, data: FactionRequest):
|
|
# Get username for logging
|
|
try:
|
|
user_info = get_current_user(request)
|
|
username = user_info.get("username", "Unknown")
|
|
except:
|
|
username = "Unknown"
|
|
|
|
try:
|
|
await activity_logger.log_action(
|
|
username,
|
|
"Populate Enemy",
|
|
f"Starting population for faction {data.faction_id}"
|
|
)
|
|
|
|
result = await populate_enemy(data.faction_id)
|
|
|
|
if not result:
|
|
await activity_logger.log_action(
|
|
username,
|
|
"Populate Enemy Failed",
|
|
f"Failed to populate faction {data.faction_id} - API returned False (check API key, faction ID, or network)"
|
|
)
|
|
raise HTTPException(status_code=500, detail="Failed to populate enemy faction - check logs")
|
|
|
|
# Return members list for frontend (already in STATE from populate_enemy)
|
|
members = [m.model_dump() for m in STATE.enemy.values()]
|
|
|
|
await activity_logger.log_action(
|
|
username,
|
|
"Populate Enemy Success",
|
|
f"Populated {len(members)} members from faction {data.faction_id}"
|
|
)
|
|
|
|
return {"status": "enemy populated", "id": data.faction_id, "members": members}
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
error_msg = f"Error populating enemy faction {data.faction_id}: {type(e).__name__}: {str(e)}"
|
|
await activity_logger.log_action(username, "Populate Enemy Error", error_msg)
|
|
raise HTTPException(status_code=500, detail=error_msg)
|
|
|
|
|
|
@router.post("/start_friendly_status")
|
|
async def api_start_friendly_status(data: FactionRequest):
|
|
await start_friendly_status_loop(data.faction_id, data.interval)
|
|
return {"status": "friendly status loop started", "id": data.faction_id, "interval": data.interval}
|
|
|
|
|
|
@router.post("/start_enemy_status")
|
|
async def api_start_enemy_status(data: FactionRequest):
|
|
await start_enemy_status_loop(data.faction_id, data.interval)
|
|
return {"status": "enemy status loop started", "id": data.faction_id, "interval": data.interval}
|
|
|
|
|
|
@router.get("/friendly_members")
|
|
async def get_friendly_members():
|
|
# Return list, but prefer STATE if populated
|
|
if STATE.friendly:
|
|
return [m.model_dump() for m in STATE.friendly.values()]
|
|
# fallback to file
|
|
path = Path("data/friendly_members.json")
|
|
return load_json_list(path)
|
|
|
|
|
|
@router.get("/enemy_members")
|
|
async def get_enemy_members():
|
|
if STATE.enemy:
|
|
return [m.model_dump() for m in STATE.enemy.values()]
|
|
path = Path("data/enemy_members.json")
|
|
return load_json_list(path)
|
|
|
|
|
|
@router.get("/friendly_status")
|
|
async def api_friendly_status():
|
|
path = Path("data/friendly_status.json")
|
|
if not path.exists():
|
|
return {}
|
|
with open(path, "r", encoding="utf-8") as f:
|
|
return json.load(f)
|
|
|
|
|
|
@router.get("/enemy_status")
|
|
async def api_enemy_status():
|
|
path = Path("data/enemy_status.json")
|
|
if not path.exists():
|
|
return {}
|
|
with open(path, "r", encoding="utf-8") as f:
|
|
return json.load(f)
|
|
|
|
|
|
@router.post("/stop_friendly_status")
|
|
async def api_stop_friendly_status():
|
|
await stop_friendly_status_loop()
|
|
return {"status": "friendly status loop stopped"}
|
|
|
|
|
|
@router.post("/stop_enemy_status")
|
|
async def api_stop_enemy_status():
|
|
await stop_enemy_status_loop()
|
|
return {"status": "enemy status loop stopped"}
|
|
|
|
|
|
@router.get("/dashboard_state")
|
|
async def get_dashboard_state():
|
|
"""Get current dashboard state for restoring UI on page load"""
|
|
return {
|
|
"friendly_faction_id": STATE.friendly_faction_id,
|
|
"enemy_faction_id": STATE.enemy_faction_id,
|
|
"friendly_members": [m.model_dump() for m in STATE.friendly.values()],
|
|
"enemy_members": [m.model_dump() for m in STATE.enemy.values()],
|
|
"friendly_status_interval": STATE.friendly_status_interval,
|
|
"enemy_status_interval": STATE.enemy_status_interval,
|
|
"friendly_status_running": STATE.friendly_status_running,
|
|
"enemy_status_running": STATE.enemy_status_running
|
|
}
|