From df432819315467450da9a835d0d906f3acddf90d Mon Sep 17 00:00:00 2001 From: Bananchiki Date: Fri, 30 Aug 2024 15:41:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=20set=5Ftrade=5Fmode=20(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Уточнение ошибки в set_trade_link * Добавлен set_trade_mode --- steam_trader/_client.py | 4 +- steam_trader/_client_async.py | 4 +- steam_trader/ext/__init__.py | 5 ++- steam_trader/ext/_client_async_ext.py | 32 +++++++++++++- steam_trader/ext/_client_ext.py | 32 +++++++++++++- steam_trader/ext/_misc.py | 61 +++++++++++++++++++++++++++ 6 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 steam_trader/ext/_misc.py diff --git a/steam_trader/_client.py b/steam_trader/_client.py index f11dfdb..9ddec95 100644 --- a/steam_trader/_client.py +++ b/steam_trader/_client.py @@ -653,7 +653,7 @@ def set_trade_link(self, trade_link: str) -> None: Raises: SaveFail: Не удалось сохранить ссылку обмена. - WrongTradeLink: Указана ссылка для обмена от другого Steam аккаунта. + WrongTradeLink: Указана ссылка для обмена от другого Steam аккаунта ИЛИ ссылка для обмена уже указана. """ url = self.base_url + 'settradelink/' @@ -675,7 +675,7 @@ def set_trade_link(self, trade_link: str) -> None: case 1: raise SaveFail('Не удалось сохранить ссылку обмена.') except KeyError: - raise WrongTradeLink('Указана ссылка для обмена от другого Steam аккаунта.') + raise WrongTradeLink('Указана ссылка для обмена от другого Steam аккаунта ИЛИ ссылка для обмена уже указана.') @log def remove_trade_link(self) -> None: diff --git a/steam_trader/_client_async.py b/steam_trader/_client_async.py index 7f976e0..37e6352 100644 --- a/steam_trader/_client_async.py +++ b/steam_trader/_client_async.py @@ -655,7 +655,7 @@ async def set_trade_link(self, trade_link: str) -> None: Raises: SaveFail: Не удалось сохранить ссылку обмена. - WrongTradeLink: Указана ссылка для обмена от другого Steam аккаунта. + WrongTradeLink: Указана ссылка для обмена от другого Steam аккаунта ИЛИ ссылка для обмена уже указана. """ url = self.base_url + 'settradelink/' @@ -678,7 +678,7 @@ async def set_trade_link(self, trade_link: str) -> None: case 1: raise SaveFail('Не удалось сохранить ссылку обмена') except KeyError: - raise WrongTradeLink('Указана ссылка для обмена от другого Steam аккаунта.') + raise WrongTradeLink('Указана ссылка для обмена от другого Steam аккаунта ИЛИ ссылка для обмена уже указана.') @log async def remove_trade_link(self) -> None: diff --git a/steam_trader/ext/__init__.py b/steam_trader/ext/__init__.py index 1e1f061..166cdd3 100644 --- a/steam_trader/ext/__init__.py +++ b/steam_trader/ext/__init__.py @@ -3,7 +3,10 @@ from ._client_ext import ExtClient from ._client_async_ext import ExtClientAsync +from ._misc import TradeMode + __all__ = [ 'ExtClient', - 'ExtClientAsync' + 'ExtClientAsync', + 'TradeMode' ] diff --git a/steam_trader/ext/_client_async_ext.py b/steam_trader/ext/_client_async_ext.py index 1a8a43b..358c1dd 100644 --- a/steam_trader/ext/_client_async_ext.py +++ b/steam_trader/ext/_client_async_ext.py @@ -3,6 +3,8 @@ import functools from typing import Optional, Sequence, TypeVar, Callable, Any +from ._misc import TradeMode + from steam_trader.constants import SUPPORTED_APPIDS from steam_trader.exceptions import UnsupportedAppID from steam_trader import ( @@ -41,6 +43,7 @@ class ExtClientAsync(ClientAsync): Новые методы: multi_sell - Аналог multi_buy. В отличие от него, возвращает последовательность из результатов продаж, а не один объект. + set_trade_mode - Позволяет задать режим торговли. Данного метода нет в документации. Raises: BadRequestError: Неправильный запрос. @@ -99,7 +102,7 @@ async def get_inventory( raise UnsupportedAppID(f'Игра с AppID {gameid}, в данный момент не поддерживается.') url = self.base_url + 'getinventory/' - params = {"gameid": gameid, "key": self.api_token} + params = {"gameid": gameid} if status is not None: for i, s in enumerate(status): @@ -216,3 +219,30 @@ async def multi_sell(self, gameid: int, gid: int, price: float, count: int) -> S results = await asyncio.gather(*tasks) return results + + @log + async def set_trade_mode(self, state: int) -> Optional['TradeMode']: + """Задать режим торговли. Данного метода нет в документации. + + Args: + state (:obj:`int`): Режим торговли. + 0 - Торговля отключена. + 1 - Торговля включена. + + Returns: + :class:`steam_trader.ext.TradeMode`: Режим торговли. + + Raises: + ValueError: Недопустимое значение state. + """ + + if state not in range(2): + raise ValueError(f'Недопустимое значение state :: {state}') + + url = self.base_url + 'startstoptrading/' + result = await self._async_client.get( + url, + params={"state": state}, + headers=self.headers + ).json() + return TradeMode.de_json(result, self) diff --git a/steam_trader/ext/_client_ext.py b/steam_trader/ext/_client_ext.py index 70bc4cc..845f702 100644 --- a/steam_trader/ext/_client_ext.py +++ b/steam_trader/ext/_client_ext.py @@ -3,6 +3,8 @@ import functools from typing import Optional, Sequence, TypeVar, Callable, Any +from ._misc import TradeMode + from steam_trader.constants import SUPPORTED_APPIDS from steam_trader.exceptions import UnsupportedAppID from steam_trader import ( @@ -44,6 +46,7 @@ class ExtClient(Client): Новые методы: multi_sell - Аналог multi_buy. В отличие от него, возвращает последовательноасть из результатов продаж, а не один объект. + set_trade_mode - Позволяет задать режим торговли. Данного метода нет в документации. Raises: BadRequestError: Неправильный запрос. @@ -102,7 +105,7 @@ def get_inventory( raise UnsupportedAppID(f'Игра с AppID {gameid}, в данный момент не поддерживается.') url = self.base_url + 'getinventory/' - params = {"gameid": gameid, "key": self.api_token} + params = {"gameid": gameid} if status is not None: for i, s in enumerate(status): @@ -215,3 +218,30 @@ def multi_sell(self, gameid: int, gid: int, price: float, count: int) -> Sequenc count -= 1 return results + + @log + def set_trade_mode(self, state: int) -> Optional['TradeMode']: + """Задать режим торговли. Данного метода нет в документации. + + Args: + state (:obj:`int`): Режим торговли. + 0 - Торговля отключена. + 1 - Торговля включена. + + Returns: + :class:`steam_trader.ext.TradeMode`: Режим торговли. + + Raises: + ValueError: Недопустимое значение state. + """ + + if state not in range(2): + raise ValueError(f'Недопустимое значение state :: {state}') + + url = self.base_url + 'startstoptrading/' + result = (self._httpx_client or httpx).get( + url, + params={"state": state}, + headers=self.headers + ).json() + return TradeMode.de_json(result, self) diff --git a/steam_trader/ext/_misc.py b/steam_trader/ext/_misc.py new file mode 100644 index 0000000..7b95b11 --- /dev/null +++ b/steam_trader/ext/_misc.py @@ -0,0 +1,61 @@ +from dataclasses import dataclass +from collections.abc import Sequence +from typing import TYPE_CHECKING, Optional, Union + +from steam_trader import TraderClientObject +from steam_trader import exceptions + +if TYPE_CHECKING: + from ._client_ext import ExtClient + from ._client_async_ext import ExtClientAsync + +@dataclass +class TradeMode(TraderClientObject): + """Класс, представляющий режим торговли. + + Attributes: + success (:obj:`bool`): Результат запроса. + state (:obj:`bool`): Режим обычной торговли. + p2p (:obj:`bool`): Режим p2p торговли. + client (Union[:class:`steam_trader.ExtClient`, :class:`steam_trader.ExtClientAsync`, :obj:`None`]): + Клиент Steam Trader. + """ + + success: bool + state: bool + p2p: bool + client: Union['ExtClient', 'ExtClientAsync', None] + + @classmethod + def de_json( + cls: dataclass, + data: dict, + client: Union['ExtClient', 'ExtClientAsync', None] = None + ) -> Optional['TradeMode']: + """Десериализация объекта. + + Args: + data (:obj:`dict`): Поля и значения десериализуемого объекта. + client (Union[:class:`steam_trader.ExtClient`, :class:`steam_trader.ExtClientAsync`, :obj:`None`]): + Клиент Steam Trader. + + Returns: + :class:`steam_trader.TradeMode`, optional: Режим торговли. + """ + + if not cls.is_valid_model_data(data): + return + + if not data['success']: + match data['code']: + case 400: + raise exceptions.BadRequestError('Неправильный запрос.') + case 401: + raise exceptions.Unauthorized('Неправильный api-токен.') + case 429: + raise exceptions.TooManyRequests('Вы отправили слишком много запросов.') + + data = super(TradeMode, cls).de_json(data) + + return cls(client=client, **data) +