49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Register (upsert) Thermograph's Discord slash commands. Run once, and again
|
|
whenever the command list below changes.
|
|
|
|
THERMOGRAPH_DISCORD_APP_ID=... THERMOGRAPH_DISCORD_BOT_TOKEN=... \
|
|
python scripts/register_discord_commands.py
|
|
|
|
This is a one-off admin action, not part of the running app: it PUTs the full
|
|
command set to Discord's REST API (a global overwrite). The app itself answers the
|
|
commands over the HTTP interactions endpoint (notifications/discord_interactions.py) and
|
|
needs no bot process. Global commands can take up to an hour to propagate.
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
import httpx
|
|
|
|
APP_ID = os.environ.get("THERMOGRAPH_DISCORD_APP_ID", "").strip()
|
|
BOT_TOKEN = os.environ.get("THERMOGRAPH_DISCORD_BOT_TOKEN", "").strip()
|
|
|
|
# CHAT_INPUT command (type 1) with one required STRING option (type 3).
|
|
COMMANDS = [
|
|
{
|
|
"name": "grade",
|
|
"description": "How unusual is a city's weather today?",
|
|
"type": 1,
|
|
"options": [
|
|
{"name": "city", "description": "City name, e.g. Tokyo", "type": 3, "required": True},
|
|
],
|
|
},
|
|
]
|
|
|
|
|
|
def main() -> int:
|
|
if not APP_ID or not BOT_TOKEN:
|
|
print("Set THERMOGRAPH_DISCORD_APP_ID and THERMOGRAPH_DISCORD_BOT_TOKEN.", file=sys.stderr)
|
|
return 2
|
|
url = f"https://discord.com/api/v10/applications/{APP_ID}/commands"
|
|
resp = httpx.put(url, headers={"Authorization": f"Bot {BOT_TOKEN}"}, json=COMMANDS, timeout=30.0)
|
|
if resp.status_code >= 300:
|
|
print(f"Discord rejected the registration ({resp.status_code}): {resp.text}", file=sys.stderr)
|
|
return 1
|
|
names = ", ".join("/" + c["name"] for c in resp.json())
|
|
print(f"Registered {len(COMMANDS)} command(s): {names}")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|