BOJ(백준) 풀이 기반 리그 대회 관리 시스템입니다. Cloudflare Workers + D1 위에서 동작하며, Discord 슬래시 커맨드로 관리합니다.
Discord Interaction (관리자)
↓ 슬래시 커맨드
Cloudflare Workers (boj-jury)
↓
D1 (SQLite) solved.ac API Google Sheets
- 관리자: Discord 슬래시 커맨드 전송
- 참가자 등록: REST API (
POST /register) - 리더보드: REST API (
GET /leaderboard) — Cloudflare Pages 등에서 호출 - 스토리지: Cloudflare D1 (SQLite)
- 스냅샷 갱신: 매일 21:00 KST 자동 실행 (Cron Trigger)
- Cloudflare 계정 및 Workers 플랜
- Discord Developer Portal 앱
- Google Cloud 서비스 계정 (Google Sheets 접근용)
- Bun 런타임
git clone <repo-url>
cd boj-jury
bun installbun x wrangler d1 create boj-jury출력된 database_id를 wrangler.jsonc의 database_id 항목에 붙여넣기:
bun x wrangler d1 execute boj-jury --file=schema.sql --remoteDiscord Developer Portal에서:
- 새 앱 생성 (또는 기존 앱 사용)
- General Information → Public Key 복사 →
DISCORD_PUBLIC_KEY로 사용 - Bot 탭 → Reset Token →
DISCORD_BOT_TOKEN으로 사용 - General Information → Application ID →
DISCORD_APPLICATION_ID로 사용
bun x wrangler secret put DISCORD_PUBLIC_KEY
bun x wrangler secret put DISCORD_ADMIN_USER_IDS # 쉼표 구분 Discord User ID (예: 123456,789012)
bun x wrangler secret put ADMIN_TOKEN # REST API 인증 토큰 (임의 문자열)
bun x wrangler secret put GOOGLE_SERVICE_ACCOUNT_JSON # 서비스 계정 JSON 전체 내용
bun x wrangler secret put SPREADSHEET_IDDiscord User ID 확인: Discord 설정 → 고급 → 개발자 모드 활성화 → 프로필 우클릭 → ID 복사
bun run deploy배포 후 출력된 Workers URL을 Discord Developer Portal에 등록:
General Information → Interactions Endpoint URL:
https://boj-jury.gw.workers.dev/discord/interactions
(서브도메인 gw는 계정 설정에 따라 다를 수 있습니다.)
DISCORD_APPLICATION_ID="앱ID" DISCORD_BOT_TOKEN="봇토큰" bun run register-commandshttps://discord.com/oauth2/authorize?client_id=<APPLICATION_ID>&scope=bot+applications.commands
| 커맨드 | 설명 |
|---|---|
/contest create name: start_at: end_at: [leaderboard_time:] |
대회 생성 |
/contest update-name new_name: |
대회 이름 변경 |
/contest update-period start_at: end_at: |
대회 기간 변경 |
/contest update-leaderboard-time time: |
리더보드 게시 시각 변경 |
/contest pause |
대회 일시정지 |
/contest resume |
대회 재개 |
/contest archive |
대회 보관 처리 |
| 커맨드 | 설명 |
|---|---|
/user list [league:] |
참가자 목록 조회 |
/user get handle: |
참가자 상세 조회 |
/user update-name handle: new_name: |
실명 수정 |
/user update-league handle: league: |
리그 수정 |
/user disqualify handle: |
실격 처리 |
POST /register
GET /leaderboard
bun run dev # 로컬 개발 서버
bun run type-check # 타입 체크 (src)
bun run type-check:scripts # 타입 체크 (scripts)
bun run deploy # 배포