From 3ca2bc077f6788770d58a95bf479a80ff4631f94 Mon Sep 17 00:00:00 2001 From: Kingston-SCYD Date: Fri, 5 Jun 2026 20:30:00 -0500 Subject: [PATCH] Add /api/mc/login endpoint for Minecraft mod auth --- ttstoy/webui/app.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/ttstoy/webui/app.py b/ttstoy/webui/app.py index 5db5a9e..5bc7d6a 100644 --- a/ttstoy/webui/app.py +++ b/ttstoy/webui/app.py @@ -584,6 +584,38 @@ def _resolve_guild_id() -> str: return "" +# --------------------------------------------------------------------------- +# Routes — Minecraft Mod API +# --------------------------------------------------------------------------- + +@app.route("/api/mc/login", methods=["POST"]) +def api_mc_login(): + """Minecraft mod login endpoint. Accepts JSON {"token": "..."} and returns user info + voices.""" + data = request.get_json(force=True) if request.is_json else {} + token = data.get("token", "").strip() + if not token: + return jsonify({"error": "Missing token"}), 400 + + entry = consume_login_token(token) + if not entry: + return jsonify({"error": "Invalid or expired token. Run [p]ttstoy login in Discord."}), 401 + + user_id = entry["user_id"] + ucfg = get_user_config(user_id) + voices = ucfg.get("chatterbox_voices", []) + result = [] + for v in voices: + parts = v.split("_", 1) + display = parts[1].rsplit(".", 1)[0] if len(parts) > 1 else v.rsplit(".", 1)[0] + result.append({"filename": v, "display": display}) + + return jsonify({ + "user_id": user_id, + "discord_name": entry.get("discord_name", "Unknown"), + "voices": result, + }) + + # --------------------------------------------------------------------------- # Routes — Chatterbox voice management # ---------------------------------------------------------------------------