generated from nhcarrigan/template
a40188413a
All Python cohort scripts now use DATA_DIR = Path(__file__).parent.parent.parent / "data" to correctly resolve the repo-root data/ directory regardless of the working directory set by run.sh. All TypeScript scripts have expanded JSDoc headers documenting data file requirements and environment variables.
130 lines
4.1 KiB
Python
130 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Fix Send Messages / Send Messages in Threads permissions for a Discord channel.
|
|
|
|
Denies Send Messages and Send Messages in Threads for both @everyone and the
|
|
@cohort role on the target channel. Update CHANNEL_ID and COHORT_ROLE_ID before
|
|
running.
|
|
|
|
Data files (place in data/):
|
|
- None
|
|
|
|
Env vars:
|
|
- DISCORD_BOT_TOKEN Bot token for the Discord API
|
|
"""
|
|
|
|
import asyncio
|
|
import os
|
|
|
|
import aiohttp
|
|
|
|
DISCORD_BOT_TOKEN = os.environ["DISCORD_BOT_TOKEN"]
|
|
BASE_URL = "https://discord.com/api/v10"
|
|
GUILD_ID = "739845668582981683"
|
|
CHANNEL_ID = "1467964405646885237"
|
|
|
|
SEND_MESSAGES = 0x0000000000000800
|
|
SEND_MESSAGES_IN_THREADS = 0x0000004000000000
|
|
|
|
EVERYONE_ROLE_ID = GUILD_ID
|
|
COHORT_ROLE_ID = "1390925253102010521"
|
|
|
|
|
|
async def fix_permissions() -> None:
|
|
"""Fix the channel permissions."""
|
|
headers = {
|
|
"Authorization": f"Bot {DISCORD_BOT_TOKEN}",
|
|
"Content-Type": "application/json",
|
|
}
|
|
|
|
async with aiohttp.ClientSession() as session:
|
|
print("Fetching current channel permissions...")
|
|
async with session.get(
|
|
f"{BASE_URL}/channels/{CHANNEL_ID}", headers=headers
|
|
) as resp:
|
|
if resp.status != 200:
|
|
error = await resp.text()
|
|
print(f"Error fetching channel: {resp.status} - {error}")
|
|
return
|
|
|
|
channel = await resp.json()
|
|
print(f"Channel: {channel['name']}")
|
|
|
|
permission_overwrites = channel.get("permission_overwrites", [])
|
|
|
|
everyone_overwrite = None
|
|
cohort_overwrite = None
|
|
|
|
for overwrite in permission_overwrites:
|
|
if overwrite["id"] == EVERYONE_ROLE_ID:
|
|
everyone_overwrite = overwrite
|
|
elif overwrite["id"] == COHORT_ROLE_ID:
|
|
cohort_overwrite = overwrite
|
|
|
|
print("\nFixing @everyone permissions...")
|
|
if everyone_overwrite:
|
|
current_deny = int(everyone_overwrite.get("deny", "0"))
|
|
current_allow = int(everyone_overwrite.get("allow", "0"))
|
|
|
|
new_deny = current_deny | SEND_MESSAGES | SEND_MESSAGES_IN_THREADS
|
|
new_allow = current_allow & ~SEND_MESSAGES & ~SEND_MESSAGES_IN_THREADS
|
|
|
|
payload = {
|
|
"type": 0,
|
|
"deny": str(new_deny),
|
|
"allow": str(new_allow),
|
|
}
|
|
else:
|
|
payload = {
|
|
"type": 0,
|
|
"deny": str(SEND_MESSAGES | SEND_MESSAGES_IN_THREADS),
|
|
"allow": "0",
|
|
}
|
|
|
|
async with session.put(
|
|
f"{BASE_URL}/channels/{CHANNEL_ID}/permissions/{EVERYONE_ROLE_ID}",
|
|
headers=headers,
|
|
json=payload,
|
|
) as resp:
|
|
if resp.status == 204:
|
|
print("✅ @everyone permissions fixed!")
|
|
else:
|
|
error = await resp.text()
|
|
print(f"❌ Error fixing @everyone: {resp.status} - {error}")
|
|
|
|
print("\nFixing @cohort permissions...")
|
|
if cohort_overwrite:
|
|
current_deny = int(cohort_overwrite.get("deny", "0"))
|
|
current_allow = int(cohort_overwrite.get("allow", "0"))
|
|
|
|
new_deny = current_deny | SEND_MESSAGES | SEND_MESSAGES_IN_THREADS
|
|
new_allow = current_allow & ~SEND_MESSAGES & ~SEND_MESSAGES_IN_THREADS
|
|
|
|
payload = {
|
|
"type": 0,
|
|
"deny": str(new_deny),
|
|
"allow": str(new_allow),
|
|
}
|
|
else:
|
|
payload = {
|
|
"type": 0,
|
|
"deny": str(SEND_MESSAGES | SEND_MESSAGES_IN_THREADS),
|
|
"allow": "0",
|
|
}
|
|
|
|
async with session.put(
|
|
f"{BASE_URL}/channels/{CHANNEL_ID}/permissions/{COHORT_ROLE_ID}",
|
|
headers=headers,
|
|
json=payload,
|
|
) as resp:
|
|
if resp.status == 204:
|
|
print("✅ @cohort permissions fixed!")
|
|
else:
|
|
error = await resp.text()
|
|
print(f"❌ Error fixing @cohort: {resp.status} - {error}")
|
|
|
|
print("\n✨ Done! Permissions have been fixed.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(fix_permissions())
|