diff --git a/mipac/actions/users/mute.py b/mipac/actions/users/mute.py index 8cf9080..186045a 100644 --- a/mipac/actions/users/mute.py +++ b/mipac/actions/users/mute.py @@ -1,8 +1,9 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from mipac.abstract.action import AbstractAction +from mipac.errors.base import ParameterError from mipac.http import HTTPClient, Route from mipac.models.mute import MutedUser from mipac.types.mute import IMutedUser @@ -12,10 +13,64 @@ if TYPE_CHECKING: from mipac.client import ClientManager -class MuteActions(AbstractAction): +class ClientMuteActions(AbstractAction): + def __init__(self, user_id: str | None = None, *, session: HTTPClient, client: ClientManager): + self.__user_id: str | None = user_id + self._session: HTTPClient = session + self._client: ClientManager = client + + async def create(self, expires_at: int | None = None, *, user_id: str | None = None) -> bool: + """指定したユーザーをミュートします + + Parameters + ---------- + user_id : str | None + 対象のユーザーID, default=None + expires_at : int | None + ミュートする期間(秒)、無期限でミュートする場合はNoneを指定します + + Returns + ------- + bool + ミュートに成功したかどうか + """ + + if user_id or self.__user_id: + raise ParameterError("Parameter 'user_id' is required.") + + body = {"userId": user_id, "expiresAt": expires_at} + + res: bool = await self._session.request(route=Route("POST", "/api/mute/create"), json=body) + + return res + + async def delete(self, *, user_id: str | None = None) -> bool: + """指定したユーザーのミュートを解除します + + Parameters + ---------- + user_id : str | None + 対象のユーザーID, default=None + + Returns + ------- + bool + ミュート解除に成功したかどうか + """ + + if user_id or self.__user_id: + raise ParameterError("Parameter 'user_id' is required.") + + res: bool = await self._session.request( + route=Route("POST", "/api/mute/delete"), json={"userId": user_id} + ) + + return res + + +class MuteActions(ClientMuteActions): def __init__(self, *, session: HTTPClient, client: ClientManager): - self.__session: HTTPClient = session - self.__client: ClientManager = client + super().__init__(session=session, client=client) async def get_list( self, limit: int = 30, since_id: str | None = None, until_id: str | None = None @@ -30,17 +85,17 @@ class MuteActions(AbstractAction): body = {"limit": limit, "sinceId": since_id, "untilId": until_id} - mutes: list[IMutedUser] = await self.__session.request( + mutes: list[IMutedUser] = await self._session.request( Route("GET", "/api/mute/list"), json=body, auth=True ) - return [MutedUser(raw_mute_user=mute, client=self.__client) for mute in mutes] + return [MutedUser(raw_mute_user=mute, client=self._client) for mute in mutes] async def get_all_list( self, limit: int = 30, since_id: str | None = None, until_id: str | None = None ): """ミュートしている全てのユーザーを取得します - + Parameters ---------- limit : int @@ -49,7 +104,7 @@ class MuteActions(AbstractAction): 指定したIDより後のミュート中のユーザーを取得します, default=None until_id : str | None 指定したIDより前のミュート中のユーザーを取得します, default=None - + Returns ------- AsyncGenerator[MutedUser] @@ -58,14 +113,19 @@ class MuteActions(AbstractAction): body = {"limit": limit, "sinceId": since_id, "untilId": until_id} pagination = Pagination[IMutedUser]( - self.__session, Route("GET", "/api/mute/list"), json=body, auth=True + self._session, Route("GET", "/api/mute/list"), json=body, auth=True ) while pagination.is_final is False: for raw_muted_user in await pagination.next(): - yield MutedUser(raw_mute_user=raw_muted_user, client=self.__client) - - async def create(self, user_id: str, expires_at: int | None = None) -> bool: + yield MutedUser(raw_mute_user=raw_muted_user, client=self._client) + + @override + async def create( + self, + user_id: str, + expires_at: int | None = None, + ) -> bool: """指定したユーザーをミュートします Parameters @@ -80,15 +140,9 @@ class MuteActions(AbstractAction): bool ミュートに成功したかどうか """ + return await super().create(user_id=user_id, expires_at=expires_at) - body = {"userId": user_id, "expiresAt": expires_at} - - res: bool = await self.__session.request( - route=Route("POST", "/api/mute/create"), json=body - ) - - return res - + @override async def delete(self, user_id: str) -> bool: """指定したユーザーのミュートを解除します @@ -102,9 +156,4 @@ class MuteActions(AbstractAction): bool ミュート解除に成功したかどうか """ - - res: bool = await self.__session.request( - route=Route("POST", "/api/mute/delete"), json={"userId": user_id} - ) - - return res + return await super().delete(user_id=user_id) diff --git a/mipac/manager/user.py b/mipac/manager/user.py index d7e57ae..c7ec0e4 100644 --- a/mipac/manager/user.py +++ b/mipac/manager/user.py @@ -7,7 +7,7 @@ from mipac.actions.user import ClientUserActions, UserActions from mipac.http import HTTPClient from mipac.manager.blocking import BlockingManager from mipac.manager.follow import FollowManager -from mipac.manager.users.mute import MuteManager +from mipac.manager.users.mute import ClientMuteManager, MuteManager from mipac.manager.users.list import ( ClientPartialUserListManager, ClientUserListManager, @@ -30,7 +30,9 @@ class ClientUserManager(AbstractManager): user=user, session=session, client=client ) # self.follow: FollowManager = FollowManager(session=session, client=client) TODO: Client版のFollowManagerを作る - # self.mute: MuteManager = MuteManager(session=session, client=client) TODO: Client版のMuteManagerを作る + self.mute: ClientMuteManager = ClientMuteManager( + user_id=user.id, session=session, client=client + ) # self.block = BlockingManager(session=session, client=client) TODO: Client版のBlockingManagerを作る self.list = ClientPartialUserListManager(user_id=user.id, session=session, client=client) diff --git a/mipac/manager/users/mute.py b/mipac/manager/users/mute.py index 5c0c677..cb11baa 100644 --- a/mipac/manager/users/mute.py +++ b/mipac/manager/users/mute.py @@ -1,20 +1,29 @@ - from __future__ import annotations from typing import TYPE_CHECKING from mipac.abstract.manager import AbstractManager from mipac.http import HTTPClient -from mipac.actions.users.mute import MuteActions +from mipac.actions.users.mute import MuteActions, ClientMuteActions if TYPE_CHECKING: from mipac.manager.client import ClientManager +class ClientMuteManager(AbstractManager): + def __init__(self, user_id: str, *, session: HTTPClient, client: ClientManager): + self._action: ClientMuteActions = ClientMuteActions( + user_id=user_id, session=session, client=client + ) + + @property + def action(self) -> ClientMuteActions: + return self._action + + class MuteManager(AbstractManager): def __init__(self, *, session: HTTPClient, client: ClientManager): - self.__session: HTTPClient = session - self.__client: ClientManager = client + self._action: MuteActions = MuteActions(session=session, client=client) @property def action(self) -> MuteActions: - return MuteActions(session=self.__session, client=self.__client) + return self._action