feat: 도메인 인라인 버튼 등록 + cheapest TLD + Cron 자동취소

- 도메인 등록 인라인 버튼 확인 플로우 (domain-register.ts)
- manage_domain에 cheapest action 추가 (가장 저렴한 TLD TOP 15)
- 24시간 경과 입금 대기 자동 취소 Cron (UTC 15:00)
- 거래 내역 한글 라벨 + description 표시
- CLAUDE.md 문서 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-01-18 15:24:03 +09:00
parent 89f8ea19f1
commit db859efc56
8 changed files with 567 additions and 23 deletions

109
CLAUDE.md
View File

@@ -477,6 +477,63 @@ URL: gateway.ai.cloudflare.com/v1/{account_id}/telegram-bot/openai/...
| `confirm_deposit` | 입금 확인 | 관리자 |
| `reject_deposit` | 입금 거절 | 관리자 |
### Cron 자동 취소 (24시간)
**목적:** 24시간 이상 대기 중인 입금 요청 자동 취소 + 사용자 알림
```
wrangler.toml:
crons = ["0 15 * * *"] # UTC 15:00 = KST 00:00 (매일 자정)
index.ts (scheduled 핸들러):
1. pending + created_at > 24시간 거래 조회
2. status → cancelled 업데이트
3. 사용자에게 Telegram 알림 전송
```
**wrangler.toml 설정:**
```toml
[triggers]
crons = ["0 15 * * *"] # KST 00:00
```
**사용자 알림 메시지:**
```
⏰ 입금 대기 자동 취소
거래 #123이 24시간 내 확인되지 않아 자동 취소되었습니다.
• 입금액: 10,000원
• 입금자: 홍길동
실제 입금하셨다면 다시 신고해주세요.
```
### 거래 내역 표시 형식
**응답 포맷 (`formatDepositResult`):**
```
#5: 입금 10,000원 ✓ (01/17)
#4: 출금 5,000원 ✓ (01/15) - 도메인 등록: example.com
#3: 입금 20,000원 ⏳ (01/14)
#2: 입금 5,000원 ✗ (01/10)
```
**상태 아이콘:**
| 상태 | 아이콘 | 설명 |
|------|--------|------|
| `confirmed` | ✓ | 확인 완료 |
| `pending` | ⏳ | 대기 중 |
| `cancelled` / `rejected` | ✗ | 취소/거절 |
**타입 라벨:**
| DB 값 | 표시 |
|-------|------|
| `deposit` | 입금 |
| `withdrawal` | 출금 |
| `refund` | 환불 |
**description 필드:** 거래 사유 (예: "도메인 등록: example.com")
---
## Domain System
@@ -493,7 +550,7 @@ URL: gateway.ai.cloudflare.com/v1/{account_id}/telegram-bot/openai/...
**manage_domain 도구 파라미터:**
```typescript
{
action: 'register' | 'check' | 'whois' | 'list' | 'info' | 'get_ns' | 'set_ns' | 'price',
action: 'register' | 'check' | 'whois' | 'list' | 'info' | 'get_ns' | 'set_ns' | 'price' | 'cheapest',
domain?: string, // 대상 도메인
nameservers?: string[], // set_ns용
tld?: string // price용
@@ -510,6 +567,7 @@ URL: gateway.ai.cloudflare.com/v1/{account_id}/telegram-bot/openai/...
| `check` | 가용성 확인 + 가격 | 공개 |
| `whois` | WHOIS 조회 | 공개 |
| `price` | TLD 가격 | 공개 |
| `cheapest` | 가장 저렴한 TLD 목록 (TOP 15) | 공개 |
| `register` | 등록 확인 페이지 | 사용자 |
### 도메인 등록 흐름
@@ -540,6 +598,41 @@ executeDomainAction():
└─────────────────────┴─────────────────────┘
```
### 인라인 버튼 확인 플로우 (Callback Query)
**목적:** 사용자에게 "확인/취소" 버튼 표시 후 클릭으로 등록 진행
```
executeDomainAction(register):
1. __KEYBOARD__{type, domain, price}__END__ 마커 포함 응답 생성
telegram.ts (sendMessage):
2. __KEYBOARD__ 감지 → 마커 파싱 → inline_keyboard 생성
Telegram:
3. 사용자에게 "✅ 등록 확인 / ❌ 취소" 버튼 표시
index.ts (callback_query 핸들러):
4. 버튼 클릭 감지 → data 파싱 → domain-register.ts 호출
domain-register.ts:
5. 잔액 재확인 → 실제 등록 API 호출 → 결과 반환
```
**관련 코드:**
| 파일 | 역할 |
|------|------|
| `openai-service.ts:786-807` | `__KEYBOARD__` 마커 생성 |
| `telegram.ts:sendMessage()` | 마커 파싱 → inline_keyboard 변환 |
| `index.ts:callback_query` | 버튼 클릭 핸들링 |
| `domain-register.ts` | 실제 도메인 등록 실행 |
**버튼 콜백 데이터 형식:**
```typescript
// 확인: confirm_domain_register:example.com:15000
// 취소: cancel_domain_register:example.com
```
### 도메인 추천 기능 (`suggest_domains`)
**별도 구현된 코드 레벨 도구**
@@ -568,6 +661,20 @@ executeDomainAction():
- 가격 정책: Namecheap 원가 + 13%, 매일 환율 업데이트
- 권한 체크: `user_domains` 테이블 `verified=1`
**Production/Sandbox 전환:**
```bash
# namecheap-api 서버의 .env 파일
NAMECHEAP_API_USER=your_username
NAMECHEAP_SANDBOX=false # true: 테스트 모드, false: 실제 등록
```
| 환경 | NAMECHEAP_SANDBOX | API 엔드포인트 |
|------|-------------------|----------------|
| Production | `false` | api.namecheap.com |
| Sandbox | `true` | api.sandbox.namecheap.com |
**⚠️ 주의:** Sandbox에서 등록한 도메인은 실제로 등록되지 않음
**등록자 정보:**
- 현재: 서비스 기본 정보만 지원 (일본 주소)
- WHOIS Guard 자동 적용 (개인정보 비공개)