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.
104 lines
2.8 KiB
Python
104 lines
2.8 KiB
Python
"""Update team roster messages in Discord from team_assignments.json."""
|
|
|
|
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"
|
|
|
|
API_BASE = "https://discord.com/api/v10"
|
|
|
|
|
|
async def edit_message(
|
|
session: aiohttp.ClientSession,
|
|
channel_id: str,
|
|
message_id: str,
|
|
content: str,
|
|
) -> bool:
|
|
"""Edit a Discord message."""
|
|
url = f"{API_BASE}/channels/{channel_id}/messages/{message_id}"
|
|
headers = {
|
|
"Authorization": f"Bot {DISCORD_BOT_TOKEN}",
|
|
"Content-Type": "application/json",
|
|
}
|
|
payload = {"content": content}
|
|
|
|
async with session.patch(url, headers=headers, json=payload) as resp:
|
|
if resp.status == 200:
|
|
return True
|
|
text = await resp.text()
|
|
print(f" ❌ Failed to edit message: {resp.status} - {text}")
|
|
return False
|
|
|
|
|
|
def generate_roster(team: dict, discord_to_github: dict) -> str:
|
|
"""Generate roster message for a team."""
|
|
team_name = team["name"]
|
|
|
|
leader_lines = [
|
|
f"- <@{discord_id}> ({discord_to_github.get(discord_id, 'Unknown')})"
|
|
for discord_id in team["leaders"]
|
|
]
|
|
|
|
participant_lines = [
|
|
f"- <@{discord_id}> ({discord_to_github.get(discord_id, 'Unknown')})"
|
|
for discord_id in team["participants"]
|
|
]
|
|
|
|
leaders_text = "\n".join(leader_lines) if leader_lines else "None"
|
|
participants_text = "\n".join(participant_lines) if participant_lines else "None"
|
|
|
|
return f"""# Team {team_name}
|
|
|
|
**Leaders:**
|
|
{leaders_text}
|
|
|
|
**Participants:**
|
|
{participants_text}"""
|
|
|
|
|
|
async def main() -> None:
|
|
"""Update roster messages for all teams."""
|
|
with open(DATA_DIR / "team_message_ids.json") as f:
|
|
team_data = json.load(f)
|
|
|
|
with open(DATA_DIR / "team_assignments.json") as f:
|
|
teams = json.load(f)
|
|
|
|
with open(DATA_DIR / "discord_to_github.json") as f:
|
|
discord_to_github = json.load(f)
|
|
|
|
async with aiohttp.ClientSession() as session:
|
|
for team in teams:
|
|
team_name = team["name"]
|
|
print(f"Updating roster for {team_name}...")
|
|
|
|
if team_name not in team_data:
|
|
print(" ⚠️ Team not found in team_message_ids.json")
|
|
continue
|
|
|
|
channel_id = team_data[team_name]["channel_id"]
|
|
message_id = team_data[team_name]["message_id"]
|
|
|
|
roster_content = generate_roster(team, discord_to_github)
|
|
|
|
success = await edit_message(
|
|
session, channel_id, message_id, roster_content
|
|
)
|
|
if success:
|
|
print(f" ✅ Updated (Message ID: {message_id})")
|
|
|
|
await asyncio.sleep(0.5)
|
|
|
|
print("\n✅ All roster messages updated!")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|