Files
miku-discord/bot/routes/evil_mode.py
koko210Serve edc9f27925 feat: add proper HTTP status codes to all API error responses
- 217 error returns across 18 route files + api.py now use JSONResponse
  with appropriate HTTP status codes instead of returning HTTP 200
- Status code distribution: 500 (121), 400 (39), 503 (28), 404 (24), 409 (3), 502 (2)
- Fixed language.py tuple-return bug (was serializing as JSON array)
- Fixed bare except clauses in bipolar_mode.py and voice.py
- Body-level error schemas preserved (status/error + success/error patterns)
  so web UI continues working without changes
- chat.py (SSE) unchanged: errors sent within stream protocol
- All 170 tests pass
2026-04-15 15:43:18 +03:00

112 lines
4.0 KiB
Python

"""Evil mode routes."""
from fastapi import APIRouter
from fastapi.responses import JSONResponse
import globals
from routes.models import EvilMoodSetRequest
from utils.logger import get_logger
logger = get_logger('api')
router = APIRouter()
@router.get("/evil-mode")
def get_evil_mode_status():
"""Get current evil mode status"""
from utils.evil_mode import is_evil_mode, get_current_evil_mood
evil_mode = is_evil_mode()
if evil_mode:
mood, mood_desc = get_current_evil_mood()
return {
"evil_mode": True,
"mood": mood,
"description": mood_desc,
"available_moods": globals.EVIL_AVAILABLE_MOODS
}
return {
"evil_mode": False,
"mood": None,
"description": None,
"available_moods": globals.EVIL_AVAILABLE_MOODS
}
@router.post("/evil-mode/enable")
def enable_evil_mode():
"""Enable evil mode"""
from utils.evil_mode import apply_evil_mode_changes
if globals.EVIL_MODE:
return {"status": "ok", "message": "Evil mode is already enabled", "evil_mode": True}
if globals.client and globals.client.loop and globals.client.loop.is_running():
globals.client.loop.create_task(apply_evil_mode_changes(globals.client))
return {"status": "ok", "message": "Evil mode enabled", "evil_mode": True}
else:
return JSONResponse(status_code=503, content={"status": "error", "message": "Discord client not ready"})
@router.post("/evil-mode/disable")
def disable_evil_mode():
"""Disable evil mode"""
from utils.evil_mode import revert_evil_mode_changes
if not globals.EVIL_MODE:
return {"status": "ok", "message": "Evil mode is already disabled", "evil_mode": False}
if globals.client and globals.client.loop and globals.client.loop.is_running():
globals.client.loop.create_task(revert_evil_mode_changes(globals.client))
return {"status": "ok", "message": "Evil mode disabled", "evil_mode": False}
else:
return JSONResponse(status_code=503, content={"status": "error", "message": "Discord client not ready"})
@router.post("/evil-mode/toggle")
def toggle_evil_mode():
"""Toggle evil mode on/off"""
from utils.evil_mode import apply_evil_mode_changes, revert_evil_mode_changes
if not globals.client or not globals.client.loop or not globals.client.loop.is_running():
return JSONResponse(status_code=503, content={"status": "error", "message": "Discord client not ready"})
if globals.EVIL_MODE:
globals.client.loop.create_task(revert_evil_mode_changes(globals.client))
return {"status": "ok", "message": "Evil mode disabled", "evil_mode": False}
else:
globals.client.loop.create_task(apply_evil_mode_changes(globals.client))
return {"status": "ok", "message": "Evil mode enabled", "evil_mode": True}
@router.get("/evil-mode/mood")
def get_evil_mood():
"""Get current evil mood"""
from utils.evil_mode import get_current_evil_mood
mood, mood_desc = get_current_evil_mood()
return {
"mood": mood,
"description": mood_desc,
"available_moods": globals.EVIL_AVAILABLE_MOODS
}
@router.post("/evil-mode/mood")
def set_evil_mood_endpoint(data: EvilMoodSetRequest):
"""Set evil mood"""
from utils.evil_mode import set_evil_mood, is_valid_evil_mood, update_all_evil_nicknames
if not is_valid_evil_mood(data.mood):
return JSONResponse(status_code=400, content={
"status": "error",
"message": f"Mood '{data.mood}' not recognized. Available evil moods: {', '.join(globals.EVIL_AVAILABLE_MOODS)}"
})
success = set_evil_mood(data.mood)
if success:
# Update nicknames if evil mode is active
if globals.EVIL_MODE and globals.client and globals.client.loop and globals.client.loop.is_running():
globals.client.loop.create_task(update_all_evil_nicknames(globals.client))
return {"status": "ok", "new_mood": data.mood}
return JSONResponse(status_code=500, content={"status": "error", "message": "Failed to set evil mood"})