"""Send biweekly check-in messages to all team Discord channels. Posts a check-in prompt to each team channel and automatically creates a thread for responses. Members who do not respond by the deadline may be removed for inactivity. Data files (place in data/): - team_message_ids.json Channel IDs per team (generated by send_team_messages.py) Env vars: - DISCORD_BOT_TOKEN Bot token for the Discord API """ 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"] DISCORD_API = "https://discord.com/api/v10" GUILD_ID = "692816967895220344" CHECK_IN_MESSAGE = """@everyone it is time for Naomi to do a check in. I need **each and every one of you** to respond to this message **in the thread** by Monday, or you **will be removed** for inactivity. 1. What have you achieved over the last two weeks? 2. What is your focus for the next two weeks? 3. How much time can you **reliably** commit to your team over the next two weeks? 4. Are you facing any **blockers** or **challenges** that are preventing you from contributing? 5. Do you need **help** from your team leaders or from Naomi to get unstuck? """ async def send_checkin_to_teams() -> None: """Send check-in message to all team channels (except Jade Jasmine).""" with open(DATA_DIR / "team_message_ids.json") as f: team_data = json.load(f) headers = { "Authorization": f"Bot {DISCORD_BOT_TOKEN}", "Content-Type": "application/json", } async with aiohttp.ClientSession() as session: for team_name, data in team_data.items(): if team_name == "jade-jasmine": print(f"โญ๏ธ Skipping {team_name} (dissolved)") continue channel_id = data["channel_id"] print(f"๐Ÿ“ค Sending check-in to {team_name} (channel {channel_id})...") async with session.post( f"{DISCORD_API}/channels/{channel_id}/messages", headers=headers, json={"content": CHECK_IN_MESSAGE}, ) as resp: if resp.status == 200: message_data = await resp.json() message_id = message_data["id"] print(f" โœ… Message sent! Message ID: {message_id}") thread_name = ( f"Check-in Responses - {team_name.replace('-', ' ').title()}" ) async with session.post( f"{DISCORD_API}/channels/{channel_id}/messages/{message_id}/threads", headers=headers, json={ "name": thread_name, "auto_archive_duration": 10080, }, ) as thread_resp: if thread_resp.status == 201: thread_data = await thread_resp.json() thread_id = thread_data["id"] print(f" ๐Ÿงต Thread created! Thread ID: {thread_id}") else: error_text = await thread_resp.text() print( f" โŒ Failed to create thread: " f"{thread_resp.status} - {error_text}" ) else: error_text = await resp.text() print(f" โŒ Failed to send message: {resp.status} - {error_text}") await asyncio.sleep(1) print("\nโœ… Check-in messages sent to all teams!") if __name__ == "__main__": asyncio.run(send_checkin_to_teams())