chore: 新しいUser周りのモデルを使用するように変更

pull/110/head
yupix 10 months ago
parent dc3978bc98
commit ee82e4f6f2
No known key found for this signature in database
GPG Key ID: 2FF705F5C56D9C06

@ -5,8 +5,8 @@ from typing import TYPE_CHECKING, AsyncGenerator
from mipac.abstract.action import AbstractAction from mipac.abstract.action import AbstractAction
from mipac.errors.base import ParameterError from mipac.errors.base import ParameterError
from mipac.http import HTTPClient, Route from mipac.http import HTTPClient, Route
from mipac.models.announcement import Announcement, AnnouncementSystem from mipac.models.announcement import Announcement, AnnouncementDetailed
from mipac.types.announcement import IAnnouncement, IAnnouncementSystem from mipac.types.announcement import IAnnouncement, IAnnouncementDetailed
from mipac.utils.pagination import Pagination from mipac.utils.pagination import Pagination
if TYPE_CHECKING: if TYPE_CHECKING:
@ -85,7 +85,7 @@ class AdminAnnouncementActions(AdminAnnouncementClientActions):
since_id: str | None = None, since_id: str | None = None,
until_id: str | None = None, until_id: str | None = None,
get_all: bool = False, get_all: bool = False,
) -> AsyncGenerator[AnnouncementSystem, None]: ) -> AsyncGenerator[AnnouncementDetailed, None]:
if limit > 100: if limit > 100:
raise ParameterError("limitは100以下である必要があります") raise ParameterError("limitは100以下である必要があります")
if get_all: if get_all:
@ -97,14 +97,14 @@ class AdminAnnouncementActions(AdminAnnouncementClientActions):
"untilId": until_id, "untilId": until_id,
} }
pagination = Pagination[IAnnouncementSystem]( pagination = Pagination[IAnnouncementDetailed](
self.__session, Route("POST", "/api/admin/announcements/list"), json=body self.__session, Route("POST", "/api/admin/announcements/list"), json=body
) )
while True: while True:
res_annonuncement_systems = await pagination.next() res_annonuncement_systems = await pagination.next()
for res_announcement_system in res_annonuncement_systems: 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: if get_all is False or pagination.is_final:
break break

@ -4,7 +4,7 @@ from typing import TYPE_CHECKING
from mipac.abstract.action import AbstractAction from mipac.abstract.action import AbstractAction
from mipac.http import HTTPClient, Route from mipac.http import HTTPClient, Route
from mipac.models.user import UserDetailed from mipac.models.user import MeDetailed, UserDetailedNotMe, packed_user
if TYPE_CHECKING: if TYPE_CHECKING:
from mipac.manager.client import ClientManager from mipac.manager.client import ClientManager
@ -41,7 +41,7 @@ class AdminUserActions(AbstractAction):
) )
return bool(res) 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. Shows the user with the specified user ID.
@ -52,7 +52,7 @@ class AdminUserActions(AbstractAction):
Returns Returns
------- -------
UserDetailed UserDetailedNotMe | MeDetailed
""" """
user_id = user_id or self.__user_id user_id = user_id or self.__user_id
@ -63,7 +63,7 @@ class AdminUserActions(AbstractAction):
auth=True, auth=True,
lower=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: async def suspend(self, user_id: str | None = None) -> bool:
""" """

@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, AsyncGenerator
from mipac.abstract.action import AbstractAction from mipac.abstract.action import AbstractAction
from mipac.http import HTTPClient, Route 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.types.user import IBlockingUser, IUserDetailed
from mipac.utils.pagination import Pagination from mipac.utils.pagination import Pagination
@ -18,19 +18,19 @@ class BlockingActions(AbstractAction):
self.__session: HTTPClient = session self.__session: HTTPClient = session
self.__client: ClientManager = client 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 user_id = self.__user_id or user_id
res: IUserDetailed = await self.__session.request( res: IUserDetailed = await self.__session.request(
Route("POST", "/api/blocking/create"), auth=True, json={"userId": user_id}, lower=True 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 user_id = self.__user_id or user_id
res: IUserDetailed = await self.__session.request( res: IUserDetailed = await self.__session.request(
Route("POST", "/api/blocking/delete"), auth=True, json={"userId": user_id}, lower=True 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( async def get_list(
self, self,

@ -6,7 +6,7 @@ from mipac.abstract.action import AbstractAction
from mipac.errors.base import ParameterError from mipac.errors.base import ParameterError
from mipac.http import HTTPClient, Route from mipac.http import HTTPClient, Route
from mipac.models.instance import FederationInstance 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.follow import IFederationFollower, IFederationFollowing
from mipac.types.instance import IFederationInstance, IFederationInstanceStat from mipac.types.instance import IFederationInstance, IFederationInstanceStat
from mipac.types.user import IUserDetailed from mipac.types.user import IUserDetailed
@ -155,7 +155,7 @@ class FederationActions(AbstractAction):
until_id: str | None = None, until_id: str | None = None,
limit: int = 10, limit: int = 10,
get_all: bool = False, get_all: bool = False,
) -> AsyncGenerator[UserDetailed, None]: ) -> AsyncGenerator[UserDetailedNotMe | MeDetailed, None]:
if limit > 100: if limit > 100:
raise ParameterError("limitは100以下である必要があります") raise ParameterError("limitは100以下である必要があります")
@ -171,7 +171,7 @@ class FederationActions(AbstractAction):
while True: while True:
res_users: list[IUserDetailed] = await pagination.next() res_users: list[IUserDetailed] = await pagination.next()
for user in res_users: 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: if get_all is False or pagination.is_final:
break break

@ -1,6 +1,6 @@
from __future__ import annotations 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.config import config
from mipac.errors.base import NotExistRequiredData, ParameterError from mipac.errors.base import NotExistRequiredData, ParameterError
@ -11,19 +11,15 @@ from mipac.models.note import Note
from mipac.models.user import ( from mipac.models.user import (
Achievement, Achievement,
MeDetailed, MeDetailed,
MeDetailedModerator, UserDetailedNotMe,
UserDetailed, packed_user,
UserDetailedModels,
UserModels,
create_user_model,
) )
from mipac.types.clip import IClip from mipac.types.clip import IClip
from mipac.types.note import INote from mipac.types.note import INote
from mipac.types.user import ( from mipac.types.user import (
IMeDetailed, IMeDetailedSchema,
IMeDetailedModerator,
IUser, IUser,
is_me_detailed_moderator, is_partial_user,
) )
from mipac.utils.cache import cache from mipac.utils.cache import cache
from mipac.utils.format import remove_dict_empty from mipac.utils.format import remove_dict_empty
@ -35,8 +31,6 @@ if TYPE_CHECKING:
__all__ = ["UserActions"] __all__ = ["UserActions"]
T = TypeVar("T", bound=Union[PartialUser, UserDetailed])
class UserActions: class UserActions:
def __init__( def __init__(
@ -49,21 +43,17 @@ class UserActions:
self.__user: Optional[PartialUser] = user self.__user: Optional[PartialUser] = user
self.__client: ClientManager = client 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"), Route("POST", "/api/i"),
auth=True, auth=True,
lower=True, lower=True,
) )
return ( return MeDetailed(res, client=self.__client)
MeDetailedModerator(res, client=self.__client)
if is_me_detailed_moderator(res, config.account_id)
else MeDetailed(res, client=self.__client)
)
def get_profile_link( def get_profile_link(
self, self,
@ -90,7 +80,7 @@ class UserActions:
username: str | None = None, username: str | None = None,
host: str | None = None, host: str | None = None,
**kwargs, **kwargs,
) -> UserDetailedModels: ) -> UserDetailedNotMe | MeDetailed:
""" """
Retrieve user information from the user ID using the cache. Retrieve user information from the user ID using the cache.
If there is no cache, `fetch` is automatically used. If there is no cache, `fetch` is automatically used.
@ -114,7 +104,7 @@ class UserActions:
data: IUser = await self.__session.request( data: IUser = await self.__session.request(
Route("POST", "/api/users/show"), json=field, auth=True, lower=True 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( async def fetch(
self, self,
@ -122,7 +112,7 @@ class UserActions:
user_ids: list[str] | None = None, user_ids: list[str] | None = None,
username: str | None = None, username: str | None = None,
host: str | None = None, host: str | None = None,
) -> UserDetailedModels: ) -> UserDetailedNotMe | MeDetailed:
""" """
Retrieve the latest user information using the target user ID or username. 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. 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, exclude_nsfw: bool = False,
*, *,
get_all: 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: if check_multi_arg(user_id, self.__user) is False:
raise ParameterError("missing required argument: user_id", user_id, self.__user) raise ParameterError("missing required argument: user_id", user_id, self.__user)
@ -239,7 +231,7 @@ class UserActions:
detail: Literal[True] = True, detail: Literal[True] = True,
*, *,
get_all: bool = False, get_all: bool = False,
) -> AsyncGenerator[UserDetailedModels, None]: ) -> AsyncGenerator[UserDetailedNotMe | MeDetailed, None]:
... ...
async def search( async def search(
@ -251,7 +243,7 @@ class UserActions:
detail: Literal[True, False] = True, detail: Literal[True, False] = True,
*, *,
get_all: bool = False, get_all: bool = False,
) -> AsyncGenerator[UserModels, None]: ) -> AsyncGenerator[UserDetailedNotMe | MeDetailed | PartialUser, None]:
""" """
Search users by keyword. Search users by keyword.
@ -292,7 +284,11 @@ class UserActions:
while True: while True:
users: list[IUser] = await pagination.next() users: list[IUser] = await pagination.next()
for user in users: 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: if get_all is False or pagination.is_final:
break break
@ -302,7 +298,7 @@ class UserActions:
host: str, host: str,
limit: int = 100, limit: int = 100,
detail: bool = True, detail: bool = True,
) -> list[UserDetailed | PartialUser]: # TODO: 続き ) -> list[UserDetailedNotMe | MeDetailed | PartialUser]: # TODO: 続き
""" """
Search users by username and host. Search users by username and host.
@ -319,7 +315,7 @@ class UserActions:
Returns Returns
------- -------
list[UserDetailed | PartialUser] list[UserDetailedNotMe | MeDetailed | PartialUser]
A list of users. A list of users.
""" """
@ -336,7 +332,7 @@ class UserActions:
json=body, json=body,
) )
return [ return [
UserDetailed(user, client=self.__client) packed_user(user, client=self.__client)
if detail if detail
else PartialUser(user, client=self.__client) else PartialUser(user, client=self.__client)
for user in res for user in res

@ -12,7 +12,7 @@ from mipac import __version__
from mipac.config import config from mipac.config import config
from mipac.errors.base import APIError from mipac.errors.base import APIError
from mipac.types.endpoints import ENDPOINTS 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.format import remove_dict_empty, upper_to_lower
from mipac.utils.util import COLORS, MISSING, _from_json from mipac.utils.util import COLORS, MISSING, _from_json
@ -118,7 +118,7 @@ REQUEST:{COLORS.reset}
async def close_session(self) -> None: async def close_session(self) -> None:
await self._session.close() 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_domain = re.search(r"https?:\/\/([^\/]+)", self._url)
match_protocol = re.search(r"^(http|https)", self._url) match_protocol = re.search(r"^(http|https)", self._url)
if match_domain is None or match_protocol is None: 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) self._session = aiohttp.ClientSession(ws_response_class=MisskeyClientWebSocketResponse)
if self._token: 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"]) config.from_dict(account_id=data["id"])
return data return data

@ -22,7 +22,7 @@ from mipac.manager.username import UsernameManager
if TYPE_CHECKING: if TYPE_CHECKING:
from mipac.config import Config from mipac.config import Config
from mipac.models.lite.user import PartialUser from mipac.models.lite.user import PartialUser
from mipac.models.user import UserDetailed from mipac.models.user import MeDetailed
__all__ = ("ClientManager",) __all__ = ("ClientManager",)
@ -80,5 +80,5 @@ class ClientManager:
def _create_client_invite_manager(self, invite_id: str) -> ClientInviteManager: def _create_client_invite_manager(self, invite_id: str) -> ClientInviteManager:
return ClientInviteManager(invite_id=invite_id, session=self.__session, client=self) 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() return await self.user.action.get_me()

@ -4,7 +4,7 @@ from datetime import datetime
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from mipac.abstract.model import AbstractModel 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 ( from mipac.types.admin import (
IIndexStat, IIndexStat,
IModerationLog, IModerationLog,
@ -91,8 +91,8 @@ class ModerationLog(AbstractModel):
return self.__moderation_log["user_id"] return self.__moderation_log["user_id"]
@property @property
def user(self) -> UserDetailed: def user(self) -> UserDetailedNotMe | MeDetailed:
return UserDetailed(self.__moderation_log["user"], client=self.__client) return packed_user(self.__moderation_log["user"], client=self.__client)
def __eq__(self, __value: object) -> bool: def __eq__(self, __value: object) -> bool:
return isinstance(__value, ModerationLog) and self.id == __value.id return isinstance(__value, ModerationLog) and self.id == __value.id

@ -3,7 +3,7 @@ from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from mipac.abstract.model import AbstractModel 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 from mipac.types.mute import IMuteUser
if TYPE_CHECKING: if TYPE_CHECKING:
@ -28,8 +28,8 @@ class MuteUser(AbstractModel):
return self.__data["mutee_id"] return self.__data["mutee_id"]
@property @property
def mutee(self) -> UserDetailed: def mutee(self) -> UserDetailedNotMe | MeDetailed:
return UserDetailed(self.__data["mutee"], client=self.__client) return packed_user(self.__data["mutee"], client=self.__client)
def __eq__(self, __value: MuteUser) -> bool: def __eq__(self, __value: MuteUser) -> bool:
return isinstance(__value, IMuteUser) and self.id == __value.id return isinstance(__value, IMuteUser) and self.id == __value.id

@ -5,7 +5,7 @@ from typing import TYPE_CHECKING
from mipac.abstract.model import AbstractModel from mipac.abstract.model import AbstractModel
from mipac.models.lite.role import PartialRole 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.types.roles import IMeRole, IRole, IRolePolicies, IRolePolicieValue, IRoleUser
from mipac.utils.format import str_to_datetime from mipac.utils.format import str_to_datetime
@ -24,8 +24,8 @@ class RoleUser(AbstractModel):
return self.__role_user["id"] return self.__role_user["id"]
@property @property
def user(self) -> UserDetailed: def user(self) -> UserDetailedNotMe | MeDetailed:
return UserDetailed(self.__role_user["user"], client=self.__client) return packed_user(self.__role_user["user"], client=self.__client)
@property @property
def expires_at(self) -> datetime | None: def expires_at(self) -> datetime | None:

Loading…
Cancel
Save