diff --git a/mipac/actions/admins/announcement.py b/mipac/actions/admins/announcement.py index b6b6f9e..929ffe1 100644 --- a/mipac/actions/admins/announcement.py +++ b/mipac/actions/admins/announcement.py @@ -5,8 +5,8 @@ from typing import TYPE_CHECKING, AsyncGenerator from mipac.abstract.action import AbstractAction from mipac.errors.base import ParameterError from mipac.http import HTTPClient, Route -from mipac.models.announcement import Announcement, AnnouncementSystem -from mipac.types.announcement import IAnnouncement, IAnnouncementSystem +from mipac.models.announcement import Announcement, AnnouncementDetailed +from mipac.types.announcement import IAnnouncement, IAnnouncementDetailed from mipac.utils.pagination import Pagination if TYPE_CHECKING: @@ -85,7 +85,7 @@ class AdminAnnouncementActions(AdminAnnouncementClientActions): since_id: str | None = None, until_id: str | None = None, get_all: bool = False, - ) -> AsyncGenerator[AnnouncementSystem, None]: + ) -> AsyncGenerator[AnnouncementDetailed, None]: if limit > 100: raise ParameterError("limitは100以下である必要があります") if get_all: @@ -97,14 +97,14 @@ class AdminAnnouncementActions(AdminAnnouncementClientActions): "untilId": until_id, } - pagination = Pagination[IAnnouncementSystem]( + pagination = Pagination[IAnnouncementDetailed]( self.__session, Route("POST", "/api/admin/announcements/list"), json=body ) while True: res_annonuncement_systems = await pagination.next() for res_announcement_system in res_annonuncement_systems: - yield AnnouncementSystem(res_announcement_system, client=self.__client) + yield AnnouncementDetailed(res_announcement_system, client=self.__client) if get_all is False or pagination.is_final: break diff --git a/mipac/actions/admins/user.py b/mipac/actions/admins/user.py index eb9e970..5d38202 100644 --- a/mipac/actions/admins/user.py +++ b/mipac/actions/admins/user.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from mipac.abstract.action import AbstractAction from mipac.http import HTTPClient, Route -from mipac.models.user import UserDetailed +from mipac.models.user import MeDetailed, UserDetailedNotMe, packed_user if TYPE_CHECKING: from mipac.manager.client import ClientManager @@ -41,7 +41,7 @@ class AdminUserActions(AbstractAction): ) return bool(res) - async def show_user(self, user_id: str | None = None) -> UserDetailed: + async def show_user(self, user_id: str | None = None) -> UserDetailedNotMe | MeDetailed: """ Shows the user with the specified user ID. @@ -52,7 +52,7 @@ class AdminUserActions(AbstractAction): Returns ------- - UserDetailed + UserDetailedNotMe | MeDetailed """ user_id = user_id or self.__user_id @@ -63,7 +63,7 @@ class AdminUserActions(AbstractAction): auth=True, lower=True, ) - return UserDetailed(res, client=self.__client) + return packed_user(res, client=self.__client) async def suspend(self, user_id: str | None = None) -> bool: """ diff --git a/mipac/actions/blocking.py b/mipac/actions/blocking.py index 49a701b..ff49a7b 100644 --- a/mipac/actions/blocking.py +++ b/mipac/actions/blocking.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, AsyncGenerator from mipac.abstract.action import AbstractAction from mipac.http import HTTPClient, Route -from mipac.models.user import BlockingUser, UserDetailed +from mipac.models.user import BlockingUser, MeDetailed, UserDetailedNotMe, packed_user from mipac.types.user import IBlockingUser, IUserDetailed from mipac.utils.pagination import Pagination @@ -18,19 +18,19 @@ class BlockingActions(AbstractAction): self.__session: HTTPClient = session self.__client: ClientManager = client - async def add(self, user_id: str | None = None) -> UserDetailed: + async def add(self, user_id: str | None = None) -> UserDetailedNotMe | MeDetailed: user_id = self.__user_id or user_id res: IUserDetailed = await self.__session.request( Route("POST", "/api/blocking/create"), auth=True, json={"userId": user_id}, lower=True ) - return UserDetailed(res, client=self.__client) + return packed_user(res, client=self.__client) - async def remove(self, user_id: str | None = None) -> UserDetailed: + async def remove(self, user_id: str | None = None) -> UserDetailedNotMe | MeDetailed: user_id = self.__user_id or user_id res: IUserDetailed = await self.__session.request( Route("POST", "/api/blocking/delete"), auth=True, json={"userId": user_id}, lower=True ) - return UserDetailed(res, client=self.__client) + return packed_user(res, client=self.__client) async def get_list( self, diff --git a/mipac/actions/federation.py b/mipac/actions/federation.py index f14c5f4..53d5d9b 100644 --- a/mipac/actions/federation.py +++ b/mipac/actions/federation.py @@ -6,7 +6,7 @@ from mipac.abstract.action import AbstractAction from mipac.errors.base import ParameterError from mipac.http import HTTPClient, Route from mipac.models.instance import FederationInstance -from mipac.models.user import UserDetailed +from mipac.models.user import UserDetailedNotMe, MeDetailed, packed_user from mipac.types.follow import IFederationFollower, IFederationFollowing from mipac.types.instance import IFederationInstance, IFederationInstanceStat from mipac.types.user import IUserDetailed @@ -155,7 +155,7 @@ class FederationActions(AbstractAction): until_id: str | None = None, limit: int = 10, get_all: bool = False, - ) -> AsyncGenerator[UserDetailed, None]: + ) -> AsyncGenerator[UserDetailedNotMe | MeDetailed, None]: if limit > 100: raise ParameterError("limitは100以下である必要があります") @@ -171,7 +171,7 @@ class FederationActions(AbstractAction): while True: res_users: list[IUserDetailed] = await pagination.next() for user in res_users: - yield UserDetailed(user, client=self.__client) + yield packed_user(user, client=self.__client) if get_all is False or pagination.is_final: break diff --git a/mipac/actions/user.py b/mipac/actions/user.py index d7cafc1..1c8172a 100644 --- a/mipac/actions/user.py +++ b/mipac/actions/user.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, AsyncGenerator, Literal, Optional, TypeVar, Union, overload +from typing import TYPE_CHECKING, AsyncGenerator, Literal, Optional, overload from mipac.config import config from mipac.errors.base import NotExistRequiredData, ParameterError @@ -11,19 +11,15 @@ from mipac.models.note import Note from mipac.models.user import ( Achievement, MeDetailed, - MeDetailedModerator, - UserDetailed, - UserDetailedModels, - UserModels, - create_user_model, + UserDetailedNotMe, + packed_user, ) from mipac.types.clip import IClip from mipac.types.note import INote from mipac.types.user import ( - IMeDetailed, - IMeDetailedModerator, + IMeDetailedSchema, IUser, - is_me_detailed_moderator, + is_partial_user, ) from mipac.utils.cache import cache from mipac.utils.format import remove_dict_empty @@ -35,8 +31,6 @@ if TYPE_CHECKING: __all__ = ["UserActions"] -T = TypeVar("T", bound=Union[PartialUser, UserDetailed]) - class UserActions: def __init__( @@ -49,21 +43,17 @@ class UserActions: self.__user: Optional[PartialUser] = user self.__client: ClientManager = client - async def get_me(self) -> MeDetailed | MeDetailedModerator: # TODO: トークンが無い場合は例外返すようにする + async def get_me(self) -> MeDetailed: # TODO: トークンが無い場合は例外返すようにする """ ログインしているユーザーの情報を取得します """ - res: IMeDetailedModerator | IMeDetailed = await self.__session.request( + res: IMeDetailedSchema = await self.__session.request( Route("POST", "/api/i"), auth=True, lower=True, ) - return ( - MeDetailedModerator(res, client=self.__client) - if is_me_detailed_moderator(res, config.account_id) - else MeDetailed(res, client=self.__client) - ) + return MeDetailed(res, client=self.__client) def get_profile_link( self, @@ -90,7 +80,7 @@ class UserActions: username: str | None = None, host: str | None = None, **kwargs, - ) -> UserDetailedModels: + ) -> UserDetailedNotMe | MeDetailed: """ Retrieve user information from the user ID using the cache. If there is no cache, `fetch` is automatically used. @@ -114,7 +104,7 @@ class UserActions: data: IUser = await self.__session.request( Route("POST", "/api/users/show"), json=field, auth=True, lower=True ) - return create_user_model(data, client=self.__client, use_partial_user=False) + return packed_user(data, client=self.__client) async def fetch( self, @@ -122,7 +112,7 @@ class UserActions: user_ids: list[str] | None = None, username: str | None = None, host: str | None = None, - ) -> UserDetailedModels: + ) -> UserDetailedNotMe | MeDetailed: """ Retrieve the latest user information using the target user ID or username. If you do not need the latest information, you should basically use the `get` method. @@ -160,7 +150,9 @@ class UserActions: exclude_nsfw: bool = False, *, get_all: bool = False, - ) -> AsyncGenerator[Note, None]: # TODO: since_dataなどを用いたページネーションを今後できるようにする + ) -> AsyncGenerator[ + Note, None + ]: # TODO: since_dataなどを用いたページネーションを今後できるようにする if check_multi_arg(user_id, self.__user) is False: raise ParameterError("missing required argument: user_id", user_id, self.__user) @@ -239,7 +231,7 @@ class UserActions: detail: Literal[True] = True, *, get_all: bool = False, - ) -> AsyncGenerator[UserDetailedModels, None]: + ) -> AsyncGenerator[UserDetailedNotMe | MeDetailed, None]: ... async def search( @@ -251,7 +243,7 @@ class UserActions: detail: Literal[True, False] = True, *, get_all: bool = False, - ) -> AsyncGenerator[UserModels, None]: + ) -> AsyncGenerator[UserDetailedNotMe | MeDetailed | PartialUser, None]: """ Search users by keyword. @@ -292,7 +284,11 @@ class UserActions: while True: users: list[IUser] = await pagination.next() for user in users: - yield create_user_model(user, client=self.__client) + yield ( + packed_user(user, client=self.__client) + if is_partial_user(user) is False + else PartialUser(user, client=self.__client) + ) if get_all is False or pagination.is_final: break @@ -302,7 +298,7 @@ class UserActions: host: str, limit: int = 100, detail: bool = True, - ) -> list[UserDetailed | PartialUser]: # TODO: 続き + ) -> list[UserDetailedNotMe | MeDetailed | PartialUser]: # TODO: 続き """ Search users by username and host. @@ -319,7 +315,7 @@ class UserActions: Returns ------- - list[UserDetailed | PartialUser] + list[UserDetailedNotMe | MeDetailed | PartialUser] A list of users. """ @@ -336,7 +332,7 @@ class UserActions: json=body, ) return [ - UserDetailed(user, client=self.__client) + packed_user(user, client=self.__client) if detail else PartialUser(user, client=self.__client) for user in res diff --git a/mipac/http.py b/mipac/http.py index e302fca..3a73021 100644 --- a/mipac/http.py +++ b/mipac/http.py @@ -12,7 +12,7 @@ from mipac import __version__ from mipac.config import config from mipac.errors.base import APIError from mipac.types.endpoints import ENDPOINTS -from mipac.types.user import IMeDetailed +from mipac.types.user import IMeDetailedSchema from mipac.utils.format import remove_dict_empty, upper_to_lower from mipac.utils.util import COLORS, MISSING, _from_json @@ -118,7 +118,7 @@ REQUEST:{COLORS.reset} async def close_session(self) -> None: await self._session.close() - async def login(self) -> IMeDetailed | None: + async def login(self) -> IMeDetailedSchema | None: match_domain = re.search(r"https?:\/\/([^\/]+)", self._url) match_protocol = re.search(r"^(http|https)", self._url) if match_domain is None or match_protocol is None: @@ -130,6 +130,6 @@ REQUEST:{COLORS.reset} ) self._session = aiohttp.ClientSession(ws_response_class=MisskeyClientWebSocketResponse) if self._token: - data: IMeDetailed = await self.request(Route("POST", "/api/i"), auth=True) + data: IMeDetailedSchema = await self.request(Route("POST", "/api/i"), auth=True) config.from_dict(account_id=data["id"]) return data diff --git a/mipac/manager/client.py b/mipac/manager/client.py index eb6ecdc..c0b4b85 100644 --- a/mipac/manager/client.py +++ b/mipac/manager/client.py @@ -22,7 +22,7 @@ from mipac.manager.username import UsernameManager if TYPE_CHECKING: from mipac.config import Config from mipac.models.lite.user import PartialUser - from mipac.models.user import UserDetailed + from mipac.models.user import MeDetailed __all__ = ("ClientManager",) @@ -80,5 +80,5 @@ class ClientManager: def _create_client_invite_manager(self, invite_id: str) -> ClientInviteManager: return ClientInviteManager(invite_id=invite_id, session=self.__session, client=self) - async def get_me(self) -> UserDetailed: + async def get_me(self) -> MeDetailed: return await self.user.action.get_me() diff --git a/mipac/models/admin.py b/mipac/models/admin.py index 5456932..eecaab6 100644 --- a/mipac/models/admin.py +++ b/mipac/models/admin.py @@ -4,7 +4,7 @@ from datetime import datetime from typing import TYPE_CHECKING from mipac.abstract.model import AbstractModel -from mipac.models.user import UserDetailed +from mipac.models.user import UserDetailedNotMe, MeDetailed, packed_user from mipac.types.admin import ( IIndexStat, IModerationLog, @@ -91,8 +91,8 @@ class ModerationLog(AbstractModel): return self.__moderation_log["user_id"] @property - def user(self) -> UserDetailed: - return UserDetailed(self.__moderation_log["user"], client=self.__client) + def user(self) -> UserDetailedNotMe | MeDetailed: + return packed_user(self.__moderation_log["user"], client=self.__client) def __eq__(self, __value: object) -> bool: return isinstance(__value, ModerationLog) and self.id == __value.id diff --git a/mipac/models/mute.py b/mipac/models/mute.py index ad1229d..628c95f 100644 --- a/mipac/models/mute.py +++ b/mipac/models/mute.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from mipac.abstract.model import AbstractModel -from mipac.models.user import UserDetailed +from mipac.models.user import UserDetailedNotMe, MeDetailed, packed_user from mipac.types.mute import IMuteUser if TYPE_CHECKING: @@ -28,8 +28,8 @@ class MuteUser(AbstractModel): return self.__data["mutee_id"] @property - def mutee(self) -> UserDetailed: - return UserDetailed(self.__data["mutee"], client=self.__client) + def mutee(self) -> UserDetailedNotMe | MeDetailed: + return packed_user(self.__data["mutee"], client=self.__client) def __eq__(self, __value: MuteUser) -> bool: return isinstance(__value, IMuteUser) and self.id == __value.id diff --git a/mipac/models/roles.py b/mipac/models/roles.py index 85f97b8..3a07cff 100644 --- a/mipac/models/roles.py +++ b/mipac/models/roles.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING from mipac.abstract.model import AbstractModel from mipac.models.lite.role import PartialRole -from mipac.models.user import MeDetailed, UserDetailed +from mipac.models.user import MeDetailed, UserDetailedNotMe, MeDetailed, packed_user from mipac.types.roles import IMeRole, IRole, IRolePolicies, IRolePolicieValue, IRoleUser from mipac.utils.format import str_to_datetime @@ -24,8 +24,8 @@ class RoleUser(AbstractModel): return self.__role_user["id"] @property - def user(self) -> UserDetailed: - return UserDetailed(self.__role_user["user"], client=self.__client) + def user(self) -> UserDetailedNotMe | MeDetailed: + return packed_user(self.__role_user["user"], client=self.__client) @property def expires_at(self) -> datetime | None: