Source code for artifacts.client

"""Main client entry point for the Artifacts MMO SDK."""

from __future__ import annotations

from typing import Optional

from .character import Character
from .http import HttpClient, RetryConfig
from .api.accounts import AccountsAPI
from .api.achievements import AchievementsAPI
from .api.badges import BadgesAPI
from .api.characters import CharactersAPI
from .api.effects import EffectsAPI
from .api.events import EventsAPI
from .api.grand_exchange import GrandExchangeAPI
from .api.items import ItemsAPI
from .api.leaderboard import LeaderboardAPI
from .api.maps import MapsAPI
from .api.monsters import MonstersAPI
from .api.my_account import MyAccountAPI
from .api.npcs import NPCsAPI
from .api.resources import ResourcesAPI
from .api.sandbox import SandboxAPI
from .api.server import ServerAPI
from .api.simulation import SimulationAPI
from .api.tasks import TasksAPI
from .api.token import TokenAPI


[docs] class AsyncArtifactsClient: """Async SDK client for the Artifacts MMO API. Use as an async context manager:: async with AsyncArtifactsClient(token="your_token") as client: char = client.character("MyChar") await char.move(x=0, y=1) # auto-waits cooldown await char.fight() # auto-waits cooldown Parameters ---------- token: JWT token for authentication. Generate one via ``client.token.generate(username, password)`` or pass an existing token. base_url: API base URL. Defaults to the production server. auto_wait: If ``True`` (default), every action automatically sleeps until its cooldown expires. Disable globally here or per-character/per-call. retry: Custom retry configuration. Defaults to 3 retries with exponential backoff. """ def __init__( self, token: Optional[str] = None, *, base_url: str = "https://api.artifactsmmo.com", auto_wait: bool = True, retry: Optional[RetryConfig] = None, ): self._http = HttpClient(base_url=base_url, token=token, retry=retry) # Shared mutable reference so that ``client.auto_wait = False`` # propagates instantly to every Character/Domain created from this client. self._auto_wait_ref: list = [auto_wait] # -- Sub-accessors (game data & account) -- self.server = ServerAPI(self._http) self.token = TokenAPI(self._http) self.accounts = AccountsAPI(self._http) self.my_account = MyAccountAPI(self._http) self.characters = CharactersAPI(self._http) self.achievements = AchievementsAPI(self._http) self.badges = BadgesAPI(self._http) self.effects = EffectsAPI(self._http) self.events = EventsAPI(self._http) self.grand_exchange = GrandExchangeAPI(self._http) self.items = ItemsAPI(self._http) self.leaderboard = LeaderboardAPI(self._http) self.maps = MapsAPI(self._http) self.monsters = MonstersAPI(self._http) self.npcs = NPCsAPI(self._http) self.resources = ResourcesAPI(self._http) self.tasks = TasksAPI(self._http) self.simulation = SimulationAPI(self._http) self.sandbox = SandboxAPI(self._http) # -- Global auto_wait toggle -- @property def auto_wait(self) -> bool: """Whether actions automatically sleep until their cooldown expires. Setting this on the client affects **all** characters that were created without an explicit per-character override:: client.auto_wait = False # disable globally client.auto_wait = True # re-enable globally """ return self._auto_wait_ref[0] @auto_wait.setter def auto_wait(self, value: bool) -> None: self._auto_wait_ref[0] = value # -- Character factory --
[docs] def character(self, name: str, *, auto_wait: Optional[bool] = None) -> Character: """Return a :class:`Character` controller for *name*. Parameters ---------- auto_wait: Override the client-level ``auto_wait`` setting for this character. If ``None`` (default), the character shares the client reference and will reflect any future changes to ``client.auto_wait`` automatically. """ # Per-character override: pass a plain bool (isolated copy). # No override: pass the shared mutable list so the character # tracks the client-level setting dynamically. source = [auto_wait] if auto_wait is not None else self._auto_wait_ref return Character(name=name, http=self._http, auto_wait=source)
# -- Context manager --
[docs] async def start(self) -> None: """Start the HTTP session (called automatically by ``__aenter__``).""" await self._http.start()
[docs] async def close(self) -> None: """Close the HTTP session (called automatically by ``__aexit__``).""" await self._http.close()
async def __aenter__(self) -> AsyncArtifactsClient: await self.start() return self async def __aexit__(self, exc_type, exc_val, exc_tb) -> None: await self.close()