Source code for artifacts.domains.equipment

"""Equipment domain -- equip and unequip items."""

from __future__ import annotations

from enum import Enum
from typing import Any

from ..cooldown import _auto_cooldown
from ..models.enums import ItemSlot
from ..models.responses import EquipmentTransactionSchema
from ._base import CharacterDomain


def _dump_item(item: Any) -> dict:
    if hasattr(item, "model_dump"):
        return item.model_dump(mode="json", exclude_none=True)
    if hasattr(item, "dict"):
        data = item.dict(exclude_none=True)
    else:
        data = dict(item)
    return {
        key: value.value if isinstance(value, Enum) else value
        for key, value in data.items()
    }


[docs] class EquipmentDomain(CharacterDomain): """Manage character equipment. Accessed via ``character.equipment``:: await char.equipment.equip(code="iron_sword", slot=ItemSlot.WEAPON) await char.equipment.unequip(slot=ItemSlot.HELMET) """
[docs] @_auto_cooldown async def equip( self, *, code: str, slot: ItemSlot, quantity: int = 1 ) -> EquipmentTransactionSchema: """Equip an item into a slot.""" return await self._equip_items( [{"code": code, "slot": slot.value, "quantity": quantity}] )
[docs] @_auto_cooldown async def equip_items(self, items: list[Any]) -> EquipmentTransactionSchema: """Equip one or more items into slots.""" return await self._equip_items(items)
async def _equip_items(self, items: list[Any]) -> EquipmentTransactionSchema: return await self._http.post_model( f"{self._base}/equip", EquipmentTransactionSchema, json=[_dump_item(item) for item in items], )
[docs] @_auto_cooldown async def unequip( self, *, slot: ItemSlot, quantity: int = 1 ) -> EquipmentTransactionSchema: """Unequip an item from a slot.""" return await self._unequip_items( [{"slot": slot.value, "quantity": quantity}] )
[docs] @_auto_cooldown async def unequip_items(self, items: list[Any]) -> EquipmentTransactionSchema: """Unequip one or more items from slots.""" return await self._unequip_items(items)
async def _unequip_items(self, items: list[Any]) -> EquipmentTransactionSchema: return await self._http.post_model( f"{self._base}/unequip", EquipmentTransactionSchema, json=[_dump_item(item) for item in items], )