Files
DS-Combat_analy/데이터수집/수집스크립트/validators.py

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}")