From 6ad63ee3e0fb93ebeb49283c43ecf155b9af81ac Mon Sep 17 00:00:00 2001 From: root Date: Mon, 23 Mar 2026 04:36:47 +0000 Subject: [PATCH] =?UTF-8?q?refactor:=20=D0=B2=D0=B5=D1=80=D0=BD=D1=83?= =?UTF-8?q?=D0=BB=20OtherAPI=20=D0=BA=D0=B0=D0=BA=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OtherAPI остаётся отдельным классом с property accessor: - client.other.get_wants() - client.other.get_kworks_status() - client.other.go_offline() - и т.д. --- .../__pycache__/client.cpython-312.pyc | Bin 54873 -> 57289 bytes src/kwork_api/client.py | 356 ++++++++++-------- 2 files changed, 193 insertions(+), 163 deletions(-) diff --git a/src/kwork_api/__pycache__/client.cpython-312.pyc b/src/kwork_api/__pycache__/client.cpython-312.pyc index aba3e05c8ec598585f540f8b42acdb3a43d5d845..b50ddec74892219d59f32c69a1e0dcac9646e275 100644 GIT binary patch delta 4472 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 Y@Xh;okrcl9U`_b)2o!&dBFM`AALx-O>i_@% delta 3752 zcmZ`+dr(tX8oxKW7s4al5c2}U8^nOTgrIq zwe|7Q@zLr;ciIWHt6+R!5qXprDk9fSYY<)g*xhblv%On(cDro1-E(fz5J=4*zkKI+ zzMJp&edpZooV+_Ae(;7kWLzo@B+%#a@LW@P1hKI` zY=;ifaXxf1V&i?-6vQSNm$HdyW^n^$Ohw})WG`WLZt-b|NfwwyHWlHR`y zlVZ9f6ZtIlW`#m5Lu{%Kn}ygkHXZRARIKcS)CF8|^x2dluwjVRd$E}U8;;l7VYrGxg`p2aKL#0wAq<-_q+&=xFdh6;wt+RVE%j{C(`6^E^x1YV(&bE(JyEMvv)B}LPgh~mE+hHlq<1y4}$}qdOeXG zf$gtvA>V_ln_*-zoJo!b-matbMFbHDRVC4IxBDqbi41^*o{f;!=nsc_vS6U61pF_j z!s&=;2&$07#R)YWx*UuAqTuC=O8EO_4FuYi3R4@3vqzG?qkVl{i^W{oMVfX%Os@jU z>_L^vb-POqWk+szB#y&^I1YwRwk9|sfv!CE&2vzurnqxKA99y14nd4+~ zI7tr2R*}I7tD=6wI2Y7L<@D=Oh#e z;n&xwz<8|`GFx@<;98+aQeZ_WR9{bn$eaM+88%ZD z^O-A6_m96BQ>0ob!!_GCf8FNlWXp9Z^-f05N%S0}_YHr`9X=dZ9aTYe-(tA)tV@D) zC=3quWvE>;r0Hy1{kFQ6Mz*Y_p%sZi>lX%J_Jx%C6y^uV+9u>V@${b z9Fy-W?3$M_4T$>FJnOZoe>uF=uW)anTm8~v^}?cHr7djp#1n&~&6De7aydyZ$K?73 zzvKyi^;WT0U@4>xB*DgkD0lF~17Xs5@8IylfI8*={LL`87+gxRLuqg_22Nt&7=v$I z+$ZpR9}ce!uJy!~4y}VNLy_*7FAiy>ar0sx8B*y#cyi1lhqBno6mybdjwwblQ4AAq zy7eO9-d2z;Lf6UoNdmP`v{wWlJ)?xu%P#rb}enfnygV(23m*9<*;Kbwqfl z(`2qSHq|w^Hr5Iceu@)YgC22pq$u~BH5DwM3f4}^BTla8LKAs^LKQzlP^!Rx6O=6Q z5XA=)GR2X$-?W_!u<9L*j+5y4AT%>;78+N$o_vMOqRy!GWIaj1m2->8%R(6jEwS+N zGYZH!uLVU(5*&RemVP93lB$vjc>kSrp&ILJl#o1H0nd)6dKT&Q4F*0M&GdAUm18Q{ zFct%Q$JWB=Sfutm&YGI5fa?syhn?y7@YPsChtGTTizXJ8t#-T6XTHN_DEE}XyTQ2E z_YgIeslTr2(ey4EEOunBz0Z`|iaKehEa9Fk!CLjcEa{I-DJLoA#e~d2&Q3F>{}DRt z0acM2wQ)_6j5?)3W{P$FxCzf2}-sTj1en&?y z6AoDIM5Q41aJU?fO|URK@pF&(J$EZmH;#fAE=hr!jDzIKRM(|7Rr^#sQWjc1j;o2+|`zBW-XidIX=h1xi-Wp`PG+Qqz7L()WQl!h-zJH zt$Vy@{$b+bGqBjXOMu2BcEKgU=gh@79#{Lqhsgnl!J}+be+c}~ktTB~@=LF)x3rpE zr-))*0KR?*%pRXxi9i?37c|#UZ7UqgY$ub=NwPU68~4+*4@!W)UqhBbrSm3P2|-i% ziij^gm!{NYHH=O@PYw&?ng_Au2IzS3D|Gw9^I_9EvIY#(adI71S@}1V3i=eRuGEnx z5~3e!NIh_%go=mzI$lFFCVX(4-oxO;Fpc36hQ}B_#PBhOzhL+T!>S)(YqGSPzQNoqhHr(7>37&9&{kM*SvAGr2@KfH zoFTR+KH5)q@Red2z1*s>*4whI+s;MJ5NOCJ_|t_p%2wSSZ`;rnGDDytFAt$tlQxB| zzB|jdtqVEgF(2bk=U5Z0W}CsuR4NkjZO9=?br(;t4z+R1DUSWesi{LOG;if?phrO5l|Q8uD6yTJK#J mG~`uq{ZG%+{}74j6xi_idolzze6W=<%gB_k35>#DgZ~3YrPx^j diff --git a/src/kwork_api/client.py b/src/kwork_api/client.py index 2154e8e..446a0fe 100644 --- a/src/kwork_api/client.py +++ b/src/kwork_api/client.py @@ -907,190 +907,215 @@ class KworkClient: data = await self.client._request("POST", "/blockedDialogList") return [Dialog.model_validate(d) for d in data.get("dialogs", [])] - # ========== User Settings & Preferences ========== + # ========== Other Endpoints ========== - async def get_wants(self) -> dict[str, Any]: + class OtherAPI: """ - Получить пользовательские предпочтения (wants). + Прочее API. - Wants — это настройки интересов пользователя: - - Предпочитаемые категории - - Ключевые слова для мониторинга - - Фильтры для поиска - - Returns: - Словарь с настройками предпочтений. + Вспомогательные эндпоинты которые не вошли в другие категории: + - Пользовательские настройки и предпочтения (wants) + - Статусы кворков и заказов + - Персональные предложения (offers) + - Настройки профиля + - Статус онлайн/оффлайн Example: - wants = await client.get_wants() - print(wants) + # Пользовательские предпочтения + wants = await client.other.get_wants() + + # Статус кворков + status = await client.other.get_kworks_status() + + # Установить статус оффлайн + await client.other.go_offline() """ - return await self._request("POST", "/myWants") - - async def get_wants_status(self) -> dict[str, Any]: - """ - Получить статус предпочтений. - Returns: - Статус wants с метаданными. - """ - return await self._request("POST", "/wantsStatusList") - - async def get_kworks_status(self) -> dict[str, Any]: - """ - Получить статусы кворков пользователя. + def __init__(self, client: "KworkClient"): + self.client = client - Возвращает информацию о статусах всех кворков - текущего пользователя (активен, на модерации, и т.д.). + async def get_wants(self) -> dict[str, Any]: + """ + Получить пользовательские предпочтения (wants). + + Wants — это настройки интересов пользователя: + - Предпочитаемые категории + - Ключевые слова для мониторинга + - Фильтры для поиска + + Returns: + Словарь с настройками предпочтений. + + Example: + wants = await client.other.get_wants() + print(wants) + """ + return await self.client._request("POST", "/myWants") - Returns: - Словарь со статусами кворков. + async def get_wants_status(self) -> dict[str, Any]: + """ + Получить статус предпочтений. + + Returns: + Статус wants с метаданными. + """ + return await self.client._request("POST", "/wantsStatusList") - Example: - status = await client.get_kworks_status() - print(status) - """ - return await self._request("POST", "/kworksStatusList") - - async def get_offers(self) -> dict[str, Any]: - """ - Получить персональные предложения. + async def get_kworks_status(self) -> dict[str, Any]: + """ + Получить статусы кворков пользователя. + + Возвращает информацию о статусах всех кворков + текущего пользователя (активен, на модерации, и т.д.). + + Returns: + Словарь со статусами кворков. + + Example: + status = await client.other.get_kworks_status() + print(status) + """ + return await self.client._request("POST", "/kworksStatusList") - Returns: - Список персональных предложений от Kwork. - """ - return await self._request("POST", "/offers") - - async def get_exchange_info(self) -> dict[str, Any]: - """ - Получить информацию об обмене валюты. + async def get_offers(self) -> dict[str, Any]: + """ + Получить персональные предложения. + + Returns: + Список персональных предложений от Kwork. + """ + return await self.client._request("POST", "/offers") - Returns: - Информация о курсах валют и обмене. - """ - return await self._request("POST", "/exchangeInfo") - - async def get_channel(self) -> dict[str, Any]: - """ - Получить информацию о канале пользователя. + async def get_exchange_info(self) -> dict[str, Any]: + """ + Получить информацию об обмене валюты. + + Returns: + Информация о курсах валют и обмене. + """ + return await self.client._request("POST", "/exchangeInfo") - Returns: - Данные канала (если есть). - """ - return await self._request("POST", "/getChannel") - - async def get_in_app_notification(self) -> dict[str, Any]: - """ - Получить внутриприложенное уведомление. + async def get_channel(self) -> dict[str, Any]: + """ + Получить информацию о канале пользователя. + + Returns: + Данные канала (если есть). + """ + return await self.client._request("POST", "/getChannel") - Returns: - Данные in-app уведомления. - """ - return await self._request("POST", "/getInAppNotification") - - async def get_security_user_data(self) -> dict[str, Any]: - """ - Получить данные безопасности пользователя. + async def get_in_app_notification(self) -> dict[str, Any]: + """ + Получить внутриприложенное уведомление. + + Returns: + Данные in-app уведомления. + """ + return await self.client._request("POST", "/getInAppNotification") - Returns: - Информация о безопасности аккаунта. - """ - return await self._request("POST", "/getSecurityUserData") - - async def is_dialog_allow(self, user_id: int) -> bool: - """ - Проверить возможность начала диалога с пользователем. + async def get_security_user_data(self) -> dict[str, Any]: + """ + Получить данные безопасности пользователя. + + Returns: + Информация о безопасности аккаунта. + """ + return await self.client._request("POST", "/getSecurityUserData") - Args: - user_id: ID пользователя для проверки. + async def is_dialog_allow(self, user_id: int) -> bool: + """ + Проверить возможность начала диалога с пользователем. + + Args: + user_id: ID пользователя для проверки. + + Returns: + True если диалог разрешён, False иначе. + + Example: + allowed = await client.other.is_dialog_allow(12345) + if allowed: + print("Можно написать сообщение") + """ + data = await self.client._request( + "POST", + "/isDialogAllow", + json={"user_id": user_id}, + ) + return data.get("allowed", False) - Returns: - True если диалог разрешён, False иначе. + async def get_viewed_kworks(self) -> list[Kwork]: + """ + Получить просмотренные кворки. + + Возвращает список кворков, которые пользователь + просматривал ранее. + + Returns: + Список просмотренных кворков. + + Example: + viewed = await client.other.get_viewed_kworks() + print(f"Просмотрено: {len(viewed)} кворков") + """ + data = await self.client._request("POST", "/viewedCatalogKworks") + return [Kwork.model_validate(k) for k in data.get("kworks", [])] - Example: - allowed = await client.is_dialog_allow(12345) - if allowed: - print("Можно написать сообщение") - """ - data = await self._request( - "POST", - "/isDialogAllow", - json={"user_id": user_id}, - ) - return data.get("allowed", False) - - async def get_viewed_kworks(self) -> list[Kwork]: - """ - Получить просмотренные кворки. + async def get_favorite_categories(self) -> list[int]: + """ + Получить ID избранных категорий. + + Returns: + Список ID категорий, добавленных в избранное. + + Example: + cats = await client.other.get_favorite_categories() + print(f"Избранные категории: {cats}") + """ + data = await self.client._request("POST", "/favoriteCategories") + return data.get("categories", []) - Возвращает список кворков, которые пользователь - просматривал ранее. + async def update_settings(self, settings: dict[str, Any]) -> dict[str, Any]: + """ + Обновить настройки пользователя. + + Args: + settings: Словарь с настройками для обновления. + Структура зависит от конкретных настроек. + + Returns: + Ответ API с подтверждением обновления. + + Example: + await client.other.update_settings({ + "email_notifications": True, + "language": "ru" + }) + """ + return await self.client._request("POST", "/updateSettings", json=settings) - Returns: - Список просмотренных кворков. + async def go_offline(self) -> dict[str, Any]: + """ + Установить статус пользователя "оффлайн". + + Скрывает онлайн-статус от других пользователей. + + Returns: + Подтверждение изменения статуса. + + Example: + await client.other.go_offline() + """ + return await self.client._request("POST", "/offline") - Example: - viewed = await client.get_viewed_kworks() - print(f"Просмотрено: {len(viewed)} кворков") - """ - data = await self._request("POST", "/viewedCatalogKworks") - return [Kwork.model_validate(k) for k in data.get("kworks", [])] - - async def get_favorite_categories(self) -> list[int]: - """ - Получить ID избранных категорий. - - Returns: - Список ID категорий, добавленных в избранное. - - Example: - cats = await client.get_favorite_categories() - print(f"Избранные категории: {cats}") - """ - data = await self._request("POST", "/favoriteCategories") - return data.get("categories", []) - - async def update_settings(self, settings: dict[str, Any]) -> dict[str, Any]: - """ - Обновить настройки пользователя. - - Args: - settings: Словарь с настройками для обновления. - Структура зависит от конкретных настроек. - - Returns: - Ответ API с подтверждением обновления. - - Example: - await client.update_settings({ - "email_notifications": True, - "language": "ru" - }) - """ - return await self._request("POST", "/updateSettings", json=settings) - - async def go_offline(self) -> dict[str, Any]: - """ - Установить статус пользователя "оффлайн". - - Скрывает онлайн-статус от других пользователей. - - Returns: - Подтверждение изменения статуса. - - Example: - await client.go_offline() - """ - return await self._request("POST", "/offline") - - async def get_actor(self) -> dict[str, Any]: - """ - Получить информацию об актёре (текущем пользователе). - - Returns: - Данные актёра/пользователя. - """ - return await self._request("POST", "/actor") + async def get_actor(self) -> dict[str, Any]: + """ + Получить информацию об актёре (текущем пользователе). + + Returns: + Данные актёра/пользователя. + """ + return await self.client._request("POST", "/actor") # ========== API Property Accessors ========== @@ -1118,3 +1143,8 @@ class KworkClient: def notifications(self) -> NotificationsAPI: """API уведомлений.""" return self.NotificationsAPI(self) + + @property + def other(self) -> OtherAPI: + """Прочее API.""" + return self.OtherAPI(self)