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
┌──────────────────────────────────────────────────────────┐
│ ModeBattle 루프 │
├──────────────────────────────────────────────────────────┤
│ 1. /프로필 → 내 레벨 파싱 (예: +10) │
│ 2. /랭킹 → 서버 유저 목록 파싱 │
│ 3. 타겟 선정: 내 레벨 +1~3 범위의 유저 필터링 │
│ 4. /배틀 @타겟유저 → 대결 실행 │
│ 5. 결과 파싱 → 승/패, 획득 골드 │
│ 6. 텔레메트리 기록 │
│ 7. 쿨다운 대기 (rate limit 방지) │
│ 8. 반복 │
└──────────────────────────────────────────────────────────┘
2.3 OCR 파싱 패턴
// 프로필 파싱typeProfilestruct {
Namestring// @정진하Levelint// +16SwordNamestring// 모래의 우주적 종언의 섭리Winsint// 34승Lossesint// 22패Goldint// 18 G
}
// 랭킹 파싱 (배틀 랭킹에서 레벨 추출)typeRankingEntrystruct {
Rankint// 1위Usernamestring// @검키지지Levelint// +20 (강화 랭킹에서)Winsint// 2255승Lossesint// 838패
}
// 배틀 결과 파싱typeBattleResultstruct {
Winnerstring// @설민재Loserstring// @정지용WinnerLevelint// +14LoserLevelint// +16GoldEarnedint// 2,407,543GIsUpsetbool// 역배 여부 (낮은 레벨이 이김)
}
2.4 메뉴 UI 추가
=== 카카오톡 검키우기 ===
1. 강화 목표 달성
2. 히든 검 뽑기
3. 골드 채굴 (돈벌기)
4. 자동 배틀 (역배) ← NEW
5. 옵션 설정
0. 종료
선택: 4
=== 자동 배틀 설정 ===
역배 레벨 차이 (1-3): 2
배틀 간격 (초): 5
목표 승수 (0=무제한): 10
⏱️ 30분간 자동 배틀을 시작합니다...
📊 내 프로필: +12 불꽃의 검 (45승 30패)
🎯 타겟 범위: +13 ~ +14
⚔️ #1: @상대유저 (+13) vs 나 (+12)
→ 승리! +125,000G 획득 (역배 성공!)
⚔️ #2: @다른유저 (+14) vs 나 (+12)
→ 패배... 다음 기회에
[30분 경과]
=== 배틀 종료 ===
⚔️ 총 배틀: 45회
🏆 승리: 18회 (40%)
💰 순수익: +2,350,000G
📤 통계 전송 완료!
3. 확장 데이터 수집 설계
3.1 수집 데이터 전체 목록
카테고리
데이터
용도
세션
시작/종료 시간, 모드, 실행 시간
사용 패턴 분석
강화
시도 횟수, 성공/실패/파괴, 레벨별 확률
최적 강화 전략
파밍
획득 검 등급, 히든 확률
파밍 효율 분석
판매
검 이름, 레벨, 판매가
가격 테이블 구축
배틀
상대 레벨, 승/패, 획득 골드
역배 전략 최적화
골드
수입/지출 내역
경제 시스템 분석
3.2 확장된 Stats 구조
// internal/telemetry/telemetry.gotypeStatsstruct {
// 기존TotalCyclesint`json:"total_cycles"`SuccessfulCyclesint`json:"successful_cycles"`FailedCyclesint`json:"failed_cycles"`TotalGoldMinedint`json:"total_gold_mined"`TotalSwordsFoundint`json:"total_swords_found"`SessionDurationint`json:"session_duration_sec"`// 강화 통계 (NEW)EnhanceAttemptsint`json:"enhance_attempts"`EnhanceSuccessint`json:"enhance_success"`EnhanceFailint`json:"enhance_fail"`EnhanceDestroyint`json:"enhance_destroy"`EnhanceByLevelmap[int]LevelStats`json:"enhance_by_level,omitempty"`// 배틀 통계 (NEW)BattleCountint`json:"battle_count"`BattleWinsint`json:"battle_wins"`BattleLossesint`json:"battle_losses"`BattleGoldEarnedint`json:"battle_gold_earned"`UpsetWinsint`json:"upset_wins"`// 역배 승리UpsetAttemptsint`json:"upset_attempts"`// 역배 시도// 판매 통계 (NEW)SalesCountint`json:"sales_count"`SalesTotalGoldint`json:"sales_total_gold"`SalesMaxPriceint`json:"sales_max_price"`SalesAvgPriceint`json:"sales_avg_price"`// 파밍 통계 (NEW)FarmingAttemptsint`json:"farming_attempts"`HiddenFoundint`json:"hidden_found"`TrashFoundint`json:"trash_found"`
}
typeLevelStatsstruct {
Attemptsint`json:"attempts"`Successint`json:"success"`Failint`json:"fail"`Destroyint`json:"destroy"`
}
-- 기존 telemetry 테이블 유지-- 상세 이벤트 테이블 (NEW)CREATETABLEevents (
id INTEGERPRIMARY KEY AUTOINCREMENT,
session_id TEXTNOT NULL,
event_type TEXTNOT NULL, -- enhance, battle, sale, farm
event_data JSON NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATEINDEXidx_events_sessionON events(session_id);
CREATEINDEXidx_events_typeON events(event_type);
-- 집계 뷰 (분석용)CREATEVIEWenhance_statsASSELECT
json_extract(event_data, '$.from') as from_level,
json_extract(event_data, '$.result') as result,
COUNT(*) as count,
ROUND(COUNT(*) *100.0/SUM(COUNT(*)) OVER (PARTITION BY json_extract(event_data, '$.from')), 2) as rate
FROM events
WHERE event_type ='enhance'GROUP BY from_level, result;
CREATEVIEWbattle_upset_statsASSELECT
json_extract(event_data, '$.my_level') as my_level,
json_extract(event_data, '$.opp_level') - json_extract(event_data, '$.my_level') as level_diff,
SUM(CASE WHEN json_extract(event_data, '$.result') ='win' THEN 1 ELSE 0 END) as wins,
COUNT(*) as total,
ROUND(SUM(CASE WHEN json_extract(event_data, '$.result') ='win' THEN 1 ELSE 0 END) *100.0/COUNT(*), 2) as win_rate
FROM events
WHERE event_type ='battle'AND json_extract(event_data, '$.upset') =1GROUP BY my_level, level_diff;
CREATEVIEWsale_price_tableASSELECT
json_extract(event_data, '$.level') as level,
MIN(json_extract(event_data, '$.price')) as min_price,
AVG(json_extract(event_data, '$.price')) as avg_price,
MAX(json_extract(event_data, '$.price')) as max_price,
COUNT(*) as sample_count
FROM events
WHERE event_type ='sale'GROUP BY level;
4. 데이터 활용 계획
4.1 분석 가능한 인사이트
분석
데이터 소스
기대 효과
강화 확률표
enhance_by_level
레벨별 실제 성공률 공개
역배 승률표
battle_upset_stats
최적 역배 레벨 차이 도출
판매 가격표
sale_price_table
검 레벨별 시세 공개
시간대별 효율
session times
최적 플레이 시간대
파밍 히든 확률
farming stats
히든 출현율 측정
4.2 커뮤니티 공개 API
# 서버 API 확장@app.get("/api/enhance-rates")asyncdefget_enhance_rates():
"""레벨별 강화 성공률 (커뮤니티 공개)"""# enhance_stats 뷰에서 조회@app.get("/api/upset-rates")asyncdefget_upset_rates():
"""역배 승률표 (레벨 차이별)"""# battle_upset_stats 뷰에서 조회@app.get("/api/price-table")asyncdefget_price_table():
"""검 레벨별 판매 시세"""# sale_price_table 뷰에서 조회
5. 구현 계획
5.1 Phase 1: 데이터 수집 확장 (1일)
[ ] Stats 구조체 확장 (enhance, battle, sale 필드)
[ ] RecordEnhance(), RecordBattle(), RecordSale() 메서드 추가
[ ] 기존 루프에 기록 호출 추가
[ ] 서버 DB 스키마 업데이트
5.2 Phase 2: 자동 배틀 모드 (2일)
[ ] OCR 파싱: 프로필, 랭킹, 배틀 결과
[ ] ModeBattle 상태 머신 구현
[ ] 타겟 선정 알고리즘 (레벨 차이 기반)
[ ] 배틀 쿨다운 관리
[ ] 메뉴 UI 추가
5.3 Phase 3: 분석 대시보드 (선택)
[ ] 통계 집계 API 구현
[ ] 간단한 웹 대시보드 (선택)
[ ] 주간 리포트 자동 생성
6. 기술 고려사항
6.1 Rate Limiting 대응
const (
battleCooldown=5*time.Second// 배틀 간 최소 간격commandDelay=1*time.Second// 명령어 간 딜레이
)