177 lines
5.6 KiB
Python
177 lines
5.6 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
||
|
|
"""
|
||
|
|
데이터 검증 모듈
|
||
|
|
"""
|
||
|
|
|
||
|
|
import logging
|
||
|
|
from typing import Dict, List
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
def validate_stalker_data(stalker_name: str, stalker_data: Dict) -> bool:
|
||
|
|
"""
|
||
|
|
스토커 데이터 검증
|
||
|
|
|
||
|
|
Args:
|
||
|
|
stalker_name: 스토커 이름
|
||
|
|
stalker_data: 스토커 데이터
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
검증 성공 여부
|
||
|
|
"""
|
||
|
|
warnings = []
|
||
|
|
errors = []
|
||
|
|
|
||
|
|
# 기본 정보 검증
|
||
|
|
basic_info = stalker_data.get('basic_info', {})
|
||
|
|
if not basic_info.get('name'):
|
||
|
|
warnings.append(f"[{stalker_name}] 이름 정보 누락")
|
||
|
|
|
||
|
|
# 스탯 검증
|
||
|
|
stats = stalker_data.get('stats', {})
|
||
|
|
if not stats:
|
||
|
|
errors.append(f"[{stalker_name}] 스탯 정보 누락")
|
||
|
|
else:
|
||
|
|
# 스탯 합계 확인 (75여야 함)
|
||
|
|
stat_sum = (
|
||
|
|
stats.get('str', 0) +
|
||
|
|
stats.get('dex', 0) +
|
||
|
|
stats.get('int', 0) +
|
||
|
|
stats.get('con', 0) +
|
||
|
|
stats.get('wis', 0)
|
||
|
|
)
|
||
|
|
if stat_sum != 75:
|
||
|
|
warnings.append(f"[{stalker_name}] 스탯 합계가 75가 아님: {stat_sum}")
|
||
|
|
|
||
|
|
# 스킬 검증
|
||
|
|
skills = stalker_data.get('skills', {})
|
||
|
|
default_skills = skills.get('default', [])
|
||
|
|
if not default_skills:
|
||
|
|
warnings.append(f"[{stalker_name}] 기본 스킬 정보 누락")
|
||
|
|
|
||
|
|
sub_skill = skills.get('sub', '')
|
||
|
|
if not sub_skill:
|
||
|
|
warnings.append(f"[{stalker_name}] 서브 스킬 정보 누락")
|
||
|
|
|
||
|
|
ultimate_skill = skills.get('ultimate', '')
|
||
|
|
if not ultimate_skill:
|
||
|
|
warnings.append(f"[{stalker_name}] 궁극기 정보 누락")
|
||
|
|
|
||
|
|
# 스킬 상세 정보 검증
|
||
|
|
skill_details = stalker_data.get('skill_details', {})
|
||
|
|
all_skill_ids = default_skills + [sub_skill, ultimate_skill]
|
||
|
|
for skill_id in all_skill_ids:
|
||
|
|
if skill_id and skill_id not in skill_details:
|
||
|
|
warnings.append(f"[{stalker_name}] 스킬 상세 정보 누락: {skill_id}")
|
||
|
|
|
||
|
|
# 기본 공격 검증
|
||
|
|
basic_attacks = stalker_data.get('basic_attacks', {})
|
||
|
|
if not basic_attacks:
|
||
|
|
warnings.append(f"[{stalker_name}] 기본 공격 몽타주 정보 누락")
|
||
|
|
|
||
|
|
# 경고 및 에러 출력
|
||
|
|
for warning in warnings:
|
||
|
|
logger.warning(warning)
|
||
|
|
|
||
|
|
for error in errors:
|
||
|
|
logger.error(error)
|
||
|
|
|
||
|
|
return len(errors) == 0
|
||
|
|
|
||
|
|
|
||
|
|
def validate_collection_result(collection_data: Dict) -> bool:
|
||
|
|
"""
|
||
|
|
전체 수집 결과 검증
|
||
|
|
|
||
|
|
Args:
|
||
|
|
collection_data: 전체 수집 데이터
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
검증 성공 여부
|
||
|
|
"""
|
||
|
|
stalkers = collection_data.get('stalkers', {})
|
||
|
|
|
||
|
|
if not stalkers:
|
||
|
|
logger.error("수집된 스토커 데이터가 없습니다")
|
||
|
|
return False
|
||
|
|
|
||
|
|
total_stalkers = len(stalkers)
|
||
|
|
logger.info(f"총 {total_stalkers}명의 스토커 데이터 수집 완료")
|
||
|
|
|
||
|
|
# 각 스토커별 검증
|
||
|
|
all_valid = True
|
||
|
|
for stalker_name, stalker_data in stalkers.items():
|
||
|
|
if not validate_stalker_data(stalker_name, stalker_data):
|
||
|
|
all_valid = False
|
||
|
|
|
||
|
|
return all_valid
|
||
|
|
|
||
|
|
|
||
|
|
def log_collection_summary(collection_data: Dict, log_file_path: str):
|
||
|
|
"""
|
||
|
|
수집 결과 요약 로그 생성
|
||
|
|
|
||
|
|
Args:
|
||
|
|
collection_data: 전체 수집 데이터
|
||
|
|
log_file_path: 로그 파일 경로
|
||
|
|
"""
|
||
|
|
stalkers = collection_data.get('stalkers', {})
|
||
|
|
|
||
|
|
with open(log_file_path, 'w', encoding='utf-8') as f:
|
||
|
|
f.write("=" * 80 + "\n")
|
||
|
|
f.write("DS 전투 데이터 수집 결과 요약\n")
|
||
|
|
f.write("=" * 80 + "\n\n")
|
||
|
|
|
||
|
|
metadata = collection_data.get('collection_metadata', {})
|
||
|
|
f.write(f"수집 시각: {metadata.get('collected_at', '')}\n")
|
||
|
|
f.write(f"총 스토커 수: {len(stalkers)}\n\n")
|
||
|
|
|
||
|
|
for stalker_name, stalker_data in stalkers.items():
|
||
|
|
f.write("-" * 80 + "\n")
|
||
|
|
f.write(f"스토커: {stalker_name}\n")
|
||
|
|
f.write("-" * 80 + "\n")
|
||
|
|
|
||
|
|
basic_info = stalker_data.get('basic_info', {})
|
||
|
|
f.write(f" 이름: {basic_info.get('name', '')}\n")
|
||
|
|
f.write(f" 직업: {basic_info.get('jobName', '')}\n")
|
||
|
|
|
||
|
|
stats = stalker_data.get('stats', {})
|
||
|
|
stat_sum = (
|
||
|
|
stats.get('str', 0) +
|
||
|
|
stats.get('dex', 0) +
|
||
|
|
stats.get('int', 0) +
|
||
|
|
stats.get('con', 0) +
|
||
|
|
stats.get('wis', 0)
|
||
|
|
)
|
||
|
|
f.write(f" 스탯 합계: {stat_sum}\n")
|
||
|
|
|
||
|
|
skills = stalker_data.get('skills', {})
|
||
|
|
default_skills = skills.get('default', [])
|
||
|
|
f.write(f" 기본 스킬 수: {len(default_skills)}\n")
|
||
|
|
f.write(f" 서브 스킬: {skills.get('sub', '')}\n")
|
||
|
|
f.write(f" 궁극기: {skills.get('ultimate', '')}\n")
|
||
|
|
|
||
|
|
skill_details = stalker_data.get('skill_details', {})
|
||
|
|
f.write(f" 수집된 스킬 상세 정보 수: {len(skill_details)}\n")
|
||
|
|
|
||
|
|
# 각 스킬별 몽타주 수 집계
|
||
|
|
total_skill_montages = 0
|
||
|
|
for skill_id, skill_data in skill_details.items():
|
||
|
|
montages = skill_data.get('montages', [])
|
||
|
|
total_skill_montages += len(montages)
|
||
|
|
|
||
|
|
f.write(f" 스킬 몽타주 총 수: {total_skill_montages}\n")
|
||
|
|
|
||
|
|
basic_attacks = stalker_data.get('basic_attacks', {})
|
||
|
|
total_basic_montages = sum(len(montages) for montages in basic_attacks.values())
|
||
|
|
f.write(f" 기본 공격 몽타주 총 수: {total_basic_montages}\n")
|
||
|
|
|
||
|
|
f.write("\n")
|
||
|
|
|
||
|
|
f.write("=" * 80 + "\n")
|
||
|
|
f.write("수집 완료\n")
|
||
|
|
f.write("=" * 80 + "\n")
|
||
|
|
|
||
|
|
logger.info(f"수집 요약 로그 생성 완료: {log_file_path}")
|