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.
89 lines
2.6 KiB
Python
89 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Get all members who currently have the Cohort role."""
|
|
|
|
import asyncio
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
|
|
import aiohttp
|
|
|
|
DATA_DIR = Path(__file__).parent.parent.parent / "data"
|
|
|
|
DISCORD_BOT_TOKEN = os.environ["DISCORD_BOT_TOKEN"]
|
|
GUILD_ID = "692816967895220344"
|
|
COHORT_ROLE_ID = "1464314780935258112"
|
|
|
|
|
|
async def get_all_members_with_role(
|
|
session: aiohttp.ClientSession,
|
|
) -> list[dict[str, str]]:
|
|
"""Get all members who have the Cohort role."""
|
|
members = []
|
|
headers = {"Authorization": f"Bot {DISCORD_BOT_TOKEN}"}
|
|
|
|
after = None
|
|
|
|
while True:
|
|
url = f"https://discord.com/api/v10/guilds/{GUILD_ID}/members"
|
|
params: dict[str, str | int] = {"limit": 1000}
|
|
if after:
|
|
params["after"] = after
|
|
|
|
async with session.get(url, headers=headers, params=params) as resp:
|
|
if resp.status != 200:
|
|
error_text = await resp.text()
|
|
raise RuntimeError(
|
|
f"Failed to fetch members: {resp.status} - {error_text}"
|
|
)
|
|
|
|
data = await resp.json()
|
|
|
|
if not data:
|
|
break
|
|
|
|
for member in data:
|
|
if COHORT_ROLE_ID in member.get("roles", []):
|
|
members.append(
|
|
{
|
|
"id": member["user"]["id"],
|
|
"username": member["user"]["username"],
|
|
"display_name": member.get("nick")
|
|
or member["user"]["username"],
|
|
}
|
|
)
|
|
|
|
if len(data) < 1000:
|
|
break
|
|
|
|
after = data[-1]["user"]["id"]
|
|
|
|
return members
|
|
|
|
|
|
async def main() -> None:
|
|
"""Get all cohort members with the Cohort role."""
|
|
async with aiohttp.ClientSession() as session:
|
|
print("Fetching all members with Cohort role...")
|
|
|
|
cohort_members = await get_all_members_with_role(session)
|
|
|
|
print(f"\n✨ Found {len(cohort_members)} members with the Cohort role:\n")
|
|
|
|
for i, member in enumerate(cohort_members, 1):
|
|
print(
|
|
f"{i}. {member['display_name']} (@{member['username']}) - ID: {member['id']}" # noqa: E501
|
|
)
|
|
|
|
with open(DATA_DIR / "active_cohort_members.json", "w") as f:
|
|
json.dump(cohort_members, f, indent=2)
|
|
|
|
print("\nSaved to active_cohort_members.json")
|
|
|
|
print("\nMember IDs only:")
|
|
print(json.dumps([m["id"] for m in cohort_members], indent=2))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|