From 73c1fdc290d09fe919e477d16885d93f51edc69f Mon Sep 17 00:00:00 2001 From: yupix Date: Mon, 31 Oct 2022 22:28:55 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20chat=E3=82=92manager=E3=81=A8action?= =?UTF-8?q?=E3=81=AB=E5=88=86=E9=9B=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mipac/actions/chat.py | 158 +++++++++++++++++++++++++++++++++++++++++ mipac/manager/chat.py | 161 +++++++++++------------------------------- 2 files changed, 201 insertions(+), 118 deletions(-) create mode 100644 mipac/actions/chat.py diff --git a/mipac/actions/chat.py b/mipac/actions/chat.py new file mode 100644 index 00000000..bf3abada --- /dev/null +++ b/mipac/actions/chat.py @@ -0,0 +1,158 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING +from mipac.abc.action import AbstractAction +from mipac.exception import ParameterError +from mipac.http import HTTPClient, Route +from mipac.models.chat import ChatMessage +from mipac.types.chat import IChatMessage +from mipac.util import check_multi_arg + +if TYPE_CHECKING: + from mipac.manager.client import ClientActions + + +class BaseChatAction(AbstractAction): + def __init__( + self, + session: HTTPClient, + client: ClientActions, + *, + user_id: str | None = None, + message_id: str | None = None, + ): + self.__session = session + self.__client = client + self.__user_id = user_id + self.__message_id = message_id + + async def read(self, message_id: str | None = None) -> bool: + """ + 指定したIdのメッセージを既読にします + + Parameters + ---------- + message_id : str + Message id + + Returns + ------- + bool + Success or Failure. + """ + if check_multi_arg(message_id, self.__message_id) is False: + raise ParameterError('message_idがありません') + message_id = message_id or self.__message_id + body = {'messageId': message_id} + res: bool = await self.__session.request( + Route('POST', '/api/messaging/messages/read'), + json=body, + auth=True, + lower=True, + ) + return res + + async def delete(self, message_id: str | None = None) -> bool: + """ + 指定したidのメッセージを削除します。 + + Parameters + ---------- + message_id : str + Message id + + Returns + ------- + bool + Success or Failure. + """ + + if check_multi_arg(message_id, self.__message_id) is False: + raise ParameterError('message_idがありません') + + message_id = message_id or self.__message_id + body = {'messageId': f'{message_id}'} + res: bool = await self.__session.request( + Route('POST', '/api/messaging/messages/delete'), + json=body, + auth=True, + ) + return bool(res) + + +class ChatAction(BaseChatAction): + def __init__( + self, + session: HTTPClient, + client: ClientActions, + *, + user_id: str | None = None, + message_id: str | None = None, + ): + super().__init__( + session, client, user_id=user_id, message_id=message_id + ) + + async def get_history(self, limit: int = 100, group: bool = True): + """ + Get the chat history. + + Parameters + ---------- + limit : int, default=100, max=100 + Number of items to retrieve, up to 100 + group : bool, default=True + Whether to include group chat or not + + Returns + ------- + list[ChatMessage] + List of chat history + """ + + if limit > 100: + raise ParameterError('limit must be greater than 100') + + args = {'limit': limit, 'group': group} + data: list[IChatMessage] = await self.__session.request( + Route('POST', '/api/messaging/history'), json=args, auth=True + ) + return [ChatMessage(d, client=self.__client) for d in data] + + async def send( + self, + text: str | None = None, + *, + file_id: str | None = None, + user_id: str | None = None, + group_id: str | None = None, + ) -> ChatMessage: + """ + Send chat. + + Parameters + ---------- + text : Optional[str], default=None + Chat content + file_id : Optional[str], default=None + 添付するファイルのID + user_id : Optional[str], default=None + 送信するユーザーのID + group_id : Optional[str], default=None + Destination group id + """ + user_id = user_id or self.__user_id + data = { + 'userId': user_id, + 'groupId': group_id, + 'text': text, + 'fileId': file_id, + } + print(vars(self)) + res = await self.__session.request( + Route('POST', '/api/messaging/messages/create'), + json=data, + auth=True, + lower=True, + ) + return ChatMessage(res, client=self.__client) diff --git a/mipac/manager/chat.py b/mipac/manager/chat.py index c2505b99..24099980 100644 --- a/mipac/manager/chat.py +++ b/mipac/manager/chat.py @@ -1,118 +1,43 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Optional - -from mipac.exception import ParameterError -from mipac.http import HTTPClient, Route -from mipac.models.chat import ChatMessage -from mipac.util import check_multi_arg - -if TYPE_CHECKING: - from mipac.manager.client import ClientActions - from mipac.types.chat import IChatMessage - -__all__ = ('ChatManager',) - - -class ChatManager: - def __init__( - self, - session: HTTPClient, - client: ClientActions, - user_id: Optional[str] = None, - message_id: Optional[str] = None, - ): - self.__session: HTTPClient = session - self.__client: ClientActions = client - self.__user_id = user_id - self.__message_id = message_id - - async def get_history(self, limit: int = 100, group: bool = True): - """ - Get the chat history. - - Parameters - ---------- - limit : int, default=100, max=100 - Number of items to retrieve, up to 100 - group : bool, default=True - Whether to include group chat or not - - Returns - ------- - list[ChatMessage] - List of chat history - """ - - if limit > 100: - raise ParameterError('limit must be greater than 100') - - args = {'limit': limit, 'group': group} - data: list[IChatMessage] = await self.__session.request( - Route('POST', '/api/messaging/history'), json=args, auth=True - ) - return [ChatMessage(d, client=self.__client) for d in data] - - async def send( - self, - text: Optional[str] = None, - *, - file_id: Optional[str] = None, - user_id: Optional[str] = None, - group_id: Optional[str] = None, - ) -> ChatMessage: - """ - Send chat. - - Parameters - ---------- - text : Optional[str], default=None - チャットのテキスト - file_id : Optional[str], default=None - 添付するファイルのID - user_id : Optional[str], default=None - 送信するユーザーのID - group_id : Optional[str], default=None - 送信するグループのID - """ - user_id = user_id or self.__user_id - data = { - 'userId': user_id, - 'groupId': group_id, - 'text': text, - 'fileId': file_id, - } - res = await self.__session.request( - Route('POST', '/api/messaging/messages/create'), - json=data, - auth=True, - lower=True, - ) - return ChatMessage(res, client=self.__client) - - async def delete(self, message_id: Optional[str] = None) -> bool: - """ - 指定したidのメッセージを削除します。 - - Parameters - ---------- - message_id : str - メッセージid - - Returns - ------- - bool - 成功したか否か - """ - - if check_multi_arg(message_id, self.__message_id) is False: - raise ParameterError('message_idがありません') - - message_id = message_id or self.__message_id - args = {'messageId': f'{message_id}'} - data = await self.__session.request( - Route('POST', '/api/messaging/messages/delete'), - json=args, - auth=True, - ) - return bool(data) +from __future__ import annotations + +from typing import TYPE_CHECKING +from mipac.actions.chat import BaseChatAction, ChatAction + +from mipac.http import HTTPClient + +if TYPE_CHECKING: + from mipac.manager.client import ClientActions + +__all__ = ('ChatManager',) + + +class ChatManager: + def __init__( + self, session: HTTPClient, client: ClientActions, + ): + self.__session: HTTPClient = session + self.__client: ClientActions = client + + @property + def action(self) -> ChatAction: + return ChatAction(session=self.__session, client=self.__client) + + def custom_base_chat_action( + self, user_id: str | None = None, message_id: str | None = None + ) -> BaseChatAction: + return BaseChatAction( + session=self.__session, + client=self.__client, + user_id=user_id, + message_id=message_id, + ) + + def custom_action( + self, user_id: str | None = None, message_id: str | None = None + ) -> ChatAction: + return ChatAction( + session=self.__session, + client=self.__client, + user_id=user_id, + message_id=message_id, + )