maplestory-sdk-py


Namemaplestory-sdk-py JSON
Version 1.0.1 PyPI version JSON
download
home_pagehttps://github.com/nanpuhaha/maplestory-py
SummaryMapleStory OpenAPI Python Client Library
upload_time2024-02-12 02:35:52
maintainer
docs_urlNone
authorJangwon Seo
requires_python>=3.11,<4.0
licenseMIT
keywords maplestory api api-wrapper
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # <p align="center">MapleStory OpenAPI Python Client Library</p>
<p align="center">A simple, but extensible Python implementation for the <a href="https://openapi.nexon.com/game/maplestory/?id=22">MapleStory OpenAPI</a>.</p>
<p align="center">
<a>
    <img src="https://img.shields.io/pypi/pyversions/maplestory" alt="PyPI - Python Version">
</a>
<a>
    <img src="https://img.shields.io/pypi/v/maplestory" alt="PyPI - Version">
</a>
<a href="https://github.com/nanpuhaha/maplestory-py/actions/workflows/pytest.yml">
    <img src="https://github.com/nanpuhaha/maplestory-py/actions/workflows/pytest.yml/badge.svg" alt="Test with pytest">
</a>
<a href="https://codecov.io/gh/nanpuhaha/maplestory-py">
    <img src="https://codecov.io/gh/nanpuhaha/maplestory-py/graph/badge.svg?token=H4S1BWRFJB" alt="codecov">
</a>
</p>

---

> [!NOTE]
> This library can only query data from the **[KMS](https://maplestory.nexon.com)**(Korea MapleStory).

---

## Overview

This library simplifies access to MapleStory's OpenAPI in Python, enabling queries of character, union, guild, and ranking information, as well as checks on Star Force, cubes, and potential abilities.

## Installation

If you are using pip:

```shell
pip install maplestory
```

If you are using poetry:

```shell
poetry add maplestory
```

### Supported Python Versions

Python 3.11 and 3.12 are fully supported and tested. While it may operate on subsequent versions of Python 3, testing against these newer versions is not currently conducted.

### Unsupported Python Versions

- Python < 3.11

### Third Party Libraries and Dependencies

The following libraries will be installed when you install the client library:

- [pydantic v2](https://docs.pydantic.dev)
- [httpx](https://www.python-httpx.org)
- [tenacity](https://tenacity.readthedocs.io)

## Usage

### API credentials

To use the MapleStory OpenAPI, you first need to create a Nexon account at https://www.nexon.com. After creating your account, proceed to the [NEXON OPEN API site](https://openapi.nexon.com) and create a new application. Once your application is created, copy the **API Key** and set it as an environment variable or enter it into a `.env` file within your project.

```env
# set environment variable
MAPLESTORY_OPENAPI_KEY=INSERT_YOUR_KEY_HERE
```

### Examples

Only the **names**, such as character names and guild names, are required.

If you wish to query a specific date in the past, you can also enter the date.
By default, the query is based on the date of yesterday. (The plan is to detail this further by API type in the future.)

<details>
<summary>Character</summary>

You can query all character data using just the **character name** using `Character` class.

```python
>>> from mapletory.services.character import Character
>>> char = Character(name="온앤온")

>>> print(char)
CharacterBasic(
    date=datetime.datetime(2024, 2, 10, 0, 0, tzinfo=TzInfo(+09:00)),
    name='온앤온',
    world='스카니아',
    gender='여',
    job='아크메이지(썬,콜)',
    job_level=6,
    level=280,
    exp=29014907373569,
    exp_rate=86.232,
    guild_name='온앤온',
    image=<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=96x96 at 0x1063C16D0>
)

>>> print(char.ability)
Ability(
    date=datetime.datetime(2024, 2, 4, 0, 0, tzinfo=TzInfo(+09:00)),
    grade='레전드리',
    info=[
        AbilityInfoItem(grade='레전드리', value='버프 스킬의 지속 시간 50% 증가'),
        AbilityInfoItem(grade='유니크', value='상태 이상에 걸린 대상 공격 시 데미지 8% 증가'),
        AbilityInfoItem(grade='유니크', value='보스 몬스터 공격 시 데미지 10% 증가')
    ],
    remain_fame=465283,
    preset_no=1,
    preset1=AbilityPreset(
        grade='레전드리',
        info=[
            AbilityInfoItem(grade='레전드리', value='버프 스킬의 지속 시간 50% 증가'),
            AbilityInfoItem(grade='유니크', value='상태 이상에 걸린 대상 공격 시 데미지 8% 증가'),
            AbilityInfoItem(grade='유니크', value='보스 몬스터 공격 시 데미지 10% 증가')
        ]
    ),
    preset2=AbilityPreset(
        grade='레전드리',
        info=[
            AbilityInfoItem(grade='레전드리', value='아이템 드롭률 19% 증가'),
            AbilityInfoItem(grade='에픽', value='버프 스킬의 지속 시간 19% 증가'),
            AbilityInfoItem(grade='유니크', value='메소 획득량 15% 증가')
        ]
    ),
    preset3=AbilityPreset(
        grade='에픽',
        info=[
            AbilityInfoItem(grade='에픽', value='모든 능력치 15 증가'),
            AbilityInfoItem(grade='레어', value='모든 능력치 5 증가'),
            AbilityInfoItem(grade='레어', value='모든 능력치 5 증가')
        ]
    )
)
```
</details>

<details>
<summary>Gulid</summary>

To query guild information, you only need the **guild name** and the **world name** to which the guild belongs.

```python
>>> from mapletory.services.guild import Guild
>>> guild = Guild(name="리더", world="스카니아")

>>> print(guild)
Guild(
    name='리더',
    world='스카니아',
    id='789b457f357ce6ac3e1bfa1c95ccaac6',
    basic=GuildBasic(
        date=datetime.datetime(2024, 2, 7, 0, 0, tzinfo=TzInfo(+09:00)),
        world='스카니아',
        name='리더',
        level=29,
        fame=65312548,
        point=10000000,
        master_name='아델',
        member_count=160,
        members=[
            '아델',
            '충신정럭이1',
            '충신정럭이2',
            ...
        ],
        skills=[
            GuildSkill(
                name='장사꾼',
                description='[마스터 레벨 : 3]\r\n상점에서 물건을 구매 시 싸게 살 수 있다. 단, 일부 아이템에는 적용되지 않는다.\n[필요 조건]: 길드 10레벨 이상\n[필요 스킬]: 잔돈이 눈에 띄네 3레벨 이상',
                level=3,
                effect='상점에서 물건 구매 시 4% 싸게 구매 가능. 단, 판매 가격 대비 구매 가격이 70% 이상일 경우 적용되지 않음',
                icon=Url('https://open.api.nexon.com/static/maplestory/SkillIcon/KFGDLHOBMI.png')
            ),
            ...
        ],
        noblesse_skills=[
            GuildSkill(
                name='보스 킬링 머신',
                description='[마스터 레벨 : 15]\r\n일정 시간 동안 보스 몬스터 공격 시 데미지가 증가한다.',
                level=15,
                effect='30분 동안 보스 몬스터 공격 시 데미지 30% 증가, 재사용 대기시간 60분',
                icon=Url('https://open.api.nexon.com/static/maplestory/SkillIcon/KFGDLHPBOC.png')
            ),
            ...
        ],
        mark=<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=17x17 at 0x10C9C04D0>,
        is_custom_mark=True
    )
)
```
</details>

<details>
<summary>Union</summary>

Raider effects, occupation effects, and artifact effects each show a **summarized result**.

For example, if there are two instances of `STR 100 increase`, it will be shown as `STR 200 increase`.

In addition, `STR, DEX, LUK 40 increase` is broken down into `STR 40 increase`, `DEX 40 increase`, `LUK 40 increase`, and `Attack/Magic Attack 20 increase` is calculated as `Attack 20 increase`, `Magic Attack 20 increase`.

However, options that ignore defense rate are not combined due to multiplicative application. (Plans are to provide ignored defense rate calculations in a multiplicative manner in the future.)

```python
>>> from maplestory.services.union import Union
>>> union = Union(character_name="온앤온")
>>> print(union)
Union(
    character_name='온앤온',
    date=datetime.datetime(2024, 2, 9, 9, 59, 37, 37959, tzinfo=zoneinfo.ZoneInfo(key='Asia/Seoul')),
    level=8870,
    grade='그랜드 마스터 유니온 2',
    raider_stats=UnionStats(
        [
            UnionStat(stat='DEX 320 증가'),
            UnionStat(stat='INT 660 증가'),
            UnionStat(stat='LUK 440 증가'),
            UnionStat(stat='STR 440 증가'),
            UnionStat(stat='경험치 획득량 10% 증가'),
            UnionStat(stat='공격 시 20%의 확률로 데미지 16% 증가'),
            UnionStat(stat='공격력 20 증가'),
            UnionStat(stat='마력 20 증가'),
            UnionStat(stat='메소 획득량 4% 증가'),
            UnionStat(stat='방어율 무시 5% 증가'),
            UnionStat(stat='버프 지속시간 20% 증가'),
            UnionStat(stat='보스 몬스터 공격 시 데미지 5% 증가'),
            UnionStat(stat='상태 이상 내성 4 증가'),
            UnionStat(stat='스킬 재사용 대기시간 5% 감소'),
            UnionStat(stat='적 공격마다 70%의 확률로 순수 MP의 8% 회복'),
            UnionStat(stat='최대 MP 6% 증가'),
            UnionStat(stat='크리티컬 데미지 5% 증가'),
            UnionStat(stat='크리티컬 확률 8% 증가')
        ]
    ),
    occupied_stats=UnionStats(
        [
            UnionStat(stat='INT 25 증가'),
            UnionStat(stat='LUK 5 증가'),
            UnionStat(stat='마력 5 증가'),
            UnionStat(stat='방어율 무시 33% 증가'),
            UnionStat(stat='버프 지속시간 40% 증가'),
            UnionStat(stat='보스 몬스터 공격 시 데미지 23% 증가'),
            UnionStat(stat='크리티컬 데미지 20.00% 증가'),
            UnionStat(stat='크리티컬 확률 11% 증가')
        ]
    ),
    artifact_effects=[
        UnionArtifactEffect(name='올스탯 150 증가', level=10),
        UnionArtifactEffect(name='공격력 18, 마력 18 증가', level=6),
        UnionArtifactEffect(name='데미지 15.00% 증가', level=10),
        UnionArtifactEffect(name='보스 몬스터 공격 시 데미지 15.00% 증가', level=10),
        UnionArtifactEffect(name='몬스터 방어율 무시 20% 증가', level=10),
        UnionArtifactEffect(name='버프 지속시간 20% 증가', level=10),
        UnionArtifactEffect(name='아이템 드롭률 7% 증가', level=6),
        UnionArtifactEffect(name='크리티컬 확률 20% 증가', level=10),
        UnionArtifactEffect(name='크리티컬 데미지 2.40% 증가', level=6)
    ]
)
```

You can also access attributes in Korean.
- `공격대원효과`
- `공격대점령효과`
- `아티팩트효과`

```python
>>> print(union.공격대원효과)
UnionStats(
    [
        UnionStat('DEX 320 증가'),
        UnionStat('INT 660 증가'),
        UnionStat('LUK 440 증가'),
        UnionStat('STR 440 증가'),
        UnionStat('경험치 획득량 10% 증가'),
        UnionStat('공격 시 20%의 확률로 데미지 16% 증가'),
        UnionStat('공격력 20 증가'),
        UnionStat('마력 20 증가'),
        UnionStat('메소 획득량 4% 증가'),
        UnionStat('방어율 무시 5% 증가'),
        UnionStat('버프 지속시간 20% 증가'),
        UnionStat('보스 몬스터 공격 시 데미지 5% 증가'),
        UnionStat('상태 이상 내성 4 증가'),
        UnionStat('스킬 재사용 대기시간 5% 감소'),
        UnionStat('적 공격마다 70%의 확률로 순수 MP의 8% 회복'),
        UnionStat('최대 MP 6% 증가'),
        UnionStat('크리티컬 데미지 5% 증가'),
        UnionStat('크리티컬 확률 8% 증가')
    ]
)

>>> print(union.공격대점령효과)
UnionStats(
    [
        UnionStat('INT 25 증가'),
        UnionStat('LUK 5 증가'),
        UnionStat('마력 5 증가'),
        UnionStat('방어율 무시 33% 증가'),
        UnionStat('버프 지속시간 40% 증가'),
        UnionStat('보스 몬스터 공격 시 데미지 23% 증가'),
        UnionStat('크리티컬 데미지 20.00% 증가'),
        UnionStat('크리티컬 확률 11% 증가')
    ]
)

>>> print(union.아티팩트효과)
[
    UnionArtifactEffect(name='올스탯 150 증가', level=10),
    UnionArtifactEffect(name='공격력 18, 마력 18 증가', level=6),
    UnionArtifactEffect(name='데미지 15.00% 증가', level=10),
    UnionArtifactEffect(name='보스 몬스터 공격 시 데미지 15.00% 증가', level=10),
    UnionArtifactEffect(name='몬스터 방어율 무시 20% 증가', level=10),
    UnionArtifactEffect(name='버프 지속시간 20% 증가', level=10),
    UnionArtifactEffect(name='아이템 드롭률 7% 증가', level=6),
    UnionArtifactEffect(name='크리티컬 확률 20% 증가', level=10),
    UnionArtifactEffect(name='크리티컬 데미지 2.40% 증가', level=6)
]
```
</details>

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/nanpuhaha/maplestory-py",
    "name": "maplestory-sdk-py",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.11,<4.0",
    "maintainer_email": "",
    "keywords": "maplestory,api,api-wrapper",
    "author": "Jangwon Seo",
    "author_email": "nanpuhaha@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/d6/da/207e9e589fa82b8a4909a18cb52e05c37d401bc0430505b2cfa9148dff9a/maplestory_sdk_py-1.0.1.tar.gz",
    "platform": null,
    "description": "# <p align=\"center\">MapleStory OpenAPI Python Client Library</p>\n<p align=\"center\">A simple, but extensible Python implementation for the <a href=\"https://openapi.nexon.com/game/maplestory/?id=22\">MapleStory OpenAPI</a>.</p>\n<p align=\"center\">\n<a>\n    <img src=\"https://img.shields.io/pypi/pyversions/maplestory\" alt=\"PyPI - Python Version\">\n</a>\n<a>\n    <img src=\"https://img.shields.io/pypi/v/maplestory\" alt=\"PyPI - Version\">\n</a>\n<a href=\"https://github.com/nanpuhaha/maplestory-py/actions/workflows/pytest.yml\">\n    <img src=\"https://github.com/nanpuhaha/maplestory-py/actions/workflows/pytest.yml/badge.svg\" alt=\"Test with pytest\">\n</a>\n<a href=\"https://codecov.io/gh/nanpuhaha/maplestory-py\">\n    <img src=\"https://codecov.io/gh/nanpuhaha/maplestory-py/graph/badge.svg?token=H4S1BWRFJB\" alt=\"codecov\">\n</a>\n</p>\n\n---\n\n> [!NOTE]\n> This library can only query data from the **[KMS](https://maplestory.nexon.com)**(Korea MapleStory).\n\n---\n\n## Overview\n\nThis library simplifies access to MapleStory's OpenAPI in Python, enabling queries of character, union, guild, and ranking information, as well as checks on Star Force, cubes, and potential abilities.\n\n## Installation\n\nIf you are using pip:\n\n```shell\npip install maplestory\n```\n\nIf you are using poetry:\n\n```shell\npoetry add maplestory\n```\n\n### Supported Python Versions\n\nPython 3.11 and 3.12 are fully supported and tested. While it may operate on subsequent versions of Python 3, testing against these newer versions is not currently conducted.\n\n### Unsupported Python Versions\n\n- Python < 3.11\n\n### Third Party Libraries and Dependencies\n\nThe following libraries will be installed when you install the client library:\n\n- [pydantic v2](https://docs.pydantic.dev)\n- [httpx](https://www.python-httpx.org)\n- [tenacity](https://tenacity.readthedocs.io)\n\n## Usage\n\n### API credentials\n\nTo use the MapleStory OpenAPI, you first need to create a Nexon account at https://www.nexon.com. After creating your account, proceed to the [NEXON OPEN API site](https://openapi.nexon.com) and create a new application. Once your application is created, copy the **API Key** and set it as an environment variable or enter it into a `.env` file within your project.\n\n```env\n# set environment variable\nMAPLESTORY_OPENAPI_KEY=INSERT_YOUR_KEY_HERE\n```\n\n### Examples\n\nOnly the **names**, such as character names and guild names, are required.\n\nIf you wish to query a specific date in the past, you can also enter the date.\nBy default, the query is based on the date of yesterday. (The plan is to detail this further by API type in the future.)\n\n<details>\n<summary>Character</summary>\n\nYou can query all character data using just the **character name** using `Character` class.\n\n```python\n>>> from mapletory.services.character import Character\n>>> char = Character(name=\"\uc628\uc564\uc628\")\n\n>>> print(char)\nCharacterBasic(\n    date=datetime.datetime(2024, 2, 10, 0, 0, tzinfo=TzInfo(+09:00)),\n    name='\uc628\uc564\uc628',\n    world='\uc2a4\uce74\ub2c8\uc544',\n    gender='\uc5ec',\n    job='\uc544\ud06c\uba54\uc774\uc9c0(\uc36c,\ucf5c)',\n    job_level=6,\n    level=280,\n    exp=29014907373569,\n    exp_rate=86.232,\n    guild_name='\uc628\uc564\uc628',\n    image=<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=96x96 at 0x1063C16D0>\n)\n\n>>> print(char.ability)\nAbility(\n    date=datetime.datetime(2024, 2, 4, 0, 0, tzinfo=TzInfo(+09:00)),\n    grade='\ub808\uc804\ub4dc\ub9ac',\n    info=[\n        AbilityInfoItem(grade='\ub808\uc804\ub4dc\ub9ac', value='\ubc84\ud504 \uc2a4\ud0ac\uc758 \uc9c0\uc18d \uc2dc\uac04 50% \uc99d\uac00'),\n        AbilityInfoItem(grade='\uc720\ub2c8\ud06c', value='\uc0c1\ud0dc \uc774\uc0c1\uc5d0 \uac78\ub9b0 \ub300\uc0c1 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 8% \uc99d\uac00'),\n        AbilityInfoItem(grade='\uc720\ub2c8\ud06c', value='\ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 10% \uc99d\uac00')\n    ],\n    remain_fame=465283,\n    preset_no=1,\n    preset1=AbilityPreset(\n        grade='\ub808\uc804\ub4dc\ub9ac',\n        info=[\n            AbilityInfoItem(grade='\ub808\uc804\ub4dc\ub9ac', value='\ubc84\ud504 \uc2a4\ud0ac\uc758 \uc9c0\uc18d \uc2dc\uac04 50% \uc99d\uac00'),\n            AbilityInfoItem(grade='\uc720\ub2c8\ud06c', value='\uc0c1\ud0dc \uc774\uc0c1\uc5d0 \uac78\ub9b0 \ub300\uc0c1 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 8% \uc99d\uac00'),\n            AbilityInfoItem(grade='\uc720\ub2c8\ud06c', value='\ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 10% \uc99d\uac00')\n        ]\n    ),\n    preset2=AbilityPreset(\n        grade='\ub808\uc804\ub4dc\ub9ac',\n        info=[\n            AbilityInfoItem(grade='\ub808\uc804\ub4dc\ub9ac', value='\uc544\uc774\ud15c \ub4dc\ub86d\ub960 19% \uc99d\uac00'),\n            AbilityInfoItem(grade='\uc5d0\ud53d', value='\ubc84\ud504 \uc2a4\ud0ac\uc758 \uc9c0\uc18d \uc2dc\uac04 19% \uc99d\uac00'),\n            AbilityInfoItem(grade='\uc720\ub2c8\ud06c', value='\uba54\uc18c \ud68d\ub4dd\ub7c9 15% \uc99d\uac00')\n        ]\n    ),\n    preset3=AbilityPreset(\n        grade='\uc5d0\ud53d',\n        info=[\n            AbilityInfoItem(grade='\uc5d0\ud53d', value='\ubaa8\ub4e0 \ub2a5\ub825\uce58 15 \uc99d\uac00'),\n            AbilityInfoItem(grade='\ub808\uc5b4', value='\ubaa8\ub4e0 \ub2a5\ub825\uce58 5 \uc99d\uac00'),\n            AbilityInfoItem(grade='\ub808\uc5b4', value='\ubaa8\ub4e0 \ub2a5\ub825\uce58 5 \uc99d\uac00')\n        ]\n    )\n)\n```\n</details>\n\n<details>\n<summary>Gulid</summary>\n\nTo query guild information, you only need the **guild name** and the **world name** to which the guild belongs.\n\n```python\n>>> from mapletory.services.guild import Guild\n>>> guild = Guild(name=\"\ub9ac\ub354\", world=\"\uc2a4\uce74\ub2c8\uc544\")\n\n>>> print(guild)\nGuild(\n    name='\ub9ac\ub354',\n    world='\uc2a4\uce74\ub2c8\uc544',\n    id='789b457f357ce6ac3e1bfa1c95ccaac6',\n    basic=GuildBasic(\n        date=datetime.datetime(2024, 2, 7, 0, 0, tzinfo=TzInfo(+09:00)),\n        world='\uc2a4\uce74\ub2c8\uc544',\n        name='\ub9ac\ub354',\n        level=29,\n        fame=65312548,\n        point=10000000,\n        master_name='\uc544\ub378',\n        member_count=160,\n        members=[\n            '\uc544\ub378',\n            '\ucda9\uc2e0\uc815\ub7ed\uc7741',\n            '\ucda9\uc2e0\uc815\ub7ed\uc7742',\n            ...\n        ],\n        skills=[\n            GuildSkill(\n                name='\uc7a5\uc0ac\uafbc',\n                description='[\ub9c8\uc2a4\ud130 \ub808\ubca8 : 3]\\r\\n\uc0c1\uc810\uc5d0\uc11c \ubb3c\uac74\uc744 \uad6c\ub9e4 \uc2dc \uc2f8\uac8c \uc0b4 \uc218 \uc788\ub2e4. \ub2e8, \uc77c\ubd80 \uc544\uc774\ud15c\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4.\\n[\ud544\uc694 \uc870\uac74]: \uae38\ub4dc 10\ub808\ubca8 \uc774\uc0c1\\n[\ud544\uc694 \uc2a4\ud0ac]: \uc794\ub3c8\uc774 \ub208\uc5d0 \ub744\ub124 3\ub808\ubca8 \uc774\uc0c1',\n                level=3,\n                effect='\uc0c1\uc810\uc5d0\uc11c \ubb3c\uac74 \uad6c\ub9e4 \uc2dc 4% \uc2f8\uac8c \uad6c\ub9e4 \uac00\ub2a5. \ub2e8, \ud310\ub9e4 \uac00\uaca9 \ub300\ube44 \uad6c\ub9e4 \uac00\uaca9\uc774 70% \uc774\uc0c1\uc77c \uacbd\uc6b0 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc74c',\n                icon=Url('https://open.api.nexon.com/static/maplestory/SkillIcon/KFGDLHOBMI.png')\n            ),\n            ...\n        ],\n        noblesse_skills=[\n            GuildSkill(\n                name='\ubcf4\uc2a4 \ud0ac\ub9c1 \uba38\uc2e0',\n                description='[\ub9c8\uc2a4\ud130 \ub808\ubca8 : 15]\\r\\n\uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0\uac00 \uc99d\uac00\ud55c\ub2e4.',\n                level=15,\n                effect='30\ubd84 \ub3d9\uc548 \ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 30% \uc99d\uac00, \uc7ac\uc0ac\uc6a9 \ub300\uae30\uc2dc\uac04 60\ubd84',\n                icon=Url('https://open.api.nexon.com/static/maplestory/SkillIcon/KFGDLHPBOC.png')\n            ),\n            ...\n        ],\n        mark=<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=17x17 at 0x10C9C04D0>,\n        is_custom_mark=True\n    )\n)\n```\n</details>\n\n<details>\n<summary>Union</summary>\n\nRaider effects, occupation effects, and artifact effects each show a **summarized result**.\n\nFor example, if there are two instances of `STR 100 increase`, it will be shown as `STR 200 increase`.\n\nIn addition, `STR, DEX, LUK 40 increase` is broken down into `STR 40 increase`, `DEX 40 increase`, `LUK 40 increase`, and `Attack/Magic Attack 20 increase` is calculated as `Attack 20 increase`, `Magic Attack 20 increase`.\n\nHowever, options that ignore defense rate are not combined due to multiplicative application. (Plans are to provide ignored defense rate calculations in a multiplicative manner in the future.)\n\n```python\n>>> from maplestory.services.union import Union\n>>> union = Union(character_name=\"\uc628\uc564\uc628\")\n>>> print(union)\nUnion(\n    character_name='\uc628\uc564\uc628',\n    date=datetime.datetime(2024, 2, 9, 9, 59, 37, 37959, tzinfo=zoneinfo.ZoneInfo(key='Asia/Seoul')),\n    level=8870,\n    grade='\uadf8\ub79c\ub4dc \ub9c8\uc2a4\ud130 \uc720\ub2c8\uc628 2',\n    raider_stats=UnionStats(\n        [\n            UnionStat(stat='DEX 320 \uc99d\uac00'),\n            UnionStat(stat='INT 660 \uc99d\uac00'),\n            UnionStat(stat='LUK 440 \uc99d\uac00'),\n            UnionStat(stat='STR 440 \uc99d\uac00'),\n            UnionStat(stat='\uacbd\ud5d8\uce58 \ud68d\ub4dd\ub7c9 10% \uc99d\uac00'),\n            UnionStat(stat='\uacf5\uaca9 \uc2dc 20%\uc758 \ud655\ub960\ub85c \ub370\ubbf8\uc9c0 16% \uc99d\uac00'),\n            UnionStat(stat='\uacf5\uaca9\ub825 20 \uc99d\uac00'),\n            UnionStat(stat='\ub9c8\ub825 20 \uc99d\uac00'),\n            UnionStat(stat='\uba54\uc18c \ud68d\ub4dd\ub7c9 4% \uc99d\uac00'),\n            UnionStat(stat='\ubc29\uc5b4\uc728 \ubb34\uc2dc 5% \uc99d\uac00'),\n            UnionStat(stat='\ubc84\ud504 \uc9c0\uc18d\uc2dc\uac04 20% \uc99d\uac00'),\n            UnionStat(stat='\ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 5% \uc99d\uac00'),\n            UnionStat(stat='\uc0c1\ud0dc \uc774\uc0c1 \ub0b4\uc131 4 \uc99d\uac00'),\n            UnionStat(stat='\uc2a4\ud0ac \uc7ac\uc0ac\uc6a9 \ub300\uae30\uc2dc\uac04 5% \uac10\uc18c'),\n            UnionStat(stat='\uc801 \uacf5\uaca9\ub9c8\ub2e4 70%\uc758 \ud655\ub960\ub85c \uc21c\uc218 MP\uc758 8% \ud68c\ubcf5'),\n            UnionStat(stat='\ucd5c\ub300 MP 6% \uc99d\uac00'),\n            UnionStat(stat='\ud06c\ub9ac\ud2f0\uceec \ub370\ubbf8\uc9c0 5% \uc99d\uac00'),\n            UnionStat(stat='\ud06c\ub9ac\ud2f0\uceec \ud655\ub960 8% \uc99d\uac00')\n        ]\n    ),\n    occupied_stats=UnionStats(\n        [\n            UnionStat(stat='INT 25 \uc99d\uac00'),\n            UnionStat(stat='LUK 5 \uc99d\uac00'),\n            UnionStat(stat='\ub9c8\ub825 5 \uc99d\uac00'),\n            UnionStat(stat='\ubc29\uc5b4\uc728 \ubb34\uc2dc 33% \uc99d\uac00'),\n            UnionStat(stat='\ubc84\ud504 \uc9c0\uc18d\uc2dc\uac04 40% \uc99d\uac00'),\n            UnionStat(stat='\ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 23% \uc99d\uac00'),\n            UnionStat(stat='\ud06c\ub9ac\ud2f0\uceec \ub370\ubbf8\uc9c0 20.00% \uc99d\uac00'),\n            UnionStat(stat='\ud06c\ub9ac\ud2f0\uceec \ud655\ub960 11% \uc99d\uac00')\n        ]\n    ),\n    artifact_effects=[\n        UnionArtifactEffect(name='\uc62c\uc2a4\ud0ef 150 \uc99d\uac00', level=10),\n        UnionArtifactEffect(name='\uacf5\uaca9\ub825 18, \ub9c8\ub825 18 \uc99d\uac00', level=6),\n        UnionArtifactEffect(name='\ub370\ubbf8\uc9c0 15.00% \uc99d\uac00', level=10),\n        UnionArtifactEffect(name='\ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 15.00% \uc99d\uac00', level=10),\n        UnionArtifactEffect(name='\ubaac\uc2a4\ud130 \ubc29\uc5b4\uc728 \ubb34\uc2dc 20% \uc99d\uac00', level=10),\n        UnionArtifactEffect(name='\ubc84\ud504 \uc9c0\uc18d\uc2dc\uac04 20% \uc99d\uac00', level=10),\n        UnionArtifactEffect(name='\uc544\uc774\ud15c \ub4dc\ub86d\ub960 7% \uc99d\uac00', level=6),\n        UnionArtifactEffect(name='\ud06c\ub9ac\ud2f0\uceec \ud655\ub960 20% \uc99d\uac00', level=10),\n        UnionArtifactEffect(name='\ud06c\ub9ac\ud2f0\uceec \ub370\ubbf8\uc9c0 2.40% \uc99d\uac00', level=6)\n    ]\n)\n```\n\nYou can also access attributes in Korean.\n- `\uacf5\uaca9\ub300\uc6d0\ud6a8\uacfc`\n- `\uacf5\uaca9\ub300\uc810\ub839\ud6a8\uacfc`\n- `\uc544\ud2f0\ud329\ud2b8\ud6a8\uacfc`\n\n```python\n>>> print(union.\uacf5\uaca9\ub300\uc6d0\ud6a8\uacfc)\nUnionStats(\n    [\n        UnionStat('DEX 320 \uc99d\uac00'),\n        UnionStat('INT 660 \uc99d\uac00'),\n        UnionStat('LUK 440 \uc99d\uac00'),\n        UnionStat('STR 440 \uc99d\uac00'),\n        UnionStat('\uacbd\ud5d8\uce58 \ud68d\ub4dd\ub7c9 10% \uc99d\uac00'),\n        UnionStat('\uacf5\uaca9 \uc2dc 20%\uc758 \ud655\ub960\ub85c \ub370\ubbf8\uc9c0 16% \uc99d\uac00'),\n        UnionStat('\uacf5\uaca9\ub825 20 \uc99d\uac00'),\n        UnionStat('\ub9c8\ub825 20 \uc99d\uac00'),\n        UnionStat('\uba54\uc18c \ud68d\ub4dd\ub7c9 4% \uc99d\uac00'),\n        UnionStat('\ubc29\uc5b4\uc728 \ubb34\uc2dc 5% \uc99d\uac00'),\n        UnionStat('\ubc84\ud504 \uc9c0\uc18d\uc2dc\uac04 20% \uc99d\uac00'),\n        UnionStat('\ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 5% \uc99d\uac00'),\n        UnionStat('\uc0c1\ud0dc \uc774\uc0c1 \ub0b4\uc131 4 \uc99d\uac00'),\n        UnionStat('\uc2a4\ud0ac \uc7ac\uc0ac\uc6a9 \ub300\uae30\uc2dc\uac04 5% \uac10\uc18c'),\n        UnionStat('\uc801 \uacf5\uaca9\ub9c8\ub2e4 70%\uc758 \ud655\ub960\ub85c \uc21c\uc218 MP\uc758 8% \ud68c\ubcf5'),\n        UnionStat('\ucd5c\ub300 MP 6% \uc99d\uac00'),\n        UnionStat('\ud06c\ub9ac\ud2f0\uceec \ub370\ubbf8\uc9c0 5% \uc99d\uac00'),\n        UnionStat('\ud06c\ub9ac\ud2f0\uceec \ud655\ub960 8% \uc99d\uac00')\n    ]\n)\n\n>>> print(union.\uacf5\uaca9\ub300\uc810\ub839\ud6a8\uacfc)\nUnionStats(\n    [\n        UnionStat('INT 25 \uc99d\uac00'),\n        UnionStat('LUK 5 \uc99d\uac00'),\n        UnionStat('\ub9c8\ub825 5 \uc99d\uac00'),\n        UnionStat('\ubc29\uc5b4\uc728 \ubb34\uc2dc 33% \uc99d\uac00'),\n        UnionStat('\ubc84\ud504 \uc9c0\uc18d\uc2dc\uac04 40% \uc99d\uac00'),\n        UnionStat('\ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 23% \uc99d\uac00'),\n        UnionStat('\ud06c\ub9ac\ud2f0\uceec \ub370\ubbf8\uc9c0 20.00% \uc99d\uac00'),\n        UnionStat('\ud06c\ub9ac\ud2f0\uceec \ud655\ub960 11% \uc99d\uac00')\n    ]\n)\n\n>>> print(union.\uc544\ud2f0\ud329\ud2b8\ud6a8\uacfc)\n[\n    UnionArtifactEffect(name='\uc62c\uc2a4\ud0ef 150 \uc99d\uac00', level=10),\n    UnionArtifactEffect(name='\uacf5\uaca9\ub825 18, \ub9c8\ub825 18 \uc99d\uac00', level=6),\n    UnionArtifactEffect(name='\ub370\ubbf8\uc9c0 15.00% \uc99d\uac00', level=10),\n    UnionArtifactEffect(name='\ubcf4\uc2a4 \ubaac\uc2a4\ud130 \uacf5\uaca9 \uc2dc \ub370\ubbf8\uc9c0 15.00% \uc99d\uac00', level=10),\n    UnionArtifactEffect(name='\ubaac\uc2a4\ud130 \ubc29\uc5b4\uc728 \ubb34\uc2dc 20% \uc99d\uac00', level=10),\n    UnionArtifactEffect(name='\ubc84\ud504 \uc9c0\uc18d\uc2dc\uac04 20% \uc99d\uac00', level=10),\n    UnionArtifactEffect(name='\uc544\uc774\ud15c \ub4dc\ub86d\ub960 7% \uc99d\uac00', level=6),\n    UnionArtifactEffect(name='\ud06c\ub9ac\ud2f0\uceec \ud655\ub960 20% \uc99d\uac00', level=10),\n    UnionArtifactEffect(name='\ud06c\ub9ac\ud2f0\uceec \ub370\ubbf8\uc9c0 2.40% \uc99d\uac00', level=6)\n]\n```\n</details>\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "MapleStory OpenAPI Python Client Library",
    "version": "1.0.1",
    "project_urls": {
        "Bug Tracker": "https://github.com/nanpuhaha/maplestory-py/issues",
        "Changelog": "https://github.com/nanpuhaha/maplestory-py/blob/main/CHANGELOG.md",
        "Documentation": "https://readthedocs.org",
        "Homepage": "https://github.com/nanpuhaha/maplestory-py",
        "Repository": "https://github.com/nanpuhaha/maplestory-py"
    },
    "split_keywords": [
        "maplestory",
        "api",
        "api-wrapper"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "78e75125ed07bd557f04bc440a7f8e1b8f890b8f495921a576c6831ba21adf8c",
                "md5": "f8f62013ed6a284a73e5878d62cb9e98",
                "sha256": "674e40cda268b10d83e86c2b1ca679919f3c37b87e233044fc52a67a7a2d7a93"
            },
            "downloads": -1,
            "filename": "maplestory_sdk_py-1.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f8f62013ed6a284a73e5878d62cb9e98",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11,<4.0",
            "size": 160491,
            "upload_time": "2024-02-12T02:35:51",
            "upload_time_iso_8601": "2024-02-12T02:35:51.123727Z",
            "url": "https://files.pythonhosted.org/packages/78/e7/5125ed07bd557f04bc440a7f8e1b8f890b8f495921a576c6831ba21adf8c/maplestory_sdk_py-1.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d6da207e9e589fa82b8a4909a18cb52e05c37d401bc0430505b2cfa9148dff9a",
                "md5": "883fdc74750d3a53485fe7e61033dfdd",
                "sha256": "22a8ed9a5d436ef7a725231a5321c6f38b61b158762855bb2a93a9dd427fd0d2"
            },
            "downloads": -1,
            "filename": "maplestory_sdk_py-1.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "883fdc74750d3a53485fe7e61033dfdd",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11,<4.0",
            "size": 100300,
            "upload_time": "2024-02-12T02:35:52",
            "upload_time_iso_8601": "2024-02-12T02:35:52.814726Z",
            "url": "https://files.pythonhosted.org/packages/d6/da/207e9e589fa82b8a4909a18cb52e05c37d401bc0430505b2cfa9148dff9a/maplestory_sdk_py-1.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-02-12 02:35:52",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "nanpuhaha",
    "github_project": "maplestory-py",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "maplestory-sdk-py"
}
        
Elapsed time: 0.18194s