feat: ロールを最新に追従

refactor: ActionやManagerの名前を変更
pull/142/head
yupix 4 months ago
parent 051a1f574f
commit 0a42264958
No known key found for this signature in database
GPG Key ID: 2FF705F5C56D9C06

@ -383,49 +383,49 @@
"path": "/admin/roles/delete",
"request_body_hash": "f1e8b29b15487ead09234ea7c06fb900cd4a56f76907ff025d55eb2ba96e5ce1",
"response_body_hash": "71b65c61c5c44f132273c289122399d5647599a18f1ec6fc6afc7f171167fd88",
"status": "notSupported"
"status": "supported"
},
"/admin/roles/list": {
"path": "/admin/roles/list",
"request_body_hash": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"response_body_hash": "a29e73a8aec4949d55a8b55d8e4fa2a7399dbb81a71831731df51e1519f150f5",
"status": "needToWork"
"status": "supported"
},
"/admin/roles/show": {
"path": "/admin/roles/show",
"request_body_hash": "f1e8b29b15487ead09234ea7c06fb900cd4a56f76907ff025d55eb2ba96e5ce1",
"response_body_hash": "a6e416c46472c8b0d8724047737649572fa2b02742d43313bb986421b3762f74",
"status": "needToWork"
"status": "supported"
},
"/admin/roles/update": {
"path": "/admin/roles/update",
"request_body_hash": "5a0b48979f607bbd1fae04044a256f6f00f3bb05cf8bf37f07fc9d0fc545191e",
"response_body_hash": "82b31d1805b5b4e5d352dc02dc8a966b532db3df7a76519ee01bcbb8f0d802d8",
"status": "notSupported"
"status": "supported"
},
"/admin/roles/assign": {
"path": "/admin/roles/assign",
"request_body_hash": "f7f3a63bda8c0a2670a08918641f2da445b7facd0cf159352849e07243e8141f",
"response_body_hash": "b6a9bfadd555c5023efaec61262e0dd7de6061991691004961cd22523a55bd68",
"status": "notSupported"
"status": "supported"
},
"/admin/roles/unassign": {
"path": "/admin/roles/unassign",
"request_body_hash": "edc227b6268e5d1a1d78948f2db5b24c648cb4cef9bd75f0898aa27580a5c85c",
"response_body_hash": "bc66aa1fb3138ce1a11a6b63af9d5f22cfdf731e228c9c64ae9655581c24f5e6",
"status": "notSupported"
"status": "supported"
},
"/admin/roles/update-default-policies": {
"path": "/admin/roles/update-default-policies",
"request_body_hash": "5993aa1848dbf1d239b51b5828e8fcad1dbb16ef12d1dd6cf570651f014efc9a",
"response_body_hash": "df9c0f9df08effe88b00991f12e46077998bd6d6c3442ec518e5f463680a2c54",
"status": "notSupported"
"status": "supported"
},
"/admin/roles/users": {
"path": "/admin/roles/users",
"request_body_hash": "985b8d2726a2e859a58a14d37b694af0e1a8911794cd692dbef09c20d9ba3cde",
"response_body_hash": "07c4c4aa9d7d863214274b76fb5258ddeedf9afa99a4196a928aa7cb081f3f8f",
"status": "needToWork"
"status": "supported"
},
"/announcements": {
"path": "/announcements",

@ -4,7 +4,7 @@
`2024.3.1`
## Supported endpoints (154/368)
## Supported endpoints (159/368)
- [x] /admin/accounts/create
- [x] /admin/accounts/delete
@ -29,6 +29,14 @@
- [x] /admin/unsuspend-user
- [x] /admin/update-user-note
- [x] /admin/roles/create
- [x] /admin/roles/delete
- [x] /admin/roles/list
- [x] /admin/roles/show
- [x] /admin/roles/update
- [x] /admin/roles/assign
- [x] /admin/roles/unassign
- [x] /admin/roles/update-default-policies
- [x] /admin/roles/users
- [x] /channels/create
- [x] /channels/featured
- [x] /channels/follow
@ -128,11 +136,6 @@
- [ ] /admin/show-user
- [ ] /admin/show-users
- [ ] /admin/delete-account
- [ ] /admin/roles/delete
- [ ] /admin/roles/update
- [ ] /admin/roles/assign
- [ ] /admin/roles/unassign
- [ ] /admin/roles/update-default-policies
- [ ] /announcements
- [ ] /antennas/create
- [ ] /antennas/delete
@ -313,9 +316,6 @@
- [ ] /admin/get-index-stats (Need to work)
- [ ] /admin/get-table-stats (Need to work)
- [ ] /admin/update-meta (Need to work)
- [ ] /admin/roles/list (Need to work)
- [ ] /admin/roles/show (Need to work)
- [ ] /admin/roles/users (Need to work)
- [ ] /drive (Need to work)
- [ ] /drive/stream (Need to work)
- [ ] /endpoint (Need to work)

@ -1,30 +1,36 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any, AsyncGenerator, Literal
from typing import TYPE_CHECKING, Any, Literal, override
from mipac.abstract.action import AbstractAction
from mipac.http import Route
from mipac.http import HTTPClient, Route
from mipac.models.roles import Role, RoleUser
from mipac.types.meta import IPolicies
from mipac.types.roles import IRole, IRoleUser
from mipac.utils.format import remove_dict_missing
from mipac.utils.pagination import Pagination
from mipac.utils.util import MISSING
if TYPE_CHECKING:
from mipac.http import HTTPClient
from mipac.manager.client import ClientManager
class AdminRoleModelActions(AbstractAction):
def __init__(self, role_id: str | None = None, *, session: HTTPClient, client: ClientManager):
class SharedAdminRoleActions:
def __init__(self, *, session: HTTPClient, client: ClientManager) -> None:
self._session: HTTPClient = session
self._client: ClientManager = client
self._role_id: str | None = role_id
async def delete(self, *, role_id: str) -> bool:
res: bool = await self._session.request(
Route("POST", "/api/admin/roles/delete"),
json={"roleId": role_id},
)
return res
async def update(
self,
name: str,
description: str,
role_id: str | None = None,
color: str | None = None,
iconUrl: str | None = None,
target: Literal["manual", "conditional"] = "manual",
@ -32,150 +38,249 @@ class AdminRoleModelActions(AbstractAction):
is_public: bool = False,
is_moderator: bool = False,
is_administrator: bool = False,
is_explorable: bool = MISSING,
as_badge: bool = False,
can_edit_members_by_moderator: bool = False,
display_order: int = 0,
policies: dict[Any, Any] | None = None,
*,
role_id: str,
) -> bool:
role_id = self._role_id or role_id
if role_id is None:
raise ValueError("role_idは必須です")
body = {
"roleId": role_id,
"name": name,
"description": description,
"color": color,
"iconUrl": iconUrl,
"target": target,
"condFormula": cond_formula or {},
"isPublic": is_public,
"isModerator": is_moderator,
"isAdministrator": is_administrator,
"asBadge": as_badge,
"canEditMembersByModerator": can_edit_members_by_moderator,
"policies": policies or {},
}
body = remove_dict_missing(
{
"roleId": role_id,
"name": name,
"description": description,
"color": color,
"iconUrl": iconUrl,
"target": target,
"condFormula": cond_formula or {},
"isPublic": is_public,
"isModerator": is_moderator,
"isAdministrator": is_administrator,
"isExplorable": is_explorable,
"asBadge": as_badge,
"canEditMembersByModerator": can_edit_members_by_moderator,
"displayOrder": display_order,
"policies": policies or {},
}
)
res: bool = await self._session.request(
Route("POST", "/api/admin/roles/update"),
json=body,
auth=True,
lower=True,
remove_none=False,
)
return res
async def delete(self, role_id: str | None = None) -> bool:
role_id = self._role_id or role_id
if role_id is None:
raise ValueError("role_idは必須です")
res: bool = await self._session.request(
Route("POST", "/api/admin/roles/delete"),
auth=True,
json={"roleId": role_id},
lower=True,
)
return res
async def assign(
self, user_id: str, role_id: str | None = None, expires_at: int | None = None
) -> bool:
async def assign(self, user_id: str, expires_at: int | None = None, *, role_id: str) -> bool:
"""指定したユーザーに指定したロールを付与します
Parameters
----------
role_id : str
ロールのID
user_id : str
ロールを付与する対象のユーザーID
expires_at : int | None, optional
いつまでロールを付与するか, by default None
role_id : str
ロールのID
Returns
-------
bool
成功したか否か
"""
if role_id is None:
raise ValueError("role_idは必須です")
body = {"roleId": role_id, "userId": user_id, "expiresAt": expires_at}
res: bool = await self._session.request(
Route("POST", "/api/admin/roles/assign"), auth=True, json=body
)
return res
async def unassign(self, user_id: str, role_id: str | None = None) -> bool:
"""指定したユーザーに指定したロールを付与します
async def unassign(self, user_id: str, *, role_id: str) -> bool:
"""指定したユーザーから指定したロールを解除します
Parameters
----------
user_id : str
ロールを解除するユーザーID
role_id : str
ロールのID
user_id : str
ロールを付与する対象のユーザーID
expires_at : int | None, optional
いつまでロールを付与するか, by default None
Returns
-------
bool
成功したか否か
"""
role_id = self._role_id or role_id
if role_id is None:
raise ValueError("role_idは必須です")
body = {"roleId": role_id, "userId": user_id}
res: bool = await self._session.request(
Route("POST", "/api/admin/roles/unassign"), auth=True, json=body
)
return res
async def show(self, role_id: str | None = None) -> Role:
role_id = self._role_id or role_id
if role_id is None:
raise ValueError("role_idは必須です")
res: IRole = await self._session.request(
Route("POST", "/api/admin/roles/show"),
json={"roleId": role_id},
auth=True,
lower=True,
)
return Role(res, client=self._client)
async def get_users(
self,
role_id: str | None = None,
since_id: str | None = None,
until_id: str | None = None,
limit: int = 100,
get_all: bool = False,
) -> AsyncGenerator[RoleUser, None]:
role_id = self._role_id or role_id
if role_id is None:
raise ValueError("role_idは必須です")
since_id: str = MISSING,
until_id: str = MISSING,
limit: int = MISSING,
*,
role_id: str,
) -> RoleUser:
body = remove_dict_missing(
{"limit": limit, "sinceId": since_id, "untilId": until_id, "roleId": role_id}
)
raw_role_user: IRoleUser = await self._session.request(
Route("POST", "/api/admin/roles/users"), json=body
)
if limit > 100:
raise ValueError("limitは100以下である必要があります")
return RoleUser(raw_role_user, client=self._client)
if get_all:
limit = 100
async def get_all_users(
self,
since_id: str = MISSING,
until_id: str = MISSING,
limit: int = MISSING,
*,
role_id: str,
):
"""指定したロールを持つユーザーを全て取得します
body = {"limit": limit, "sinceId": since_id, "untilId": until_id, "roleId": role_id}
Parameters
----------
since_id : str, optional
ページネーションの開始位置, by default MISSING
until_id : str, optional
ページネーションの終了位置, by default MISSING
limit : int, optional
1ページあたりの取得数, by default MISSING
role_id : str
ロールのID
Returns
-------
RoleUser
ロールユーザー
"""
body = remove_dict_missing(
{"sinceId": since_id, "untilId": until_id, "limit": limit, "roleId": role_id}
)
pagination = Pagination[IRoleUser](
self._session, Route("POST", "/api/admin/roles/users"), json=body
)
while True:
while pagination.is_final is False:
raw_role_users = await pagination.next()
for role_user in raw_role_users:
yield RoleUser(role_user, client=self._client)
for raw_role_user in raw_role_users:
yield RoleUser(raw_role_user, client=self._client)
class ClientAdminRoleActions(SharedAdminRoleActions):
def __init__(self, role_id: str, *, session: HTTPClient, client: ClientManager) -> None:
super().__init__(session=session, client=client)
self.__role_id: str = role_id
@override
async def delete(self, *, role_id: str | None = None) -> bool:
role_id = role_id or self.__role_id
if role_id is None:
raise ValueError("required role_id")
return await super().delete(role_id=role_id)
@override
async def update(
self,
name: str,
description: str,
color: str | None = None,
iconUrl: str | None = None,
target: Literal["manual"] | Literal["conditional"] = "manual",
cond_formula: dict[Any, Any] | None = None,
is_public: bool = False,
is_moderator: bool = False,
is_administrator: bool = False,
is_explorable: bool = MISSING,
as_badge: bool = False,
can_edit_members_by_moderator: bool = False,
display_order: int = 0,
policies: dict[Any, Any] | None = None,
*,
role_id: str | None = None,
) -> bool:
role_id = role_id or self.__role_id
if role_id is None:
raise ValueError("required role_id")
if get_all is False or pagination.is_final:
break
return await super().update(
name=name,
description=description,
color=color,
iconUrl=iconUrl,
target=target,
cond_formula=cond_formula,
is_public=is_public,
is_moderator=is_moderator,
is_administrator=is_administrator,
is_explorable=is_explorable,
as_badge=as_badge,
can_edit_members_by_moderator=can_edit_members_by_moderator,
display_order=display_order,
policies=policies,
role_id=role_id,
)
@override
async def assign(
self, user_id: str, expires_at: int | None = None, *, role_id: str | None = None
) -> bool:
role_id = role_id or self.__role_id
if role_id is None:
raise ValueError("required role_id")
return await super().assign(user_id=user_id, expires_at=expires_at, role_id=role_id)
@override
async def unassign(self, user_id: str, *, role_id: str | None = None) -> bool:
role_id = role_id or self.__role_id
if role_id is None:
raise ValueError("required role_id")
return await super().unassign(user_id=user_id, role_id=role_id)
@override
async def get_users(
self,
since_id: str = MISSING,
until_id: str = MISSING,
limit: int = MISSING,
*,
role_id: str,
) -> RoleUser:
return await super().get_users(
since_id=since_id, until_id=until_id, limit=limit, role_id=role_id
)
@override
async def get_all_users(
self,
since_id: str = MISSING,
until_id: str = MISSING,
limit: int = MISSING,
*,
role_id: str,
):
return super().get_all_users(
since_id=since_id, until_id=until_id, limit=limit, role_id=role_id
)
class AdminRoleActions(AdminRoleModelActions):
def __init__(self, role_id: str | None = None, *, session: HTTPClient, client: ClientManager):
super().__init__(role_id=role_id, session=session, client=client)
class AdminRoleActions(SharedAdminRoleActions):
def __init__(self, *, session: HTTPClient, client: ClientManager):
super().__init__(session=session, client=client)
async def create(
self,

@ -14,7 +14,7 @@ from mipac.manager.admins.announcement import (
from mipac.manager.admins.drive import AdminDriveManager
from mipac.manager.admins.emoji import AdminEmojiManager
from mipac.manager.admins.invite import AdminInviteManager
from mipac.manager.admins.roles import AdminRolesManager, AdminRolesModelManager
from mipac.manager.admins.roles import AdminRoleManager, ClientAdminRoleManager
from mipac.manager.admins.user import AdminUserManager
if TYPE_CHECKING:
@ -31,7 +31,7 @@ class AdminManager(AbstractManager):
self.announcement: AdminAnnouncementManager = AdminAnnouncementManager(
session=session, client=client
)
self.role: AdminRolesManager = AdminRolesManager(session=session, client=client)
self.role: AdminRoleManager = AdminRoleManager(session=session, client=client)
self.invite: AdminInviteManager = AdminInviteManager(session=session, client=client)
self.drive: AdminDriveManager = AdminDriveManager(session=session, client=client)
self.account: AdminAccountManager = AdminAccountManager(session=session, client=client)
@ -40,8 +40,8 @@ class AdminManager(AbstractManager):
def action(self) -> AdminActions:
return AdminActions(session=self.__session, client=self.__client)
def create_roles_model_manager(self, role_id: str | None = None) -> AdminRolesModelManager:
return AdminRolesModelManager(
def _create_role_model_manager(self, role_id: str) -> ClientAdminRoleManager:
return ClientAdminRoleManager(
role_id=role_id, session=self.__session, client=self.__client
)

@ -3,34 +3,30 @@ from __future__ import annotations
from typing import TYPE_CHECKING
from mipac.abstract.manager import AbstractManager
from mipac.actions.admins.roles import AdminRoleActions, AdminRoleModelActions
from mipac.actions.admins.roles import AdminRoleActions, ClientAdminRoleActions
from mipac.http import HTTPClient
if TYPE_CHECKING:
from mipac.client import ClientManager
class AdminRolesModelManager(AbstractManager):
def __init__(self, role_id: str | None = None, *, session: HTTPClient, client: ClientManager):
self.__role_id = role_id
class ClientAdminRoleManager(AbstractManager):
def __init__(self, role_id: str, *, session: HTTPClient, client: ClientManager):
self.__session: HTTPClient = session
self.__client: ClientManager = client
self.__action: ClientAdminRoleActions = ClientAdminRoleActions(
role_id=role_id, session=self.__session, client=self.__client
)
@property
def action(self) -> AdminRoleModelActions:
return AdminRoleModelActions(
role_id=self.__role_id, session=self.__session, client=self.__client
)
def action(self) -> ClientAdminRoleActions:
return self.__action
class AdminRolesManager:
class AdminRoleManager:
def __init__(self, role_id: str | None = None, *, session: HTTPClient, client: ClientManager):
self.__role_id = role_id
self.__session: HTTPClient = session
self.__client: ClientManager = client
self.__action: AdminRoleActions = AdminRoleActions(session=session, client=client)
@property
def action(self) -> AdminRoleActions:
return AdminRoleActions(
role_id=self.__role_id, session=self.__session, client=self.__client
)
return self.__action

@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any
from mipac.types.roles import IPartialRole
if TYPE_CHECKING:
from mipac.manager.admins.roles import AdminRolesModelManager
from mipac.manager.admins.roles import ClientAdminRoleManager
from mipac.manager.client import ClientManager
@ -47,8 +47,8 @@ class PartialRole[T: IPartialRole]:
return self._raw_role["display_order"]
@property
def api(self) -> AdminRolesModelManager:
return self.__client.admin.create_roles_model_manager(self.id)
def api(self) -> ClientAdminRoleManager:
return self.__client.admin._create_role_model_manager(self.id)
def _get(self, key: str) -> Any | None:
return self._raw_role.get(key)

Loading…
Cancel
Save