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.
98 lines
3.7 KiB
Python
98 lines
3.7 KiB
Python
"""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())
|