[Riot Data Dragon] 챔피언 정보 가져오기

혜진·2024년 7월 3일

Riot game Project

목록 보기
3/4
post-thumbnail

Riot Data Dragon

Riot Games에서 제공하는 다양한 데이터를 포함하는 리소스 저장소

Riot Developer Portal

dragontail-14.13.1.tgz 다운로드
/Users/ihyejin/Downloads/dragontail-14.13.1/14.13.1/data/ko_KR

challenges.json: 도전과제 관련 데이터
champion: 챔피언과 관련된 다양한 JSON 파일
champion.json: 각 챔피언에 대한 기본 정보
championFull.json: 각 챔피언 상세 정보
item-modifiers.json: 아이템 수정자에 대한 정보
item.json: 게임 내 아이템에 대한 정보
language.json: 게임의 언어 설정과 관련된 정보
map.json: 게임 내 맵에 대한 정보
mission-assets.json: 미션과 관련된 정보
profileicon.json: 게임 내 프로필 아이콘 정보
runesReforged.json: 룬 시스템 정보
spellbuffs.json: 스펠 버프와 관련된 정보
sticker.json: 게임 내 스티커에 대한 정보
summoner.json: 소환사와 관련된 정보
tft-arena.json: TFT(전략적 팀 전투) 아레나 정보
tft-augments.json: TFT 증강 정보
tft-champion.json: TFT 챔피언 정보
tft-hero-augments.json: TFT 영웅 증강 정보
tft-item.json: TFT 아이템 정보
tft-queues.json: TFT 대기열 정보
tft-regalia.json: TFT 휘장 정보
tft-region-portals.json: TFT 지역 포탈 정보
tft-tactician.json: TFT 전술가 정보
tft-trait.json: TFT 특성 정보
사용할 데이터: champion, champion.json
1.새로운 앱 생성
python manage.py startapp model_champion

2.settings.py
INSTALLED_APPS = [
    'riot_app',
    'model_champion',
]

model_champion/models.py

from django.db import models

# Champion 기본 정보
class Champion(models.Model):
    key = models.CharField(max_length=100)
    id = models.CharField(max_length=100, primary_key=True)
    name = models.CharField(max_length=100)
    title = models.CharField(max_length=100)
    lore = models.TextField()
    blurb = models.TextField()
    allytips = models.TextField()
    enemytips = models.TextField()
    tags = models.CharField(max_length=100)
    partype = models.CharField(max_length=100)

# Champion 이미지
class ChampionImage(models.Model):
    champion = models.OneToOneField(Champion, on_delete=models.CASCADE)
    full = models.CharField(max_length=100)
    sprite = models.CharField(max_length=100)
    group = models.CharField(max_length=100)
    x = models.IntegerField()
    y = models.IntegerField()
    W = models.IntegerField()
    h = models.IntegerField()

# Champion 스킨
class ChampionSkin(models.Model):
    champion = models.ForeignKey(Champion, on_delete=models.CASCADE)
    id = models.CharField(max_length=100, primary_key=True)
    num = models.IntegerField()
    name = models.CharField(max_length=100)
    chromas = models.BooleanField()

# Champion 수치 정보
class ChampionInfo(models.Model):
    champion = models.OneToOneField(Champion, on_delete=models.CASCADE)
    attack = models.IntegerField()
    defense = models.IntegerField()
    magic = models.IntegerField()
    difficulty = models.IntegerField()

# Champion 스탯
class ChampionStat(models.Model):
    champion = models.OneToOneField(Champion, on_delete=models.CASCADE)
    hp = models.FloatField()
    hpperlevel = models.FloatField()
    mp = models.FloatField()
    mpperlevel = models.FloatField()
    movespeed = models.FloatField()
    armor = models.FloatField()
    armorperlevel = models.FloatField()
    spellblock = models.FloatField()
    spellblockperlevel = models.FloatField()
    attackrange = models.FloatField()
    hpregen = models.FloatField()
    hpregenperlevel = models.FloatField()
    mpregen = models.FloatField()
    mpregenperlevel = models.FloatField()
    crit = models.FloatField()
    critperlevel = models.FloatField()
    attackdamage = models.FloatField()
    attackdamageperlevel = models.FloatField()
    attackspeedperlevel = models.FloatField()
    attackspeed = models.FloatField()

# Champion 스킬
class ChampionSpell(models.Model):
    champion = models.ForeignKey(Champion, on_delete=models.CASCADE)
    id = models.CharField(max_length=100, primary_key=True)
    name = models.CharField(max_length=100)
    description = models.TextField()
    tooltip = models.TextField()
    maxrank = models.IntegerField()
    cooldown = models.TextField()
    cooldownBurn = models.CharField(max_length=100)
    cost = models.TextField()
    costBurn = models.CharField(max_length=100)
    costType = models.CharField(max_length=100)
    range = models.TextField()
    resource = models.CharField(max_length=100, blank=True)

# Champion 스킬 이미지
class SpellImage(models.Model):
    spell = models.OneToOneField(ChampionSpell, on_delete=models.CASCADE)
    full = models.CharField(max_length=100)
    sprite = models.CharField(max_length=100)
    group = models.CharField(max_length=100)
    x = models.IntegerField()
    y = models.IntegerField()
    W = models.IntegerField()
    h = models.IntegerField()

# Champion 패시브
class ChampionPassive(models.Model):
    champion = models.OneToOneField(Champion, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    description = models.TextField()

# Champion 패시브 이미지
class PassiveImage(models.Model):
    passive = models.OneToOneField(ChampionPassive, on_delete=models.CASCADE)
    full = models.CharField(max_length=100)
    sprite = models.CharField(max_length=100)
    group = models.CharField(max_length=100)
    x = models.IntegerField()
    y = models.IntegerField()
    W = models.IntegerField()
    h = models.IntegerField()

마이그레이션

python manage.py makemigrations model_champion
python manage.py migrate

riot_app/management/commands/load_champions.py

챔피언 데이터를 로드하는 코드
import os
import json
from django.core.management.base import BaseCommand
from typing import Dict
from django.conf import settings
from model_champion.models import Champion, ChampionImage, ChampionInfo, ChampionPassive, ChampionSkin, ChampionSpell, ChampionStat, PassiveImage, SpellImage

def intListToStr(arr):
    return ",".join(map(str, arr))

# 챔피언 데이터 데이터베이스에 저장
def putChampions(json_file_path):
    with open(json_file_path, encoding='UTF-8') as f:
        data: Dict = json.load(f)['data']

    Champion.objects.all().delete()

    for key, value in data.items():
        allytips = ",".join(value['allytips'])
        enemytips = ",".join(value['enemytips'])
        tags = ",".join(value['tags'])

        champion = Champion.objects.create(
            key=value['key'],
            id=value['id'],
            name=value['name'],
            title=value['title'],
            lore=value['lore'],
            blurb=value['blurb'],
            allytips=allytips,
            enemytips=enemytips,
            tags=tags,
            partype=value['partype']
        )

        ChampionImage.objects.create(
            champion=champion,
            full=value['image']['full'],
            sprite=value['image']['sprite'],
            group=value['image']['group'],
            x=value['image']['x'],
            y=value['image']['y'],
            W=value['image']['w'],
            h=value['image']['h'],
        )

        skinBulkList = [
            ChampionSkin(
                champion=champion,
                id=skin['id'],
                num=skin['num'],
                name=skin['name'],
                chromas=skin['chromas']
            ) for skin in value['skins']
        ]
        ChampionSkin.objects.bulk_create(skinBulkList)

        ChampionInfo.objects.create(
            champion=champion,
            attack=value['info']['attack'],
            defense=value['info']['defense'],
            magic=value['info']['magic'],
            difficulty=value['info']['difficulty']
        )

        ChampionStat.objects.create(
            champion=champion,
            hp=value['stats']['hp'],
            hpperlevel=value['stats']['hpperlevel'],
            mp=value['stats']['mp'],
            mpperlevel=value['stats']['mpperlevel'],
            movespeed=value['stats']['movespeed'],
            armor=value['stats']['armor'],
            armorperlevel=value['stats']['armorperlevel'],
            spellblock=value['stats']['spellblock'],
            spellblockperlevel=value['stats']['spellblockperlevel'],
            attackrange=value['stats']['attackrange'],
            hpregen=value['stats']['hpregen'],
            hpregenperlevel=value['stats']['hpregenperlevel'],
            mpregen=value['stats']['mpregen'],
            mpregenperlevel=value['stats']['mpregenperlevel'],
            crit=value['stats']['crit'],
            critperlevel=value['stats']['critperlevel'],
            attackdamage=value['stats']['attackdamage'],
            attackdamageperlevel=value['stats']['attackdamageperlevel'],
            attackspeedperlevel=value['stats']['attackspeedperlevel'],
            attackspeed=value['stats']['attackspeed'],
        )

        for spell in value['spells']:
            championSpell = ChampionSpell.objects.create(
                champion=champion,
                id=spell['id'],
                name=spell['name'],
                description=spell['description'],
                tooltip=spell.get('tooltip', ''),
                maxrank=spell['maxrank'],
                cooldown=intListToStr(spell['cooldown']),
                cooldownBurn=spell['cooldownBurn'],
                cost=intListToStr(spell['cost']),
                costBurn=spell['costBurn'],
                costType=spell['costType'],
                range=intListToStr(spell['range']),
                resource=spell.get('resource', '')
            )

            SpellImage.objects.create(
                spell=championSpell,
                full=spell['image']['full'],
                sprite=spell['image']['sprite'],
                group=spell['image']['group'],
                x=spell['image']['x'],
                y=spell['image']['y'],
                W=spell['image']['w'],
                h=spell['image']['h'],
            )

        championPassive = ChampionPassive.objects.create(
            champion=champion,
            name=value['passive']['name'],
            description=value['passive']['description']
        )

        PassiveImage.objects.create(
            passive=championPassive,
            full=value['passive']['image']['full'],
            sprite=value['passive']['image'].get('sprite', ''),  # 기본 값으로 빈 문자열 설정
            group=value['passive']['image']['group'],
            x=value['passive']['image']['x'],
            y=value['passive']['image']['y'],
            W=value['passive']['image']['w'],
            h=value['passive']['image']['h'],
        )

    return "챔피언 데이터베이스 업데이트 완료"

class Command(BaseCommand):
    help = 'Load champion data into the database'

    def add_arguments(self, parser):
        parser.add_argument('json_file_path', type=str, help='Path to the JSON file')

    def handle(self, *args, **kwargs):
        json_file_path = kwargs['json_file_path']
        message = putChampions(json_file_path)
        self.stdout.write(self.style.SUCCESS(message))

명령어 실행

python manage.py load_champions dragontail/14.13.1/data/ko_KR/championFull.json
데이터베이스에 저장 완료!

결과 ⭐️

챔피언 리스트 보여주기 성공!

챔피언 상세 정보 확인 가능 💗

0개의 댓글