Skip to content

ssugameworks/boj-jury-backend

Repository files navigation

BOJ Jury Backend (boj-jury)

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)

처음 설정하기

1. 사전 준비

2. 저장소 클론 및 의존성 설치

git clone <repo-url>
cd boj-jury
bun install

3. D1 데이터베이스 생성

bun x wrangler d1 create boj-jury

출력된 database_idwrangler.jsoncdatabase_id 항목에 붙여넣기:

"d1_databases": [
  {
    "binding": "boj_jury",
    "database_name": "boj-jury",
    "database_id": "여기에-붙여넣기"
  }
]

4. 스키마 적용

bun x wrangler d1 execute boj-jury --file=schema.sql --remote

5. Discord 앱 설정

Discord Developer Portal에서:

  1. 새 앱 생성 (또는 기존 앱 사용)
  2. General InformationPublic Key 복사 → DISCORD_PUBLIC_KEY로 사용
  3. Bot 탭 → Reset TokenDISCORD_BOT_TOKEN으로 사용
  4. General InformationApplication IDDISCORD_APPLICATION_ID로 사용

6. Secrets 등록

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_ID

Discord User ID 확인: Discord 설정 → 고급 → 개발자 모드 활성화 → 프로필 우클릭 → ID 복사

7. 배포

bun run deploy

8. Discord Interactions Endpoint 등록

배포 후 출력된 Workers URL을 Discord Developer Portal에 등록:

General InformationInteractions Endpoint URL:

https://boj-jury.gw.workers.dev/discord/interactions

(서브도메인 gw는 계정 설정에 따라 다를 수 있습니다.)

9. 슬래시 커맨드 등록

DISCORD_APPLICATION_ID="앱ID" DISCORD_BOT_TOKEN="봇토큰" bun run register-commands

10. 봇 초대

https://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: 실격 처리

REST API

참가자 등록

POST /register

리더보드 조회

GET /leaderboard


개발

bun run dev          # 로컬 개발 서버
bun run type-check   # 타입 체크 (src)
bun run type-check:scripts # 타입 체크 (scripts)
bun run deploy       # 배포

About

알고리즘 마라톤 Backend

Resources

Stars

Watchers

Forks

Contributors