Discord 대화를 FAQ 항목으로 변환하여 PR을 생성하는 봇입니다.
discord-bot/
├── src/ # Haskell CLI (메시지 수집 → 참조 추적 → Gemini 다중 주제 분석)
│ ├── Main.hs
│ ├── MessageLink.hs # Discord 메시지 링크 파서
│ ├── Discord.hs # Discord REST API 호출 + 답글/링크 참조 추적
│ └── Gemini.hs # Gemini 2.5 Pro 다중 주제 FAQ 생성
├── worker/ # Rust Cloudflare Worker (Discord ↔ GitHub Actions 브릿지)
│ ├── src/lib.rs
│ ├── Cargo.toml
│ └── wrangler.toml
├── test/ # 테스트
├── flake.nix # Haskell CLI 빌드
├── register-command.sh # 슬래시 명령어 등록 스크립트
└── discord-archive.cabal
/archive <메시지 링크>
│
▼
Cloudflare Worker (Rust)
- Ed25519 서명 검증
- "📋 처리 중..." 응답
- GitHub Actions repository_dispatch 트리거
│
▼
GitHub Actions
1. Haskell CLI 빌드 (Nix)
2. Discord API로 대화 가져오기 (메시지 주변 50개)
3. 답글 체인 + 메시지 링크 참조 추적 (추가 컨텍스트)
4. Gemini 2.5 Pro가 주제를 분리하여 여러 FAQ 생성
5. PR 생성 (ko/faq/<slug1>.md, ko/faq/<slug2>.md, ...)
6. Discord에 PR 링크 응답
- Discord Developer Portal에서 앱 생성
- Bot 탭에서 토큰 복사 →
DISCORD_BOT_TOKEN - General Information에서 Public Key 복사 →
DISCORD_PUBLIC_KEY - Application ID 복사 →
DISCORD_APPLICATION_ID - Bot에
MESSAGE_CONTENTPrivileged Intent 활성화
Google AI Studio에서 API 키 생성 → GEMINI_API_KEY
cd discord-bot/worker
# 시크릿 설정
npx wrangler secret put DISCORD_PUBLIC_KEY
npx wrangler secret put GITHUB_TOKEN # repo scope 필요
# 배포
npx wrangler deploy배포 후 Worker URL을 Discord Developer Portal → General Information → Interactions Endpoint URL에 입력합니다:
https://nixoskr-archive-bot.<subdomain>.workers.dev/interactions
Discord가 PING을 보내 엔드포인트를 검증합니다.
./discord-bot/register-command.sh <APPLICATION_ID> <BOT_TOKEN>MANAGE_MESSAGES 권한이 있는 사용자만 명령어를 사용할 수 있습니다.
GitHub 저장소 → Settings → Secrets → Actions에 추가:
| 시크릿 | 설명 |
|---|---|
DISCORD_BOT_TOKEN |
Discord 봇 토큰 |
GEMINI_API_KEY |
Google AI Studio API 키 |
GITHUB_TOKEN은 Actions가 자동 제공합니다.
cd discord-bot
# 빌드
nix build .#default
# 테스트
nix develop -c cabal test
# 직접 실행 (디버그용)
./result/bin/discord-archive \
--channel-id <CHANNEL_ID> \
--message-id <MESSAGE_ID> \
--discord-token <TOKEN> \
--gemini-key <KEY>CLI는 JSON 배열을 stdout으로 출력합니다 (대화에 여러 주제가 있으면 각각 별도 항목):
[
{"slug": "unfree-package-install", "content": "# unfree 패키지를 설치하고 싶어요\n..."},
{"slug": "flake-lock-update", "content": "# flake.lock을 업데이트하고 싶어요\n..."}
]Discord에서 아카이브할 메시지를 찾고:
- 메시지 우클릭 → "메시지 링크 복사"
/archive link:<붙여넣기>- 봇이 "📋 처리 중..." 응답 후 PR 링크를 표시합니다
생성된 PR을 리뷰하고 머지하면 FAQ가 nixos.kr에 게시됩니다.