You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Discord slash command /verify <github_username> <role> <team> → GitHub 후원 확인 → GitHub 팀 초대 + Discord 역할 부여
Architecture
Discord User
│
│ /verify <github_username> <role> <team>
▼
Discord API
│
│ POST (Interaction Webhook)
▼
Cloudflare Worker
│
│ ROLE_TEAM_CONFIG에서 role/team 매핑 조회
│ GraphQL: isSponsoredBy(org)
▼
GitHub API (Sponsors)
│
├─ 후원 O ──► GitHub REST API (팀 초대)
│
└─ 후원 O ──► Discord REST API (역할 부여)
Tech Stack
Layer
Technology
Runtime
Cloudflare Workers (TypeScript)
Slash Command
Discord Interactions API
후원 확인
GitHub GraphQL API (isOrganizationSponsoredBy)
팀 초대
GitHub REST API (PUT /orgs/{org}/teams/{team}/memberships/{username})
역할 부여
Discord REST API (PUT /guilds/{guild}/members/{user}/roles/{role})
배포
Wrangler CLI / GitHub Actions
Command Design
/verify
github_username: string (필수)
role: choices (필수) — ROLE_TEAM_CONFIG의 label/value로 자동 생성
team: choices (필수) — ROLE_TEAM_CONFIG의 label/value로 자동 생성
role과 team은 Discord 드롭다운 선택지로 표시됨
선택지는 ROLE_TEAM_CONFIG에서 정의하며, 변경 시 register.ts 재실행 필요
Step-by-Step Flow
1. Discord Interaction 수신
Cloudflare Worker가 Discord Interaction Webhook을 수신
Ed25519 서명 검증 (필수 — 실패 시 Discord가 endpoint를 비활성화함)
Interaction type PING(1) → 즉시 PONG 응답
Interaction type APPLICATION_COMMAND(2) → 처리 시작
2. 파라미터 파싱 및 매핑 조회
options에서 github_username, role, team 추출
ROLE_TEAM_CONFIG JSON 파싱 후 role 값으로 discordRoleId 조회, team 값으로 teamSlug 조회
3. Deferred Response 반환
GitHub API 호출이 3초를 초과할 수 있으므로, 즉시 DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE(5) 반환
이후 처리 결과를 followup 메시지로 전송
4. GitHub 후원 확인
GitHub GraphQL API로 <github_username>이 조직을 후원하는지 확인