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.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

@ -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:
"""

@ -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,

@ -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

@ -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

@ -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

@ -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()

@ -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

@ -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

@ -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:

Loading…
Cancel
Save