From 773c4b92197833033b0ab719f0dca162fb113b60 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Fri, 12 Nov 2021 19:07:24 +0900 Subject: [PATCH 01/73] feat: Separated token management process --- emo_platform/api.py | 272 +++++++++++++++-------------------------- emo_platform/models.py | 6 + 2 files changed, 106 insertions(+), 172 deletions(-) diff --git a/emo_platform/api.py b/emo_platform/api.py index 7e7f014..4802849 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -1,8 +1,9 @@ import json import os from collections import deque +from dataclasses import asdict from functools import partial -from typing import Any, Callable, Coroutine, Dict, List, Optional, Union +from typing import Callable, Dict, List, Optional, Union import requests import uvicorn # type: ignore @@ -14,7 +15,7 @@ UnauthorizedError, _http_error_handler, ) -from emo_platform.models import Color, Head, WebHook +from emo_platform.models import Color, Head, Tokens, WebHook from emo_platform.response import ( EmoAccountInfo, EmoMessageInfo, @@ -40,140 +41,117 @@ class PostContentType: MULTIPART_FORMDATA = None -class Client: - """各種apiを呼び出す同期版のclient - - Parameters - ---------- - endpoint_url : str, default https://platform-api.bocco.me - BOCCO emo platform apiにアクセスするためのendpoint - - token_file_path : Optional[str], default None - refresh token及びaccess tokenを保存するファイルのパス。 - - 指定しない場合は、このpkg内のディレクトリに保存されます。 - - 指定したパスには、以下の2種類のファイルが生成されます。 - - emo-platform-api.json - 最新のトークンを保存するファイル - - emo-platform-api_previous.json - 現在、環境変数として設定されているトークンを保存するファイル - - 前回との差分検知のために使用されます。 - - 差分があった場合は、emo-platform-api.jsonに保存されているトークンが削除されます。 - - Raises - ---------- - NoRefreshTokenError - refresh tokenあるいはaccess tokenが環境変数として設定されていないもしくは間違っている場合。 - - RateLimitError - APIをレートリミットを超えて呼び出した場合。 - - Note - ---- - 使用しているaccess tokenの期限が切れた場合 - refresh tokenをもとに自動的に更新されます。 - - その際にAPI呼び出しが最大で2回行われます。 - - refresh tokenは以下の優先順位で選ばれます。 - - 1. emo-platform-api.jsonに保存されているrefresh token - - 2. 環境変数 EMO_PLATFORM_API_REFRESH_TOKENに設定されているrefresh token - - ただし、emo-platform-api_previous.jsonに差分があった場合は、1はskipされるようになっています。 - - clientの各メソッドを実行した際も、access tokenが切れていた場合、同様に自動更新が行われます。 - - """ - - _BASE_URL = "https://platform-api.bocco.me" +class TokenManager: _TOKEN_FILE = f"{EMO_PLATFORM_PATH}/tokens/emo-platform-api.json" _PREVOIUS_TOKEN_FILE = f"{EMO_PLATFORM_PATH}/tokens/emo-platform-api_previous.json" - _DEFAULT_ROOM_ID = "" - _MAX_SAVED_REQUEST_ID = 10 + _INITIAL_TOKENS = {"access_token": "", "refresh_token": ""} def __init__( - self, endpoint_url: str = _BASE_URL, token_file_path: Optional[str] = None + self, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None ): - if token_file_path is not None: + self._set_token_file_path(token_file_path) + self._prevoius_set_tokens = self._load_previous_set_tokens() + self._current_set_tokens = self._get_currnet_set_tokens(tokens) + self._save_current_set_tokens() + self.tokens = self._get_latest_tokens() + + def _set_token_file_path(self, token_file_path) -> None: + if token_file_path: self._TOKEN_FILE = f"{token_file_path}/emo-platform-api.json" self._PREVOIUS_TOKEN_FILE = ( f"{token_file_path}/emo-platform-api_previous.json" ) - self.endpoint_url = endpoint_url - self.headers: Dict[str, Optional[str]] = { - "accept": "*/*", - "Content-Type": PostContentType.APPLICATION_JSON, - } - # load prevoius os env tokens + def _load_previous_set_tokens(self) -> Tokens: try: with open(self._PREVOIUS_TOKEN_FILE) as f: - prevoius_env_tokens = json.load(f) + return Tokens(**json.load(f)) except FileNotFoundError: - prevoius_env_tokens = {"refresh_token": "", "access_token": ""} + return Tokens(**self._INITIAL_TOKENS) + + def _get_currnet_set_tokens(self, tokens: Optional[Tokens]) -> Tokens: + if tokens: + return tokens + else: + return self._get_currnet_os_env_tokens() - # get current os env access token + def _get_currnet_os_env_tokens(self) -> Tokens: + access_token = self._get_currnet_os_env_access_token() + refresh_token = self._get_currnet_os_env_refresh_token() + return Tokens(**{"refresh_token": refresh_token, "access_token": access_token}) + + def _get_currnet_os_env_access_token(self) -> str: try: - access_token = os.environ["EMO_PLATFORM_API_ACCESS_TOKEN"] + return os.environ["EMO_PLATFORM_API_ACCESS_TOKEN"] except KeyError as e: # try to use old prevoius os env access token when current one doesn't exsist - if (prevoius_env_tokens["access_token"]) == "": + if (self._prevoius_set_tokens.access_token) == "": raise TokenError("set tokens as 'EMO_PLATFORM_API_ACCESS_TOKEN'") from e else: - access_token = prevoius_env_tokens["access_token"] + return self._prevoius_set_tokens.access_token - # get current os env refresh token + def _get_currnet_os_env_refresh_token(self) -> str: try: - refresh_token = os.environ["EMO_PLATFORM_API_REFRESH_TOKEN"] + return os.environ["EMO_PLATFORM_API_REFRESH_TOKEN"] except KeyError as e: # try to use old prevoius os env refresh token when current one doesn't exsist - if (prevoius_env_tokens["refresh_token"]) == "": - raise TokenError("set tokens as 'EMO_PLATFORM_API_REFRESH_TOKEN'") from e + if (self._prevoius_set_tokens.refresh_token) == "": + raise TokenError( + "set tokens as 'EMO_PLATFORM_API_REFRESH_TOKEN'" + ) from e else: - refresh_token = prevoius_env_tokens["refresh_token"] - - self.current_env_tokens = { - "refresh_token" : refresh_token, - "access_token" : access_token - } + return self._prevoius_set_tokens.refresh_token - # save new os env tokens + def _save_current_set_tokens(self) -> None: with open(self._PREVOIUS_TOKEN_FILE, "w") as f: - json.dump(self.current_env_tokens, f) + json.dump(asdict(self._current_set_tokens), f) + def _get_latest_tokens(self) -> Tokens: # compare new os env tokens with old ones - if self.current_env_tokens == prevoius_env_tokens: + if self._current_set_tokens == self._prevoius_set_tokens: try: with open(self._TOKEN_FILE) as f: - saved_tokens = json.load(f) + return Tokens(**json.load(f)) except FileNotFoundError: with open(self._TOKEN_FILE, "w") as f: - saved_tokens = {"refresh_token": "", "access_token": ""} - json.dump(saved_tokens, f) + json.dump(asdict(self._current_set_tokens), f) + return self._current_set_tokens else: # reset json file when os env token updated with open(self._TOKEN_FILE, "w") as f: - saved_tokens = {"refresh_token": "", "access_token": ""} - json.dump(saved_tokens, f) - saved_access_token = saved_tokens["access_token"] + json.dump(asdict(self._current_set_tokens), f) + return self._current_set_tokens - # decide which access token to use - if saved_access_token == "": - self.access_token = self.current_env_tokens["access_token"] - else: - self.access_token = saved_access_token + def save_tokens(self) -> None: + with open(self._TOKEN_FILE, "w") as f: + json.dump(asdict(self.tokens), f) - self.headers["Authorization"] = "Bearer " + self.access_token + +class Client: + _BASE_URL = "https://platform-api.bocco.me" + _DEFAULT_ROOM_ID = "" + _MAX_SAVED_REQUEST_ID = 10 + + def __init__( + self, + endpoint_url: str = _BASE_URL, + tokens: Optional[Tokens] = None, + token_file_path: Optional[str] = None, + ): + self._tm = TokenManager() + self.endpoint_url = endpoint_url + self.headers: Dict[str, Optional[str]] = { + "accept": "*/*", + "Content-Type": PostContentType.APPLICATION_JSON, + "Authorization": "Bearer " + self._tm.tokens.access_token, + } self.room_id_list = [self._DEFAULT_ROOM_ID] self.webhook_events_cb: Dict[str, Dict[str, Callable]] = {} self.request_id_deque: deque = deque([], self._MAX_SAVED_REQUEST_ID) + @property + def tm(self): + return self._tm + def update_tokens(self) -> None: """トークンの更新と保存 @@ -196,41 +174,15 @@ def update_tokens(self) -> None: 最大2回 """ - def _try_update_access_token(refresh_token): - res_tokens = self.get_access_token(refresh_token) - self.access_token = res_tokens.access_token - refresh_token = res_tokens.refresh_token - self.headers["Authorization"] = "Bearer " + self.access_token - save_tokens = { - "refresh_token": refresh_token, - "access_token": self.access_token, - } - with open(self._TOKEN_FILE, "w") as f: - json.dump(save_tokens, f) - - # load saved tokens - with open(self._TOKEN_FILE, "r") as f: - saved_tokens = json.load(f) - refresh_token = saved_tokens["refresh_token"] - - # try with saved refresh token - if refresh_token != "": - try: - _try_update_access_token(refresh_token) - except UnauthorizedError: - save_tokens = {"refresh_token": "", "access_token": ""} - with open(self._TOKEN_FILE, "w") as f: - json.dump(save_tokens, f) - else: - return - - # try with current env refresh token - refresh_token = self.current_env_tokens["refresh_token"] try: - _try_update_access_token(refresh_token) + res_tokens = self.get_access_token(self._tm.tokens.refresh_token) except UnauthorizedError: pass else: + self._tm.tokens.access_token = res_tokens.access_token + self._tm.tokens.refresh_token = res_tokens.refresh_token + self.headers["Authorization"] = "Bearer " + self._tm.tokens.access_token + self._tm.save_tokens() return raise TokenError( @@ -327,7 +279,7 @@ def get_access_token(self, refresh_token: str) -> EmoTokens: def get_account_info( self, - ) -> Union[EmoAccountInfo, Coroutine[Any, Any, EmoAccountInfo]]: + ) -> EmoAccountInfo: """アカウント情報の取得 Returns @@ -354,7 +306,7 @@ def get_account_info( def delete_account_info( self, - ) -> Union[EmoAccountInfo, Coroutine[Any, Any, EmoAccountInfo]]: + ) -> EmoAccountInfo: """アカウントの削除 紐づくWebhook等の設定も全て削除されます。 @@ -381,7 +333,7 @@ def delete_account_info( response = self._delete("/v1/me") return EmoAccountInfo(**response) - def get_rooms_list(self) -> Union[EmoRoomInfo, Coroutine[Any, Any, EmoRoomInfo]]: + def get_rooms_list(self) -> EmoRoomInfo: """ユーザが参加している部屋の一覧の取得 取得可能な部屋は、「BOCCO emo Wi-Fiモデル」のものに限られます。 @@ -467,7 +419,7 @@ def create_room_client(self, room_id: str): def get_stamps_list( self, - ) -> Union[EmoStampsInfo, Coroutine[Any, Any, EmoStampsInfo]]: + ) -> EmoStampsInfo: """利用可能なスタンプ一覧の取得 Returns @@ -494,7 +446,7 @@ def get_stamps_list( def get_motions_list( self, - ) -> Union[EmoMotionsInfo, Coroutine[Any, Any, EmoMotionsInfo]]: + ) -> EmoMotionsInfo: """利用可能なプリセットモーション一覧の取得 Returns @@ -521,7 +473,7 @@ def get_motions_list( def get_webhook_setting( self, - ) -> Union[EmoWebhookInfo, Coroutine[Any, Any, EmoWebhookInfo]]: + ) -> EmoWebhookInfo: """現在設定されているWebhookの情報の取得 Returns @@ -547,9 +499,7 @@ def get_webhook_setting( response = self._get("/v1/webhook") return EmoWebhookInfo(**response) - def change_webhook_setting( - self, webhook: WebHook - ) -> Union[EmoWebhookInfo, Coroutine[Any, Any, EmoWebhookInfo]]: + def change_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: """Webhookの設定の変更 Parameters @@ -582,9 +532,7 @@ def change_webhook_setting( response = self._put("/v1/webhook", json.dumps(payload)) return EmoWebhookInfo(**response) - def register_webhook_event( - self, events: List[str] - ) -> Union[EmoWebhookInfo, Coroutine[Any, Any, EmoWebhookInfo]]: + def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: """Webhook通知するイベントの指定 eventの種類は、 @@ -655,7 +603,7 @@ def create_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: def delete_webhook_setting( self, - ) -> Union[EmoWebhookInfo, Coroutine[Any, Any, EmoWebhookInfo]]: + ) -> EmoWebhookInfo: """現在設定されているWebhookの情報の削除 Returns @@ -847,9 +795,7 @@ def __init__(self, base_client: Client, room_id: str): self.base_client = base_client self.room_id = room_id - def get_msgs( - self, ts: int = None - ) -> Union[EmoMsgsInfo, Coroutine[Any, Any, EmoMsgsInfo]]: + def get_msgs(self, ts: int = None) -> EmoMsgsInfo: """部屋に投稿されたメッセージの取得 Parameters @@ -887,7 +833,7 @@ def get_msgs( def get_sensors_list( self, - ) -> Union[EmoSensorsInfo, Coroutine[Any, Any, EmoSensorsInfo]]: + ) -> EmoSensorsInfo: """BOCCO emoとペアリングされているセンサの一覧の取得 センサの種類は @@ -917,9 +863,7 @@ def get_sensors_list( response = self.base_client._get("/v1/rooms/" + self.room_id + "/sensors") return EmoSensorsInfo(**response) - def get_sensor_values( - self, sensor_id: str - ) -> Union[EmoRoomSensorInfo, Coroutine[Any, Any, EmoRoomSensorInfo]]: + def get_sensor_values(self, sensor_id: str) -> EmoRoomSensorInfo: """部屋センサの送信値を取得 Parameters @@ -955,9 +899,7 @@ def get_sensor_values( ) return EmoRoomSensorInfo(**response) - def send_audio_msg( - self, audio_data_path: str - ) -> Union[EmoMessageInfo, Coroutine[Any, Any, EmoMessageInfo]]: + def send_audio_msg(self, audio_data_path: str) -> EmoMessageInfo: """音声ファイルの部屋への投稿 Attention @@ -1001,9 +943,7 @@ def send_audio_msg( ) return EmoMessageInfo(**response) - def send_image( - self, image_data_path: str - ) -> Union[EmoMessageInfo, Coroutine[Any, Any, EmoMessageInfo]]: + def send_image(self, image_data_path: str) -> EmoMessageInfo: """画像ファイルの部屋への投稿 Attention @@ -1047,9 +987,7 @@ def send_image( ) return EmoMessageInfo(**response) - def send_msg( - self, msg: str - ) -> Union[EmoMessageInfo, Coroutine[Any, Any, EmoMessageInfo]]: + def send_msg(self, msg: str) -> EmoMessageInfo: """テキストメッセージの部屋への投稿 Parameters @@ -1083,9 +1021,7 @@ def send_msg( ) return EmoMessageInfo(**response) - def send_stamp( - self, stamp_id: str, msg: Optional[str] = None - ) -> Union[EmoMessageInfo, Coroutine[Any, Any, EmoMessageInfo]]: + def send_stamp(self, stamp_id: str, msg: Optional[str] = None) -> EmoMessageInfo: """スタンプの部屋への投稿 Parameters @@ -1128,9 +1064,7 @@ def send_stamp( ) return EmoMessageInfo(**response) - def send_original_motion( - self, motion_data: Union[str, dict] - ) -> Union[EmoMessageInfo, Coroutine[Any, Any, EmoMessageInfo]]: + def send_original_motion(self, motion_data: Union[str, dict]) -> EmoMessageInfo: """独自定義した、オリジナルのモーションをBOCCO emoに送信 詳しくは、 @@ -1175,9 +1109,7 @@ def send_original_motion( ) return EmoMessageInfo(**response) - def change_led_color( - self, color: Color - ) -> Union[EmoMessageInfo, Coroutine[Any, Any, EmoMessageInfo]]: + def change_led_color(self, color: Color) -> EmoMessageInfo: """ほっぺたの色の変更 3秒間、ほっぺたの色を指定した色に変更します。 @@ -1213,9 +1145,7 @@ def change_led_color( ) return EmoMessageInfo(**response) - def move_to( - self, head: Head - ) -> Union[EmoMessageInfo, Coroutine[Any, Any, EmoMessageInfo]]: + def move_to(self, head: Head) -> EmoMessageInfo: """首の角度の変更 首の角度を変更するモーションをBOCCO emoに送信します。 @@ -1251,9 +1181,7 @@ def move_to( ) return EmoMessageInfo(**response) - def send_motion( - self, motion_id: str - ) -> Union[EmoMessageInfo, Coroutine[Any, Any, EmoMessageInfo]]: + def send_motion(self, motion_id: str) -> EmoMessageInfo: """プリセットモーションをBOCCO emoに送信 Parameters @@ -1291,7 +1219,7 @@ def send_motion( def get_emo_settings( self, - ) -> Union[EmoSettingsInfo, Coroutine[Any, Any, EmoSettingsInfo]]: + ) -> EmoSettingsInfo: """現在のBOCCO emoの設定値を取得 Returns diff --git a/emo_platform/models.py b/emo_platform/models.py index 0cdecd9..5a3988e 100644 --- a/emo_platform/models.py +++ b/emo_platform/models.py @@ -1,6 +1,12 @@ from dataclasses import dataclass +@dataclass +class Tokens: + access_token: str = "" + refresh_token: str = "" + + @dataclass class Color: """BOCCO emoのほっぺの色。 From 9ef637c3d6b897ddce278325f313fad201406ece Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Mon, 15 Nov 2021 10:34:27 +0900 Subject: [PATCH 02/73] feat: Add regex to poetry to make black executable --- poetry.lock | 110 +++++++++++++++++++++++++------------------------ pyproject.toml | 1 + 2 files changed, 57 insertions(+), 54 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1c11e89..abc316b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -74,7 +74,7 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.9b0" +version = "21.10b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -95,9 +95,9 @@ typing-extensions = [ [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] +python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -393,7 +393,7 @@ python-versions = "*" [[package]] name = "regex" -version = "2021.10.8" +version = "2021.11.10" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -675,7 +675,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "0e191ad445fac26298e54a62ba4e58f2a9810c4ae8f1b7f7d37aed0b7e8d81c5" +content-hash = "cd38f4770c8ade2712cc4825ab9bef7614526476201fd528bd558fc0df4639a6" [metadata.files] aiohttp = [ @@ -738,8 +738,8 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, + {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, + {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, ] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, @@ -1017,53 +1017,55 @@ pytz = [ {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] regex = [ - {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:094a905e87a4171508c2a0e10217795f83c636ccc05ddf86e7272c26e14056ae"}, - {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"}, - {file = "regex-2021.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b0f2f874c6a157c91708ac352470cb3bef8e8814f5325e3c5c7a0533064c6a24"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"}, - {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"}, - {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"}, - {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"}, - {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"}, - {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"}, - {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"}, - {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"}, - {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19b8f6d23b2dc93e8e1e7e288d3010e58fafed323474cf7f27ab9451635136d9"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:951be934dc25d8779d92b530e922de44dda3c82a509cdb5d619f3a0b1491fafa"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"}, - {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"}, - {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6dcf53d35850ce938b4f044a43b33015ebde292840cef3af2c8eb4c860730fff"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e2ec1c106d3f754444abf63b31e5c4f9b5d272272a491fa4320475aba9e8157c"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"}, - {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"}, - {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"}, - {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"}, + {file = "regex-2021.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf"}, + {file = "regex-2021.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4"}, + {file = "regex-2021.11.10-cp310-cp310-win32.whl", hash = "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a"}, + {file = "regex-2021.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12"}, + {file = "regex-2021.11.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e"}, + {file = "regex-2021.11.10-cp36-cp36m-win32.whl", hash = "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4"}, + {file = "regex-2021.11.10-cp36-cp36m-win_amd64.whl", hash = "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e"}, + {file = "regex-2021.11.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f"}, + {file = "regex-2021.11.10-cp37-cp37m-win32.whl", hash = "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec"}, + {file = "regex-2021.11.10-cp37-cp37m-win_amd64.whl", hash = "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4"}, + {file = "regex-2021.11.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83"}, + {file = "regex-2021.11.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94"}, + {file = "regex-2021.11.10-cp38-cp38-win32.whl", hash = "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc"}, + {file = "regex-2021.11.10-cp38-cp38-win_amd64.whl", hash = "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d"}, + {file = "regex-2021.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b"}, + {file = "regex-2021.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef"}, + {file = "regex-2021.11.10-cp39-cp39-win32.whl", hash = "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a"}, + {file = "regex-2021.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29"}, + {file = "regex-2021.11.10.tar.gz", hash = "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6"}, ] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, diff --git a/pyproject.toml b/pyproject.toml index ff18144..a07733e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ mypy = "^0.910" types-requests = "^2.25.9" Sphinx = "^4.2.0" sphinx-rtd-theme = "^1.0.0" +regex = "^2021.11.10" [build-system] requires = ["poetry-core>=1.0.0"] From 2c4eb499b4ef82c3ed0af096d9ef6df024515a8f Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Mon, 15 Nov 2021 10:58:39 +0900 Subject: [PATCH 03/73] feat: Changed how to display token error when updating tokens --- emo_platform/api.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/emo_platform/api.py b/emo_platform/api.py index 4802849..da51241 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -176,8 +176,10 @@ def update_tokens(self) -> None: try: res_tokens = self.get_access_token(self._tm.tokens.refresh_token) - except UnauthorizedError: - pass + except UnauthorizedError as e: + raise TokenError( + "Please set new refresh_token as environment variable 'EMO_PLATFORM_API_REFRESH_TOKEN'" + ) from e else: self._tm.tokens.access_token = res_tokens.access_token self._tm.tokens.refresh_token = res_tokens.refresh_token @@ -185,10 +187,6 @@ def update_tokens(self) -> None: self._tm.save_tokens() return - raise TokenError( - "Please set new refresh_token as environment variable 'EMO_PLATFORM_API_REFRESH_TOKEN'" - ) - def _check_http_error(self, request: Callable, update_tokens: bool = True) -> dict: response = request() try: From 0e9f4a9f67bc65c77cc8699862f59e908a45fc64 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Mon, 15 Nov 2021 14:09:44 +0900 Subject: [PATCH 04/73] feat: Changed async class design from inheritance to delegation --- emo_platform/api_async.py | 241 ++++++++++++++++++++++++-------------- tests/test_api_async.py | 16 +-- 2 files changed, 159 insertions(+), 98 deletions(-) diff --git a/emo_platform/api_async.py b/emo_platform/api_async.py index c8e5568..29e8791 100644 --- a/emo_platform/api_async.py +++ b/emo_platform/api_async.py @@ -7,13 +7,14 @@ import uvicorn # type: ignore from fastapi import BackgroundTasks, FastAPI, Request -from emo_platform.api import Client, PostContentType, Room +from emo_platform.api import Client, PostContentType from emo_platform.exceptions import ( + NoRoomError, TokenError, UnauthorizedError, _aiohttp_error_handler, ) -from emo_platform.models import Color, Head, WebHook +from emo_platform.models import Color, Head, Tokens, WebHook from emo_platform.response import ( EmoAccountInfo, EmoMessageInfo, @@ -30,50 +31,39 @@ ) -class AsyncClient(Client): - async def _update_tokens(self) -> None: - async def _try_update_access_token(refresh_token): - res_tokens = await self._get_access_token(refresh_token) - self.access_token = res_tokens.access_token - refresh_token = res_tokens.refresh_token - self.headers["Authorization"] = "Bearer " + self.access_token - save_tokens = { - "refresh_token": refresh_token, - "access_token": self.access_token, - } - with open(self._TOKEN_FILE, "w") as f: - json.dump(save_tokens, f) - - # load saved tokens - with open(self._TOKEN_FILE, "r") as f: - saved_tokens = json.load(f) - refresh_token = saved_tokens["refresh_token"] - - # try with saved refresh token - if refresh_token != "": - try: - await _try_update_access_token(refresh_token) - except UnauthorizedError: - save_tokens = {"refresh_token": "", "access_token": ""} - with open(self._TOKEN_FILE, "w") as f: - json.dump(save_tokens, f) - else: - return +class AsyncClient: + _BASE_URL = Client._BASE_URL + _DEFAULT_ROOM_ID = Client._DEFAULT_ROOM_ID + _MAX_SAVED_REQUEST_ID = Client._MAX_SAVED_REQUEST_ID + + def __init__( + self, + endpoint_url: str = _BASE_URL, + tokens: Optional[Tokens] = None, + token_file_path: Optional[str] = None, + ): + self._client = Client(endpoint_url, tokens, token_file_path) + + async def update_tokens(self) -> None: - # try with current env refresh token - refresh_token = self.current_env_tokens["refresh_token"] try: - await _try_update_access_token(refresh_token) - except UnauthorizedError: - pass + res_tokens = await self.get_access_token( + self._client.tm.tokens.refresh_token + ) + except UnauthorizedError as e: + raise TokenError( + "Please set new refresh_token as environment variable 'EMO_PLATFORM_API_REFRESH_TOKEN'" + ) from e else: + self._client.tm.tokens.access_token = res_tokens.access_token + self._client.tm.tokens.refresh_token = res_tokens.refresh_token + self._client.headers["Authorization"] = ( + "Bearer " + self._client.tm.tokens.access_token + ) + self._client.tm.save_tokens() return - raise TokenError( - "Please set new refresh_token as environment variable 'EMO_PLATFORM_API_REFRESH_TOKEN'" - ) - - async def _acheck_http_error( + async def _check_http_error( self, request: Callable, update_tokens: bool = True ) -> dict: async with request() as response: @@ -87,24 +77,24 @@ async def _acheck_http_error( else: return await response.json() - await self._update_tokens() + await self.update_tokens() async with request() as response: response_msg = await response.text() with _aiohttp_error_handler(response_msg): response.raise_for_status() return await response.json() - async def _aget(self, path: str, params: dict = {}) -> dict: + async def _get(self, path: str, params: dict = {}) -> dict: async with aiohttp.ClientSession() as session: request = partial( session.get, - self.endpoint_url + path, + self._client.endpoint_url + path, params=params, - headers=self.headers, + headers=self._client.headers, ) - return await self._acheck_http_error(request) + return await self._check_http_error(request) - async def _apost( + async def _post( self, path: str, data: Union[str, aiohttp.FormData] = "{}", @@ -113,81 +103,154 @@ async def _apost( update_tokens: bool = True, ) -> dict: if content_type is None: - if "Content-Type" in self.headers: - self.headers.pop("Content-Type") + if "Content-Type" in self._client.headers: + self._client.headers.pop("Content-Type") else: - self.headers["Content-Type"] = content_type + self._client.headers["Content-Type"] = content_type async with aiohttp.ClientSession() as session: request = partial( session.post, - self.endpoint_url + path, + self._client.endpoint_url + path, data=data, - headers=self.headers, + headers=self._client.headers, ) - return await self._acheck_http_error(request, update_tokens=update_tokens) + return await self._check_http_error(request, update_tokens=update_tokens) - async def _aput(self, path: str, data: str = "{}") -> dict: + async def _put(self, path: str, data: str = "{}") -> dict: async with aiohttp.ClientSession() as session: request = partial( - session.put, self.endpoint_url + path, data=data, headers=self.headers + session.put, + self._client.endpoint_url + path, + data=data, + headers=self._client.headers, ) - return await self._acheck_http_error(request) + return await self._check_http_error(request) - async def _adelete(self, path: str) -> dict: + async def _delete(self, path: str) -> dict: async with aiohttp.ClientSession() as session: request = partial( - session.delete, self.endpoint_url + path, headers=self.headers + session.delete, + self._client.endpoint_url + path, + headers=self._client.headers, ) - return await self._acheck_http_error(request) + return await self._check_http_error(request) - async def _get_access_token(self, refresh_token: str) -> EmoTokens: + async def get_access_token(self, refresh_token: str) -> EmoTokens: payload = {"refresh_token": refresh_token} - response = await self._apost( + response = await self._post( "/oauth/token/refresh", json.dumps(payload), update_tokens=False ) return EmoTokens(**response) async def get_account_info(self) -> EmoAccountInfo: - response = await self._aget("/v1/me") + response = await self._get("/v1/me") return EmoAccountInfo(**response) async def delete_account_info(self) -> EmoAccountInfo: - response = await self._adelete("/v1/me") + response = await self._delete("/v1/me") return EmoAccountInfo(**response) async def get_rooms_list(self) -> EmoRoomInfo: - response = await self._aget("/v1/rooms") + response = await self._get("/v1/rooms") return EmoRoomInfo(**response) + def get_rooms_id(self) -> List[str]: + return self._client.get_rooms_id() + def create_room_client(self, room_id: str): return AsyncRoom(self, room_id) async def get_stamps_list(self) -> EmoStampsInfo: - response = await self._aget("/v1/stamps") + response = await self._get("/v1/stamps") return EmoStampsInfo(**response) async def get_motions_list(self) -> EmoMotionsInfo: - response = await self._aget("/v1/motions") + response = await self._get("/v1/motions") return EmoMotionsInfo(**response) async def get_webhook_setting(self) -> EmoWebhookInfo: - response = await self._aget("/v1/webhook") + response = await self._get("/v1/webhook") return EmoWebhookInfo(**response) async def change_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: payload = {"description": webhook.description, "url": webhook.url} - response = await self._aput("/v1/webhook", json.dumps(payload)) + response = await self._put("/v1/webhook", json.dumps(payload)) return EmoWebhookInfo(**response) async def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: payload = {"events": events} - response = await self._aput("/v1/webhook/events", json.dumps(payload)) + response = await self._put("/v1/webhook/events", json.dumps(payload)) return EmoWebhookInfo(**response) async def delete_webhook_setting(self) -> EmoWebhookInfo: - response = await self._adelete("/v1/webhook") + response = await self._delete("/v1/webhook") return EmoWebhookInfo(**response) + def event( + self, event: str, room_id_list: List[str] = [_DEFAULT_ROOM_ID] + ) -> Callable: + """Webhookの指定のeventが通知されたときに呼び出す関数の登録 + + Example + ----- + 呼び出したい関数にdecorateして登録します:: + + import emo_platform + + client = emo_platform.Client() + + @client.event("message.received") + def test_event_callback(body): + print(body) + + Parameters + ---------- + event : str + 指定するWebhook event。 + + eventの種類は、`こちらのページ `_ から確認できます。 + + room_id_list : List[str], default [""] + 指定したWebhook eventの通知を監視する部屋をidで指定できます。 + + 引数なしだと、全ての部屋を監視します。 + + Raises + ---------- + EmoPlatformError + 関数内部で呼んでいる :func:`get_rooms_id` が例外を出した場合 + あるいは、存在しない部屋idを引数 :attr:`room_id_list` に含めていた場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms + + API呼び出し回数 + :func:`get_rooms_id` を一度も実行していない状態で、 + 引数 :attr:`room_id_list` に部屋idを指定して実行した場合: 1回 + 最大2回(access tokenが切れていた場合) + + 上記以外の場合: 0回 + + """ + + def decorator(func): + + if event not in self._client.webhook_events_cb: + self._client.webhook_events_cb[event] = {} + + if room_id_list != [self._DEFAULT_ROOM_ID]: + if self._client.room_id_list == [self._DEFAULT_ROOM_ID]: + self._client.get_rooms_id() + + for room_id in room_id_list: + if room_id in self._client.room_id_list: + self._client.webhook_events_cb[event][room_id] = func + else: + raise NoRoomError(f"Try to register wrong room id: '{room_id}'") + + return decorator + async def start_webhook_event( self, host: str = "localhost", port: int = 8000, tasks: List[asyncio.Task] = [] ) -> None: @@ -225,7 +288,7 @@ async def main(): queue = asyncio.Queue() @client.event("message.received") - async async def message_callback(body): + async def message_callback(body): await queue.put(body) # Create task you want to execute in parallel @@ -268,7 +331,7 @@ async def main(): """ response = await self.register_webhook_event( - list(self.webhook_events_cb.keys()) + list(self._client.webhook_events_cb.keys()) ) secret_key = response.secret @@ -279,9 +342,9 @@ async def emo_callback( request: Request, body: EmoWebhookBody, background_tasks: BackgroundTasks ): if request.headers.get("x-platform-api-secret") == secret_key: - if body.request_id not in self.request_id_deque: + if body.request_id not in self._client.request_id_deque: try: - event_cb = self.webhook_events_cb[body.event] + event_cb = self._client.webhook_events_cb[body.event] except KeyError: return "fail. no callback associated with the event.", 500 room_id = body.uuid @@ -292,7 +355,7 @@ async def emo_callback( else: return "fail. no callback associated with the room.", 500 background_tasks.add_task(cb_func, body) - self.request_id_deque.append(body.request_id) + self._client.request_id_deque.append(body.request_id) return "success", 200 loop = asyncio.get_event_loop() @@ -308,26 +371,24 @@ def stop_webhook_event(self): self.server.should_exit = True -class AsyncRoom(Room): +class AsyncRoom: def __init__(self, base_client: AsyncClient, room_id: str): self.base_client = base_client self.room_id = room_id async def get_msgs(self, ts: int = None) -> EmoMsgsInfo: params = {"before": ts} if ts else {} - response = await self.base_client._aget( + response = await self.base_client._get( "/v1/rooms/" + self.room_id + "/messages", params=params ) return EmoMsgsInfo(**response) async def get_sensors_list(self) -> EmoSensorsInfo: - response = await self.base_client._aget( - "/v1/rooms/" + self.room_id + "/sensors" - ) + response = await self.base_client._get("/v1/rooms/" + self.room_id + "/sensors") return EmoSensorsInfo(**response) async def get_sensor_values(self, sensor_id: str) -> EmoRoomSensorInfo: - response = await self.base_client._aget( + response = await self.base_client._get( "/v1/rooms/" + self.room_id + "/sensors/" + sensor_id + "/values" ) return EmoRoomSensorInfo(**response) @@ -336,7 +397,7 @@ async def send_audio_msg(self, audio_data_path: str) -> EmoMessageInfo: with open(audio_data_path, "rb") as audio_data: data = aiohttp.FormData() data.add_field("audio", audio_data, content_type="multipart/form-data") - response = await self.base_client._apost( + response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/messages/audio", data=data, content_type=PostContentType.MULTIPART_FORMDATA, @@ -347,7 +408,7 @@ async def send_image(self, image_data_path: str) -> EmoMessageInfo: with open(image_data_path, "rb") as image_data: data = aiohttp.FormData() data.add_field("image", image_data, content_type="multipart/form-data") - response = await self.base_client._apost( + response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/messages/image", data=data, content_type=PostContentType.MULTIPART_FORMDATA, @@ -356,7 +417,7 @@ async def send_image(self, image_data_path: str) -> EmoMessageInfo: async def send_msg(self, msg: str) -> EmoMessageInfo: payload = {"text": msg} - response = await self.base_client._apost( + response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/messages/text", json.dumps(payload) ) return EmoMessageInfo(**response) @@ -367,7 +428,7 @@ async def send_stamp( payload = {"uuid": stamp_id} if msg: payload["text"] = msg - response = await self.base_client._apost( + response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/messages/stamp", json.dumps(payload) ) return EmoMessageInfo(**response) @@ -380,34 +441,34 @@ async def send_original_motion( payload = json.load(f) else: payload = motion_data - response = await self.base_client._apost( + response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/motions", json.dumps(payload) ) return EmoMessageInfo(**response) async def change_led_color(self, color: Color) -> EmoMessageInfo: payload = {"red": color.red, "green": color.green, "blue": color.blue} - response = await self.base_client._apost( + response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/motions/led_color", json.dumps(payload) ) return EmoMessageInfo(**response) async def move_to(self, head: Head) -> EmoMessageInfo: payload = {"angle": head.angle, "vertical_angle": head.vertical_angle} - response = await self.base_client._apost( + response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/motions/move_to", json.dumps(payload) ) return EmoMessageInfo(**response) async def send_motion(self, motion_id: str) -> EmoMessageInfo: payload = {"uuid": motion_id} - response = await self.base_client._apost( + response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/motions/preset", json.dumps(payload) ) return EmoMessageInfo(**response) async def get_emo_settings(self) -> EmoSettingsInfo: - response = await self.base_client._aget( + response = await self.base_client._get( "/v1/rooms/" + self.room_id + "/emo/settings" ) return EmoSettingsInfo(**response) diff --git a/tests/test_api_async.py b/tests/test_api_async.py index b066c9d..af44df0 100644 --- a/tests/test_api_async.py +++ b/tests/test_api_async.py @@ -290,7 +290,7 @@ async def test_http_request_success(self): headers={"Authorization": "Bearer " + self.right_access_token}, ) self.assertEqual( - await client._acheck_http_error(request=request), self.test_account_info + await client._check_http_error(request=request), self.test_account_info ) async def test_http_request_fail(self): @@ -305,7 +305,7 @@ async def test_http_request_fail(self): headers={"Authorization": ""}, ) with self.assertRaises(UnauthorizedError): - await client._acheck_http_error(request=request, update_tokens=False) + await client._check_http_error(request=request, update_tokens=False) async def test_http_request_success_with_retry(self): os.environ["EMO_PLATFORM_API_REFRESH_TOKEN"] = self.right_refresh_token @@ -314,10 +314,10 @@ async def test_http_request_success_with_retry(self): client = Client(self.test_endpoint) async with ClientSession() as session: request = partial( - session.get, self.test_endpoint + "/v1/me", headers=client.headers + session.get, self.test_endpoint + "/v1/me", headers=client._client.headers ) self.assertEqual( - await client._acheck_http_error(request=request), self.test_account_info + await client._check_http_error(request=request), self.test_account_info ) @@ -366,7 +366,7 @@ async def test_register_event(self): async def test_webhook_callback(): return return_val - self.assertEqual(await client.webhook_events_cb["test_event"][""](), return_val) + self.assertEqual(await client._client.webhook_events_cb["test_event"][""](), return_val) return_val = "test_webhook_callback_new" @@ -374,7 +374,7 @@ async def test_webhook_callback(): async def test_webhook_callback_new(): return return_val - self.assertEqual(await client.webhook_events_cb["test_event"][""](), return_val) + self.assertEqual(await client._client.webhook_events_cb["test_event"][""](), return_val) async def test_register_event_with_room_id(self): client = Client(self.test_endpoint) @@ -395,10 +395,10 @@ async def test_webhook_callback_new(): return return_val_new self.assertEqual( - await client.webhook_events_cb["test_event"][old_room_uuid](), return_val + await client._client.webhook_events_cb["test_event"][old_room_uuid](), return_val ) self.assertEqual( - await client.webhook_events_cb["test_event"][new_room_uuid](), + await client._client.webhook_events_cb["test_event"][new_room_uuid](), return_val_new, ) From 1466c83057f48735ef3dc630dd7ba47a9d1a701d Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Tue, 16 Nov 2021 19:02:40 +0900 Subject: [PATCH 05/73] feat: Change process about room --- emo_platform/api.py | 35 +++------- emo_platform/api_async.py | 64 +++++++++++-------- examples/async_version/async_exceptions.py | 9 ++- .../async_version/async_print_room_info.py | 23 ++++--- .../async_version/async_send_data_to_room.py | 10 +-- .../async_version/async_webhook_receiver.py | 5 +- .../async_version/async_webhook_setting.py | 8 +-- tests/test_api.py | 28 ++++---- tests/test_api_async.py | 62 +++++++++--------- 9 files changed, 119 insertions(+), 125 deletions(-) diff --git a/emo_platform/api.py b/emo_platform/api.py index da51241..e6af769 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -144,7 +144,6 @@ def __init__( "Content-Type": PostContentType.APPLICATION_JSON, "Authorization": "Bearer " + self._tm.tokens.access_token, } - self.room_id_list = [self._DEFAULT_ROOM_ID] self.webhook_events_cb: Dict[str, Dict[str, Callable]] = {} self.request_id_deque: deque = deque([], self._MAX_SAVED_REQUEST_ID) @@ -381,15 +380,18 @@ def get_rooms_id(self) -> List[str]: 1回 + 最大2回(access tokenが切れていた場合) """ - result = self._get("/v1/rooms") + + rooms_info = self.get_rooms_list() + return self._get_rooms_id(rooms_info) + + def _get_rooms_id(self, rooms_info: EmoRoomInfo) -> List[str]: try: - room_number = len(result["rooms"]) + room_number = len(rooms_info.rooms) except KeyError: raise NoRoomError("Get no room id.") if room_number == 0: raise NoRoomError("Get no room id.") - rooms_id = [result["rooms"][i]["uuid"] for i in range(room_number)] - self.room_id_list = rooms_id + [self._DEFAULT_ROOM_ID] + rooms_id = [rooms_info.rooms[i].uuid for i in range(room_number)] return rooms_id def create_room_client(self, room_id: str): @@ -657,22 +659,10 @@ def test_event_callback(body): 引数なしだと、全ての部屋を監視します。 - Raises - ---------- - EmoPlatformError - 関数内部で呼んでいる :func:`get_rooms_id` が例外を出した場合 - あるいは、存在しない部屋idを引数 :attr:`room_id_list` に含めていた場合。 - Note ---- - 呼び出しているAPI - https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms - API呼び出し回数 - :func:`get_rooms_id` を一度も実行していない状態で、 - 引数 :attr:`room_id_list` に部屋idを指定して実行した場合: 1回 + 最大2回(access tokenが切れていた場合) - - 上記以外の場合: 0回 + 0回 """ @@ -681,15 +671,8 @@ def decorator(func): if event not in self.webhook_events_cb: self.webhook_events_cb[event] = {} - if room_id_list != [self._DEFAULT_ROOM_ID]: - if self.room_id_list == [self._DEFAULT_ROOM_ID]: - self.get_rooms_id() - for room_id in room_id_list: - if room_id in self.room_id_list: - self.webhook_events_cb[event][room_id] = func - else: - raise NoRoomError(f"Try to register wrong room id: '{room_id}'") + self.webhook_events_cb[event][room_id] = func return decorator diff --git a/emo_platform/api_async.py b/emo_platform/api_async.py index 29e8791..776147f 100644 --- a/emo_platform/api_async.py +++ b/emo_platform/api_async.py @@ -154,8 +154,9 @@ async def get_rooms_list(self) -> EmoRoomInfo: response = await self._get("/v1/rooms") return EmoRoomInfo(**response) - def get_rooms_id(self) -> List[str]: - return self._client.get_rooms_id() + async def get_rooms_id(self) -> List[str]: + rooms_info = await self.get_rooms_list() + return self._client._get_rooms_id(rooms_info) def create_room_client(self, room_id: str): return AsyncRoom(self, room_id) @@ -182,6 +183,38 @@ async def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: response = await self._put("/v1/webhook/events", json.dumps(payload)) return EmoWebhookInfo(**response) + async def create_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + """Webhookの設定の作成 + + Parameters + ---------- + webhook : WebHook + 作成するWebhookの設定。 + + Returns + ------- + webhook_info : EmoWebhookInfo + 作成したWebhookの設定。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/webhook + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + + payload = {"description": webhook.description, "url": webhook.url} + response = await self._post("/v1/webhook", json.dumps(payload)) + return EmoWebhookInfo(**response) + async def delete_webhook_setting(self) -> EmoWebhookInfo: response = await self._delete("/v1/webhook") return EmoWebhookInfo(**response) @@ -197,10 +230,10 @@ def event( import emo_platform - client = emo_platform.Client() + client = emo_platform.AsyncClient() @client.event("message.received") - def test_event_callback(body): + async def test_event_callback(body): print(body) Parameters @@ -215,22 +248,10 @@ def test_event_callback(body): 引数なしだと、全ての部屋を監視します。 - Raises - ---------- - EmoPlatformError - 関数内部で呼んでいる :func:`get_rooms_id` が例外を出した場合 - あるいは、存在しない部屋idを引数 :attr:`room_id_list` に含めていた場合。 - Note ---- - 呼び出しているAPI - https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms - API呼び出し回数 - :func:`get_rooms_id` を一度も実行していない状態で、 - 引数 :attr:`room_id_list` に部屋idを指定して実行した場合: 1回 + 最大2回(access tokenが切れていた場合) - - 上記以外の場合: 0回 + 0回 """ @@ -239,15 +260,8 @@ def decorator(func): if event not in self._client.webhook_events_cb: self._client.webhook_events_cb[event] = {} - if room_id_list != [self._DEFAULT_ROOM_ID]: - if self._client.room_id_list == [self._DEFAULT_ROOM_ID]: - self._client.get_rooms_id() - for room_id in room_id_list: - if room_id in self._client.room_id_list: - self._client.webhook_events_cb[event][room_id] = func - else: - raise NoRoomError(f"Try to register wrong room id: '{room_id}'") + self._client.webhook_events_cb[event][room_id] = func return decorator diff --git a/examples/async_version/async_exceptions.py b/examples/async_version/async_exceptions.py index 46c7974..1abb939 100644 --- a/examples/async_version/async_exceptions.py +++ b/examples/async_version/async_exceptions.py @@ -6,13 +6,12 @@ from emo_platform import AsyncClient, BadRequestError, NotFoundError, RateLimitError client = AsyncClient() -rooms_id_list = client.get_rooms_id() -room = client.create_room_client(rooms_id_list[0]) - async def main(): + rooms_id_list = await client.get_rooms_id() + room = client.create_room_client(rooms_id_list[0]) await no_webhook_setting() - await send_over_sized_msg() + await send_over_sized_msg(room) # await over_rate_limit() ## After calling this method, wait 1 minute until rate limit released. @@ -24,7 +23,7 @@ async def no_webhook_setting(): print(e) -async def send_over_sized_msg(): +async def send_over_sized_msg(room): try: await room.send_msg("あ" * 2000) except BadRequestError as e: diff --git a/examples/async_version/async_print_room_info.py b/examples/async_version/async_print_room_info.py index 0503581..fef5eec 100644 --- a/examples/async_version/async_print_room_info.py +++ b/examples/async_version/async_print_room_info.py @@ -6,19 +6,18 @@ from emo_platform import AsyncClient client = AsyncClient() -rooms_id_list = client.get_rooms_id() -# create room client -room = client.create_room_client(rooms_id_list[0]) - async def main(): - await get_latest_msg() - await get_sensors_list() - await get_sensor_values() - await get_emo_settings() + rooms_id_list = await client.get_rooms_id() + # create room client + room = client.create_room_client(rooms_id_list[0]) + await get_latest_msg(room) + await get_sensors_list(room) + await get_sensor_values(room) + await get_emo_settings(room) -async def get_latest_msg(): +async def get_latest_msg(room): print("\n" + "=" * 20 + " room msgs " + "=" * 20) msgs = await room.get_msgs() msg_latest = msgs.messages[0] @@ -29,12 +28,12 @@ async def get_latest_msg(): print("media:", msg_latest.media) -async def get_sensors_list(): +async def get_sensors_list(room): print("\n" + "=" * 20 + " room sensors list " + "=" * 20) print(await room.get_sensors_list()) -async def get_sensor_values(): +async def get_sensor_values(room): print("\n" + "=" * 20 + " room sensor values " + "=" * 20) sensor_list = await room.get_sensors_list() for sensor in sensor_list.sensors: @@ -47,7 +46,7 @@ async def get_sensor_values(): print("events:", room_sensor_values.events) -async def get_emo_settings(): +async def get_emo_settings(room): print("\n" + "=" * 20 + " room emo settings " + "=" * 20) emo_settings = await room.get_emo_settings() print("nickname:", emo_settings.nickname) diff --git a/examples/async_version/async_send_data_to_room.py b/examples/async_version/async_send_data_to_room.py index da64643..34d6c98 100644 --- a/examples/async_version/async_send_data_to_room.py +++ b/examples/async_version/async_send_data_to_room.py @@ -9,13 +9,13 @@ THIS_FILE_PATH = os.path.abspath(os.path.dirname(__file__)) client = AsyncClient() -rooms_id_list = client.get_rooms_id() -# create room client -room = client.create_room_client(rooms_id_list[0]) - +room = [] async def main(): - pass + global room + rooms_id_list = await client.get_rooms_id() + # create room client + room = client.create_room_client(rooms_id_list[0]) """ Uncomment code block you want to execute. diff --git a/examples/async_version/async_webhook_receiver.py b/examples/async_version/async_webhook_receiver.py index 4a239b8..74dbb71 100644 --- a/examples/async_version/async_webhook_receiver.py +++ b/examples/async_version/async_webhook_receiver.py @@ -6,9 +6,6 @@ from emo_platform import AsyncClient, WebHook client = AsyncClient() -# Please replace "YOUR WEBHOOK URL" with the URL forwarded to http://localhost:8000 -client.create_webhook_setting(WebHook("YOUR WEBHOOK URL")) - async def print_queue(queue): while True: @@ -19,6 +16,8 @@ async def print_queue(queue): async def main(): queue = asyncio.Queue() + # Please replace "YOUR WEBHOOK URL" with the URL forwarded to http://localhost:8000 + await client.create_webhook_setting(WebHook("YOUR WEBHOOK URL")) @client.event("message.received") async def message_callback(body): diff --git a/examples/async_version/async_webhook_setting.py b/examples/async_version/async_webhook_setting.py index e343552..284afe2 100644 --- a/examples/async_version/async_webhook_setting.py +++ b/examples/async_version/async_webhook_setting.py @@ -11,16 +11,16 @@ async def main(): webhook = WebHook("http://localhost:8000", "test") events = ["message.received"] - create_webhook_setting(webhook) + await create_webhook_setting(webhook) await get_webhook_setting() - register_webhook_event(events) + await register_webhook_event(events) await get_webhook_setting() await delete_webhook_setting() -def create_webhook_setting(webhook): +async def create_webhook_setting(webhook): print("\n" + "=" * 20 + " create webhook setting " + "=" * 20) - print(client.create_webhook_setting(webhook)) + print(await client.create_webhook_setting(webhook)) async def get_webhook_setting(): diff --git a/tests/test_api.py b/tests/test_api.py index 9d55305..c58681b 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -11,6 +11,7 @@ from emo_platform import Client from emo_platform.exceptions import NoRoomError, TokenError, UnauthorizedError +from emo_platform.response import RoomInfo, EmoRoomInfo, Listing EMO_PLATFORM_TEST_PATH = os.path.abspath(os.path.dirname(__file__)) TOKEN_FILE = f"{EMO_PLATFORM_TEST_PATH}/../emo_platform/tokens/emo-platform-api.json" @@ -93,8 +94,15 @@ def account_info_callback(request): ) def room_init(self): + test_room_info = { + "uuid":"52b0e129-2512-4696-9d06-8ddb842ba6ce", + "name":"test_room", + "room_type":"test", + "room_members":[] + } self.test_rooms_info = { - "rooms": [{"uuid": "52b0e129-2512-4696-9d06-8ddb842ba6ce"}] + "listing" : {"offset":0, "limit":0, "total":0}, + "rooms" : [test_room_info] } def rooms_info_callback(request): @@ -291,15 +299,13 @@ def setUp(self): def test_get_rooms_id(self): client = Client(self.test_endpoint) - for room_uuid in range(10): - rooms_id = client.get_rooms_id() - for room in self.test_rooms_info["rooms"]: - self.assertTrue(room["uuid"] in rooms_id) - self.test_rooms_info["rooms"].append({"uuid": str(room_uuid)}) + rooms_id = client.get_rooms_id() + for room in self.test_rooms_info["rooms"]: + self.assertTrue(room["uuid"] in rooms_id) def test_get_no_rooms_id(self): client = Client(self.test_endpoint) - self.test_rooms_info = {} + self.test_rooms_info["rooms"] = [] with self.assertRaises(NoRoomError): client.get_rooms_id() @@ -353,14 +359,6 @@ def test_webhook_callback_new(): client.webhook_events_cb["test_event"][new_room_uuid](), return_val_new ) - def test_register_event_with_nonexistent_room_id(self): - client = Client(self.test_endpoint) - with self.assertRaises(NoRoomError): - - @client.event("test_event", ["nonexistent_room_id"]) - def test_webhook_callback(): - pass - class TestWebhookReceive(unittest.TestCase, TestBaseClass): def setUp(self): diff --git a/tests/test_api_async.py b/tests/test_api_async.py index af44df0..57b5f99 100644 --- a/tests/test_api_async.py +++ b/tests/test_api_async.py @@ -114,22 +114,30 @@ async def account_info_callback(request): } def init_room_server(self): + + test_room_info = { + "uuid":"52b0e129-2512-4696-9d06-8ddb842ba6ce", + "name":"test_room", + "room_type":"test", + "room_members":[] + } self.test_rooms_info = { - "rooms": [{"uuid": "52b0e129-2512-4696-9d06-8ddb842ba6ce"}] + "listing" : {"offset":0, "limit":0, "total":0}, + "rooms" : [test_room_info] } - def rooms_info_callback(request): + @self.routes.get("/v1/rooms") + async def rooms_info_callback(request): if request.headers["Authorization"] == "Bearer " + self.right_access_token: - return 200, {}, json.dumps(self.test_rooms_info) + return web.Response( + status=200, + content_type="application/json", + body=json.dumps(self.test_rooms_info), + ) else: - return 401, {}, json.dumps({}) - - self.responses.add_callback( - responses.GET, - self.test_endpoint + "/v1/rooms", - callback=rooms_info_callback, - content_type="application/json", - ) + return web.Response( + status=401, content_type="application/json", body=json.dumps({}) + ) async def aiohttp_server_start(self): self.app = web.Application() @@ -321,10 +329,11 @@ async def test_http_request_success_with_retry(self): ) -class TestGetRoomsId(unittest.TestCase, TestBaseClass): - def setUp(self): +class TestGetRoomsId(unittest.IsolatedAsyncioTestCase, TestBaseClass): + async def asyncSetUp(self): self.init_server() self.init_room_server() + await self.aiohttp_server_start() self.reset_tokens() self.set_tokens() @@ -332,19 +341,20 @@ def setUp(self): self.addCleanup(self.responses.stop) self.addCleanup(self.responses.reset) - def test_get_rooms_id(self): + async def asyncTearDown(self): + await self.aiohttp_server_stop() + + async def test_get_rooms_id(self): client = Client(self.test_endpoint) - for room_uuid in range(10): - rooms_id = client.get_rooms_id() - for room in self.test_rooms_info["rooms"]: - self.assertTrue(room["uuid"] in rooms_id) - self.test_rooms_info["rooms"].append({"uuid": str(room_uuid)}) + rooms_id = await client.get_rooms_id() + for room in self.test_rooms_info["rooms"]: + self.assertTrue(room["uuid"] in rooms_id) - def test_get_no_rooms_id(self): + async def test_get_no_rooms_id(self): client = Client(self.test_endpoint) - self.test_rooms_info = {} + self.test_rooms_info["rooms"] = [] with self.assertRaises(NoRoomError): - client.get_rooms_id() + await client.get_rooms_id() class TestWebhookRegister(unittest.IsolatedAsyncioTestCase, TestBaseClass): @@ -402,14 +412,6 @@ async def test_webhook_callback_new(): return_val_new, ) - async def test_register_event_with_nonexistent_room_id(self): - client = Client(self.test_endpoint) - with self.assertRaises(NoRoomError): - - @client.event("test_event", ["nonexistent_room_id"]) - async def test_webhook_callback(): - pass - class TestWebhookReceive(unittest.IsolatedAsyncioTestCase, TestBaseClass): async def asyncSetUp(self): From 36a076e7aef234f8105e7a76ad00cf107d0da295 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Thu, 18 Nov 2021 11:33:34 +0900 Subject: [PATCH 06/73] feat: Publish Tokens dataclass --- emo_platform/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emo_platform/__init__.py b/emo_platform/__init__.py index 61d9c29..d8c019f 100644 --- a/emo_platform/__init__.py +++ b/emo_platform/__init__.py @@ -10,4 +10,4 @@ UnauthorizedError, UnknownError, ) -from .models import Color, Head, WebHook +from .models import Tokens, Color, Head, WebHook From 2db17c640a9a72541d6a0c9de848d5d8fc4c2813 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Thu, 18 Nov 2021 16:15:17 +0900 Subject: [PATCH 07/73] feat: Create biz client & raise error when using unavaliable method --- emo_platform/__init__.py | 3 +- emo_platform/api.py | 85 +++++++++++++++++++++++++++++++++++++- emo_platform/exceptions.py | 6 +++ 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/emo_platform/__init__.py b/emo_platform/__init__.py index d8c019f..31e21f7 100644 --- a/emo_platform/__init__.py +++ b/emo_platform/__init__.py @@ -1,4 +1,4 @@ -from .api import Client +from .api import Client, bizBasicClient, bizAdvancedClient from .api_async import AsyncClient from .exceptions import ( BadRequestError, @@ -9,5 +9,6 @@ TokenError, UnauthorizedError, UnknownError, + UnavailableError ) from .models import Tokens, Color, Head, WebHook diff --git a/emo_platform/api.py b/emo_platform/api.py index e6af769..1bfa572 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -13,6 +13,7 @@ NoRoomError, TokenError, UnauthorizedError, + UnavailableError, _http_error_handler, ) from emo_platform.models import Color, Head, Tokens, WebHook @@ -133,12 +134,12 @@ class Client: def __init__( self, - endpoint_url: str = _BASE_URL, + endpoint_url: Optional[str] = None, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None, ): self._tm = TokenManager() - self.endpoint_url = endpoint_url + self.endpoint_url = endpoint_url if endpoint_url else self._BASE_URL self.headers: Dict[str, Optional[str]] = { "accept": "*/*", "Content-Type": PostContentType.APPLICATION_JSON, @@ -758,6 +759,67 @@ def emo_callback( uvicorn.run(self.app, host=host, port=port) +class bizClient(Client): + PLAN = "Business" + + def __init__( + self, x_channel_user: str, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None + ): + super().__init__(tokens, token_file_path) + self.headers["X-Channel-User"] = x_channel_user + + def delete_account_info(self) -> None: + raise UnavailableError(self.PLAN) + + # def change_account_info(self) -> EmoAccountInfo: + # # TODO: implement + # pass + + # def get_broadcast_msgs_list(self): + # response = self._get("") + +class bizBasicClient(bizClient): + PLAN = "Business Basic" + + def create_room_client(self, room_id: str): + return bizBasicRoom(self, room_id) + + def get_motions_list(self) -> None: + raise UnavailableError(self.PLAN) + + def get_webhook_setting( + self, + ) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + def change_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + def create_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + def delete_webhook_setting( + self, + ) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + def event( + self, event: str, room_id_list: List[str] = [Client._DEFAULT_ROOM_ID] + ) -> Callable: + raise UnavailableError(self.PLAN) + + def start_webhook_event(self, host: str = "localhost", port: int = 8000) -> None: + raise UnavailableError(self.PLAN) + +class bizAdvancedClient(bizClient): + PLAN = "Business Advanced" + + def create_room_client(self, room_id: str): + return bizAdvancedRoom(self, room_id) + class Room: """部屋固有の各種apiを呼び出すclient @@ -1225,3 +1287,22 @@ def get_emo_settings( response = self.base_client._get("/v1/rooms/" + self.room_id + "/emo/settings") return EmoSettingsInfo(**response) + +class bizBasicRoom(Room): + def get_sensor_values(self, sensor_id: str) -> None: + raise UnavailableError(self.base_client.PLAN) + + def send_original_motion(self, motion_data: Union[str, dict]) -> None: + raise UnavailableError(self.base_client.PLAN) + + def change_led_color(self, color: Color) -> None: + raise UnavailableError(self.base_client.PLAN) + + def move_to(self, head: Head) -> None: + raise UnavailableError(self.base_client.PLAN) + + def send_motion(self, motion_id: str) -> None: + raise UnavailableError(self.base_client.PLAN) + +class bizAdvancedRoom(Room): + pass \ No newline at end of file diff --git a/emo_platform/exceptions.py b/emo_platform/exceptions.py index 8ecbe70..71c7f15 100644 --- a/emo_platform/exceptions.py +++ b/emo_platform/exceptions.py @@ -76,6 +76,12 @@ class TokenError(EmoPlatformError): pass +class UnavailableError(EmoPlatformError): + """現在のプランでは使用できない場合に出るエラー""" + + def __str__(self): + return "You can't use this method in " + self.message + " plan." + def _http_status_to_exception(code): if code == 400: From 068bbc017ac92cf8f89fdd65bbbb0b7702d77346 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Thu, 25 Nov 2021 10:02:47 +0900 Subject: [PATCH 08/73] feat: Implement methods unique to business version --- emo_platform/__init__.py | 4 +-- emo_platform/api.py | 65 ++++++++++++++++++++++++++++++---------- emo_platform/models.py | 15 ++++++++++ emo_platform/response.py | 52 ++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 17 deletions(-) diff --git a/emo_platform/__init__.py b/emo_platform/__init__.py index 31e21f7..3ef6781 100644 --- a/emo_platform/__init__.py +++ b/emo_platform/__init__.py @@ -1,4 +1,4 @@ -from .api import Client, bizBasicClient, bizAdvancedClient +from .api import Client, BizBasicClient, BizAdvancedClient from .api_async import AsyncClient from .exceptions import ( BadRequestError, @@ -11,4 +11,4 @@ UnknownError, UnavailableError ) -from .models import Tokens, Color, Head, WebHook +from .models import Tokens, Color, Head, WebHook, AccountInfo, BroadcastMsg diff --git a/emo_platform/api.py b/emo_platform/api.py index 1bfa572..3b3ea7f 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -16,9 +16,10 @@ UnavailableError, _http_error_handler, ) -from emo_platform.models import Color, Head, Tokens, WebHook +from emo_platform.models import Color, Head, Tokens, WebHook, AccountInfo, BroadcastMsg from emo_platform.response import ( EmoAccountInfo, + EmoBizAccountInfo, EmoMessageInfo, EmoMotionsInfo, EmoMsgsInfo, @@ -30,6 +31,11 @@ EmoTokens, EmoWebhookBody, EmoWebhookInfo, + EmoBroadcastInfoList, + EmoBroadcastInfo, + EmoBroadcastMessage, + EmoPaymentsInfo, + EmoPaymentInfo, ) EMO_PLATFORM_PATH = os.path.abspath(os.path.dirname(__file__)) @@ -275,6 +281,9 @@ def get_access_token(self, refresh_token: str) -> EmoTokens: ) return EmoTokens(**response) + def _get_account_info(self) -> dict: + return self._get("/v1/me") + def get_account_info( self, ) -> EmoAccountInfo: @@ -299,7 +308,7 @@ def get_account_info( """ - response = self._get("/v1/me") + response = self._get_account_info() return EmoAccountInfo(**response) def delete_account_info( @@ -759,7 +768,7 @@ def emo_callback( uvicorn.run(self.app, host=host, port=port) -class bizClient(Client): +class BizClient(Client): PLAN = "Business" def __init__( @@ -768,21 +777,47 @@ def __init__( super().__init__(tokens, token_file_path) self.headers["X-Channel-User"] = x_channel_user + def get_account_info(self) -> EmoBizAccountInfo: + response = self._get_account_info() + return EmoBizAccountInfo(**response) + def delete_account_info(self) -> None: raise UnavailableError(self.PLAN) - # def change_account_info(self) -> EmoAccountInfo: - # # TODO: implement - # pass + def change_account_info(self, acount: AccountInfo) -> EmoBizAccountInfo: + payload = asdict(acount) + response = self._put("/v1/me", json.dumps(payload)) + return EmoBizAccountInfo(**response) + + def get_broadcast_msgs_list(self) -> EmoBroadcastInfoList: + response = self._get("/v1/broadcast_messages") + return EmoBroadcastInfoList(**response) + + def get_broadcast_msg_details(self, message_id: int) -> EmoBroadcastInfo: + response = self._get("/v1/broadcast_messages/" + str(message_id)) + return EmoBroadcastInfo(**response) + + def create_broadcast_msg(self, message: BroadcastMsg) -> EmoBroadcastMessage: + payload = asdict(message) + if message.immediate: + payload.pop("executed_at") + response = self._post("/v1/broadcast_messages", json.dumps(payload)) + return EmoBroadcastMessage(**response) + + def get_payments_info(self) -> EmoPaymentsInfo: + response = self._get("/v1/payments") + return EmoPaymentsInfo(**response) + + def get_payment_info_detail(self, payment_id: int) -> EmoPaymentInfo: + response = self._get("/v1/payments/" + str(payment_id)) + return EmoPaymentInfo(**response) - # def get_broadcast_msgs_list(self): - # response = self._get("") -class bizBasicClient(bizClient): +class BizBasicClient(BizClient): PLAN = "Business Basic" def create_room_client(self, room_id: str): - return bizBasicRoom(self, room_id) + return BizBasicRoom(self, room_id) def get_motions_list(self) -> None: raise UnavailableError(self.PLAN) @@ -814,11 +849,11 @@ def event( def start_webhook_event(self, host: str = "localhost", port: int = 8000) -> None: raise UnavailableError(self.PLAN) -class bizAdvancedClient(bizClient): +class BizAdvancedClient(BizClient): PLAN = "Business Advanced" def create_room_client(self, room_id: str): - return bizAdvancedRoom(self, room_id) + return BizAdvancedRoom(self, room_id) class Room: @@ -1288,7 +1323,7 @@ def get_emo_settings( response = self.base_client._get("/v1/rooms/" + self.room_id + "/emo/settings") return EmoSettingsInfo(**response) -class bizBasicRoom(Room): +class BizBasicRoom(Room): def get_sensor_values(self, sensor_id: str) -> None: raise UnavailableError(self.base_client.PLAN) @@ -1304,5 +1339,5 @@ def move_to(self, head: Head) -> None: def send_motion(self, motion_id: str) -> None: raise UnavailableError(self.base_client.PLAN) -class bizAdvancedRoom(Room): - pass \ No newline at end of file +class BizAdvancedRoom(Room): + pass diff --git a/emo_platform/models.py b/emo_platform/models.py index 5a3988e..6236f9a 100644 --- a/emo_platform/models.py +++ b/emo_platform/models.py @@ -84,3 +84,18 @@ class WebHook: url: str description: str = "" + +@dataclass +class AccountInfo: + name: str + name_furigana: str + organization_name: str + organization_unit_name: str + phone_number: str + +@dataclass +class BroadcastMsg: + title: str + text: str + executed_at: int = 0 + immediate: bool = False \ No newline at end of file diff --git a/emo_platform/response.py b/emo_platform/response.py index c1cec4f..705e153 100644 --- a/emo_platform/response.py +++ b/emo_platform/response.py @@ -10,6 +10,15 @@ class EmoAccountInfo(BaseModel): uuid: str plan: str +class EmoBizAccountInfo(BaseModel): + account_id: int + name: str + name_furigana: str + email: str + organization_name: str + organization_unit_name: str + phone_number: str + plan: str class EmoTokens(BaseModel): access_token: str @@ -127,6 +136,49 @@ class EmoSettingsInfo(BaseModel): timezone: str zip_code: str +class EmoBroadcastMessage(BaseModel): + id: int + channel_uuid: str + title: str + text: str + executed_at: int + finished: bool + success: bool + failed: bool + +class EmoBroadcastMessageDetail(BaseModel): + room_uuid: str + room_name: str + success: bool + status_code: int + description: str + executed_at: int + +class EmoBroadcastInfoList(BaseModel): + listing: Listing + messages: List[EmoBroadcastMessage] + +class EmoBroadcastInfo(BaseModel): + message: EmoBroadcastMessage + details: List[EmoBroadcastMessageDetail] + +class EmoPaymentInfo(BaseModel): + id: int + account_id: int + year: int + month: int + plan: str + payment_method: str + amount: int + currency: str + due_date: int + paid: bool + created_at: int + updated_at: int + +class EmoPaymentsInfo(BaseModel): + listing: Listing + payments: List[EmoPaymentInfo] class EmoKind(BaseModel): kind: str From fbba8537f425945faaeb8932f50408fe449aba27 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Fri, 3 Dec 2021 17:02:39 +0900 Subject: [PATCH 09/73] fix: Give args to TokenManger class --- emo_platform/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emo_platform/api.py b/emo_platform/api.py index 3b3ea7f..eb83415 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -144,7 +144,7 @@ def __init__( tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None, ): - self._tm = TokenManager() + self._tm = TokenManager(tokens=tokens, token_file_path=token_file_path) self.endpoint_url = endpoint_url if endpoint_url else self._BASE_URL self.headers: Dict[str, Optional[str]] = { "accept": "*/*", From 58fc8be7df6609c827c9be49358fb1ecbcbaa385 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Tue, 7 Dec 2021 16:35:11 +0900 Subject: [PATCH 10/73] feat: Implement biz async client --- emo_platform/__init__.py | 2 +- emo_platform/api_async.py | 120 +++++++++++++++++++++++++++++++++++++- 2 files changed, 119 insertions(+), 3 deletions(-) diff --git a/emo_platform/__init__.py b/emo_platform/__init__.py index 3ef6781..b7e2d40 100644 --- a/emo_platform/__init__.py +++ b/emo_platform/__init__.py @@ -1,5 +1,5 @@ from .api import Client, BizBasicClient, BizAdvancedClient -from .api_async import AsyncClient +from .api_async import AsyncClient, BizBasicAsyncClient, BizAdvancedAsyncClient from .exceptions import ( BadRequestError, EmoPlatformError, diff --git a/emo_platform/api_async.py b/emo_platform/api_async.py index 776147f..ebc3089 100644 --- a/emo_platform/api_async.py +++ b/emo_platform/api_async.py @@ -1,5 +1,6 @@ import asyncio import json +from dataclasses import asdict from functools import partial from typing import Callable, List, Optional, Union @@ -12,9 +13,10 @@ NoRoomError, TokenError, UnauthorizedError, + UnavailableError, _aiohttp_error_handler, ) -from emo_platform.models import Color, Head, Tokens, WebHook +from emo_platform.models import Color, Head, Tokens, WebHook, AccountInfo, BroadcastMsg from emo_platform.response import ( EmoAccountInfo, EmoMessageInfo, @@ -28,6 +30,12 @@ EmoTokens, EmoWebhookBody, EmoWebhookInfo, + EmoBizAccountInfo, + EmoBroadcastInfoList, + EmoBroadcastInfo, + EmoBroadcastMessage, + EmoPaymentsInfo, + EmoPaymentInfo ) @@ -142,8 +150,11 @@ async def get_access_token(self, refresh_token: str) -> EmoTokens: ) return EmoTokens(**response) + async def _get_account_info(self) -> dict: + return await self._get("/v1/me") + async def get_account_info(self) -> EmoAccountInfo: - response = await self._get("/v1/me") + response = await self._get_account_info() return EmoAccountInfo(**response) async def delete_account_info(self) -> EmoAccountInfo: @@ -384,6 +395,92 @@ async def emo_callback( def stop_webhook_event(self): self.server.should_exit = True +class BizAsyncClient(AsyncClient): + PLAN = "Business" + + def __init__( + self, x_channel_user: str, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None + ): + super().__init__(tokens, token_file_path) + self._client.headers["X-Channel-User"] = x_channel_user + + async def get_account_info(self) -> EmoBizAccountInfo: + response = await self._get_account_info() + return EmoBizAccountInfo(**response) + + async def delete_account_info(self) -> None: + raise UnavailableError(self.PLAN) + + async def change_account_info(self, acount: AccountInfo) -> EmoBizAccountInfo: + payload = asdict(acount) + response = await self._put("/v1/me", json.dumps(payload)) + return EmoBizAccountInfo(**response) + + async def get_broadcast_msgs_list(self) -> EmoBroadcastInfoList: + response = await self._get("/v1/broadcast_messages") + return EmoBroadcastInfoList(**response) + + async def get_broadcast_msg_details(self, message_id: int) -> EmoBroadcastInfo: + response = await self._get("/v1/broadcast_messages/" + str(message_id)) + return EmoBroadcastInfo(**response) + + async def create_broadcast_msg(self, message: BroadcastMsg) -> EmoBroadcastMessage: + payload = asdict(message) + if message.immediate: + payload.pop("executed_at") + response = await self._post("/v1/broadcast_messages", json.dumps(payload)) + return EmoBroadcastMessage(**response) + + async def get_payments_info(self) -> EmoPaymentsInfo: + response = await self._get("/v1/payments") + return EmoPaymentsInfo(**response) + + async def get_payment_info_detail(self, payment_id: int) -> EmoPaymentInfo: + response = await self._get("/v1/payments/" + str(payment_id)) + return EmoPaymentInfo(**response) + +class BizBasicAsyncClient(BizAsyncClient): + PLAN = "Business Basic" + + def create_room_client(self, room_id: str): + return BizBasicAsyncRoom(self, room_id) + + async def get_motions_list(self) -> None: + raise UnavailableError(self.PLAN) + + async def get_webhook_setting( + self, + ) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + async def change_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + async def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + async def create_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + async def delete_webhook_setting( + self, + ) -> EmoWebhookInfo: + raise UnavailableError(self.PLAN) + + def event( + self, event: str, room_id_list: List[str] = [Client._DEFAULT_ROOM_ID] + ) -> Callable: + raise UnavailableError(self.PLAN) + + async def start_webhook_event(self, host: str = "localhost", port: int = 8000) -> None: + raise UnavailableError(self.PLAN) + +class BizAdvancedAsyncClient(BizAsyncClient): + PLAN = "Business Advanced" + + def create_room_client(self, room_id: str): + return BizAdvancedAsyncRoom(self, room_id) + class AsyncRoom: def __init__(self, base_client: AsyncClient, room_id: str): @@ -486,3 +583,22 @@ async def get_emo_settings(self) -> EmoSettingsInfo: "/v1/rooms/" + self.room_id + "/emo/settings" ) return EmoSettingsInfo(**response) + +class BizBasicAsyncRoom(AsyncRoom): + async def get_sensor_values(self, sensor_id: str) -> None: + raise UnavailableError(self.base_client.PLAN) + + async def send_original_motion(self, motion_data: Union[str, dict]) -> None: + raise UnavailableError(self.base_client.PLAN) + + async def change_led_color(self, color: Color) -> None: + raise UnavailableError(self.base_client.PLAN) + + async def move_to(self, head: Head) -> None: + raise UnavailableError(self.base_client.PLAN) + + async def send_motion(self, motion_id: str) -> None: + raise UnavailableError(self.base_client.PLAN) + +class BizAdvancedAsyncRoom(AsyncRoom): + pass From 39b3ea68751443cfaa9d5572b1b37029a6fa1a5d Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Tue, 7 Dec 2021 16:39:42 +0900 Subject: [PATCH 11/73] style: Format python code --- emo_platform/__init__.py | 8 ++++---- emo_platform/api.py | 21 ++++++++++++++------- emo_platform/api_async.py | 29 +++++++++++++++++++---------- emo_platform/exceptions.py | 1 + emo_platform/models.py | 4 +++- emo_platform/response.py | 9 +++++++++ 6 files changed, 50 insertions(+), 22 deletions(-) diff --git a/emo_platform/__init__.py b/emo_platform/__init__.py index b7e2d40..d5e2493 100644 --- a/emo_platform/__init__.py +++ b/emo_platform/__init__.py @@ -1,5 +1,5 @@ -from .api import Client, BizBasicClient, BizAdvancedClient -from .api_async import AsyncClient, BizBasicAsyncClient, BizAdvancedAsyncClient +from .api import BizAdvancedClient, BizBasicClient, Client +from .api_async import AsyncClient, BizAdvancedAsyncClient, BizBasicAsyncClient from .exceptions import ( BadRequestError, EmoPlatformError, @@ -8,7 +8,7 @@ RateLimitError, TokenError, UnauthorizedError, + UnavailableError, UnknownError, - UnavailableError ) -from .models import Tokens, Color, Head, WebHook, AccountInfo, BroadcastMsg +from .models import AccountInfo, BroadcastMsg, Color, Head, Tokens, WebHook diff --git a/emo_platform/api.py b/emo_platform/api.py index eb83415..7035490 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -16,13 +16,18 @@ UnavailableError, _http_error_handler, ) -from emo_platform.models import Color, Head, Tokens, WebHook, AccountInfo, BroadcastMsg +from emo_platform.models import AccountInfo, BroadcastMsg, Color, Head, Tokens, WebHook from emo_platform.response import ( EmoAccountInfo, EmoBizAccountInfo, + EmoBroadcastInfo, + EmoBroadcastInfoList, + EmoBroadcastMessage, EmoMessageInfo, EmoMotionsInfo, EmoMsgsInfo, + EmoPaymentInfo, + EmoPaymentsInfo, EmoRoomInfo, EmoRoomSensorInfo, EmoSensorsInfo, @@ -31,11 +36,6 @@ EmoTokens, EmoWebhookBody, EmoWebhookInfo, - EmoBroadcastInfoList, - EmoBroadcastInfo, - EmoBroadcastMessage, - EmoPaymentsInfo, - EmoPaymentInfo, ) EMO_PLATFORM_PATH = os.path.abspath(os.path.dirname(__file__)) @@ -768,11 +768,15 @@ def emo_callback( uvicorn.run(self.app, host=host, port=port) + class BizClient(Client): PLAN = "Business" def __init__( - self, x_channel_user: str, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None + self, + x_channel_user: str, + tokens: Optional[Tokens] = None, + token_file_path: Optional[str] = None, ): super().__init__(tokens, token_file_path) self.headers["X-Channel-User"] = x_channel_user @@ -849,6 +853,7 @@ def event( def start_webhook_event(self, host: str = "localhost", port: int = 8000) -> None: raise UnavailableError(self.PLAN) + class BizAdvancedClient(BizClient): PLAN = "Business Advanced" @@ -1323,6 +1328,7 @@ def get_emo_settings( response = self.base_client._get("/v1/rooms/" + self.room_id + "/emo/settings") return EmoSettingsInfo(**response) + class BizBasicRoom(Room): def get_sensor_values(self, sensor_id: str) -> None: raise UnavailableError(self.base_client.PLAN) @@ -1339,5 +1345,6 @@ def move_to(self, head: Head) -> None: def send_motion(self, motion_id: str) -> None: raise UnavailableError(self.base_client.PLAN) + class BizAdvancedRoom(Room): pass diff --git a/emo_platform/api_async.py b/emo_platform/api_async.py index ebc3089..252377c 100644 --- a/emo_platform/api_async.py +++ b/emo_platform/api_async.py @@ -10,18 +10,23 @@ from emo_platform.api import Client, PostContentType from emo_platform.exceptions import ( - NoRoomError, TokenError, UnauthorizedError, UnavailableError, _aiohttp_error_handler, ) -from emo_platform.models import Color, Head, Tokens, WebHook, AccountInfo, BroadcastMsg +from emo_platform.models import AccountInfo, BroadcastMsg, Color, Head, Tokens, WebHook from emo_platform.response import ( EmoAccountInfo, + EmoBizAccountInfo, + EmoBroadcastInfo, + EmoBroadcastInfoList, + EmoBroadcastMessage, EmoMessageInfo, EmoMotionsInfo, EmoMsgsInfo, + EmoPaymentInfo, + EmoPaymentsInfo, EmoRoomInfo, EmoRoomSensorInfo, EmoSensorsInfo, @@ -30,12 +35,6 @@ EmoTokens, EmoWebhookBody, EmoWebhookInfo, - EmoBizAccountInfo, - EmoBroadcastInfoList, - EmoBroadcastInfo, - EmoBroadcastMessage, - EmoPaymentsInfo, - EmoPaymentInfo ) @@ -395,11 +394,15 @@ async def emo_callback( def stop_webhook_event(self): self.server.should_exit = True + class BizAsyncClient(AsyncClient): PLAN = "Business" def __init__( - self, x_channel_user: str, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None + self, + x_channel_user: str, + tokens: Optional[Tokens] = None, + token_file_path: Optional[str] = None, ): super().__init__(tokens, token_file_path) self._client.headers["X-Channel-User"] = x_channel_user @@ -439,6 +442,7 @@ async def get_payment_info_detail(self, payment_id: int) -> EmoPaymentInfo: response = await self._get("/v1/payments/" + str(payment_id)) return EmoPaymentInfo(**response) + class BizBasicAsyncClient(BizAsyncClient): PLAN = "Business Basic" @@ -472,9 +476,12 @@ def event( ) -> Callable: raise UnavailableError(self.PLAN) - async def start_webhook_event(self, host: str = "localhost", port: int = 8000) -> None: + async def start_webhook_event( + self, host: str = "localhost", port: int = 8000 + ) -> None: raise UnavailableError(self.PLAN) + class BizAdvancedAsyncClient(BizAsyncClient): PLAN = "Business Advanced" @@ -584,6 +591,7 @@ async def get_emo_settings(self) -> EmoSettingsInfo: ) return EmoSettingsInfo(**response) + class BizBasicAsyncRoom(AsyncRoom): async def get_sensor_values(self, sensor_id: str) -> None: raise UnavailableError(self.base_client.PLAN) @@ -600,5 +608,6 @@ async def move_to(self, head: Head) -> None: async def send_motion(self, motion_id: str) -> None: raise UnavailableError(self.base_client.PLAN) + class BizAdvancedAsyncRoom(AsyncRoom): pass diff --git a/emo_platform/exceptions.py b/emo_platform/exceptions.py index 71c7f15..36f048f 100644 --- a/emo_platform/exceptions.py +++ b/emo_platform/exceptions.py @@ -76,6 +76,7 @@ class TokenError(EmoPlatformError): pass + class UnavailableError(EmoPlatformError): """現在のプランでは使用できない場合に出るエラー""" diff --git a/emo_platform/models.py b/emo_platform/models.py index 6236f9a..436d667 100644 --- a/emo_platform/models.py +++ b/emo_platform/models.py @@ -85,6 +85,7 @@ class WebHook: url: str description: str = "" + @dataclass class AccountInfo: name: str @@ -93,9 +94,10 @@ class AccountInfo: organization_unit_name: str phone_number: str + @dataclass class BroadcastMsg: title: str text: str executed_at: int = 0 - immediate: bool = False \ No newline at end of file + immediate: bool = False diff --git a/emo_platform/response.py b/emo_platform/response.py index 705e153..0c7860c 100644 --- a/emo_platform/response.py +++ b/emo_platform/response.py @@ -10,6 +10,7 @@ class EmoAccountInfo(BaseModel): uuid: str plan: str + class EmoBizAccountInfo(BaseModel): account_id: int name: str @@ -20,6 +21,7 @@ class EmoBizAccountInfo(BaseModel): phone_number: str plan: str + class EmoTokens(BaseModel): access_token: str refresh_token: str @@ -136,6 +138,7 @@ class EmoSettingsInfo(BaseModel): timezone: str zip_code: str + class EmoBroadcastMessage(BaseModel): id: int channel_uuid: str @@ -146,6 +149,7 @@ class EmoBroadcastMessage(BaseModel): success: bool failed: bool + class EmoBroadcastMessageDetail(BaseModel): room_uuid: str room_name: str @@ -154,14 +158,17 @@ class EmoBroadcastMessageDetail(BaseModel): description: str executed_at: int + class EmoBroadcastInfoList(BaseModel): listing: Listing messages: List[EmoBroadcastMessage] + class EmoBroadcastInfo(BaseModel): message: EmoBroadcastMessage details: List[EmoBroadcastMessageDetail] + class EmoPaymentInfo(BaseModel): id: int account_id: int @@ -176,10 +183,12 @@ class EmoPaymentInfo(BaseModel): created_at: int updated_at: int + class EmoPaymentsInfo(BaseModel): listing: Listing payments: List[EmoPaymentInfo] + class EmoKind(BaseModel): kind: str From ffdb6df5409cd8d267d4d738d6559148ee6fcf56 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Tue, 7 Dec 2021 17:25:04 +0900 Subject: [PATCH 12/73] style: Check mypy --- emo_platform/api.py | 40 ++++++++++++++++++++---------------- emo_platform/api_async.py | 43 +++++++++++++++++++++------------------ 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/emo_platform/api.py b/emo_platform/api.py index 7035490..7401d8e 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -3,7 +3,7 @@ from collections import deque from dataclasses import asdict from functools import partial -from typing import Callable, Dict, List, Optional, Union +from typing import Callable, Dict, List, NoReturn, Optional, Union import requests import uvicorn # type: ignore @@ -137,6 +137,7 @@ class Client: _BASE_URL = "https://platform-api.bocco.me" _DEFAULT_ROOM_ID = "" _MAX_SAVED_REQUEST_ID = 10 + PLAN = "Personal" def __init__( self, @@ -775,17 +776,20 @@ class BizClient(Client): def __init__( self, x_channel_user: str, + endpoint_url: Optional[str] = None, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None, ): - super().__init__(tokens, token_file_path) + super().__init__( + endpoint_url=endpoint_url, tokens=tokens, token_file_path=token_file_path + ) self.headers["X-Channel-User"] = x_channel_user - def get_account_info(self) -> EmoBizAccountInfo: + def get_account_info(self) -> EmoBizAccountInfo: # type: ignore[override] response = self._get_account_info() return EmoBizAccountInfo(**response) - def delete_account_info(self) -> None: + def delete_account_info(self) -> NoReturn: raise UnavailableError(self.PLAN) def change_account_info(self, acount: AccountInfo) -> EmoBizAccountInfo: @@ -823,34 +827,36 @@ class BizBasicClient(BizClient): def create_room_client(self, room_id: str): return BizBasicRoom(self, room_id) - def get_motions_list(self) -> None: + def get_motions_list(self) -> NoReturn: raise UnavailableError(self.PLAN) def get_webhook_setting( self, - ) -> EmoWebhookInfo: + ) -> NoReturn: raise UnavailableError(self.PLAN) - def change_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + def change_webhook_setting(self, webhook: WebHook) -> NoReturn: raise UnavailableError(self.PLAN) - def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: + def register_webhook_event(self, events: List[str]) -> NoReturn: raise UnavailableError(self.PLAN) - def create_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + def create_webhook_setting(self, webhook: WebHook) -> NoReturn: raise UnavailableError(self.PLAN) def delete_webhook_setting( self, - ) -> EmoWebhookInfo: + ) -> NoReturn: raise UnavailableError(self.PLAN) def event( self, event: str, room_id_list: List[str] = [Client._DEFAULT_ROOM_ID] - ) -> Callable: + ) -> NoReturn: raise UnavailableError(self.PLAN) - def start_webhook_event(self, host: str = "localhost", port: int = 8000) -> None: + def start_webhook_event( + self, host: str = "localhost", port: int = 8000 + ) -> NoReturn: raise UnavailableError(self.PLAN) @@ -1330,19 +1336,19 @@ def get_emo_settings( class BizBasicRoom(Room): - def get_sensor_values(self, sensor_id: str) -> None: + def get_sensor_values(self, sensor_id: str) -> NoReturn: raise UnavailableError(self.base_client.PLAN) - def send_original_motion(self, motion_data: Union[str, dict]) -> None: + def send_original_motion(self, motion_data: Union[str, dict]) -> NoReturn: raise UnavailableError(self.base_client.PLAN) - def change_led_color(self, color: Color) -> None: + def change_led_color(self, color: Color) -> NoReturn: raise UnavailableError(self.base_client.PLAN) - def move_to(self, head: Head) -> None: + def move_to(self, head: Head) -> NoReturn: raise UnavailableError(self.base_client.PLAN) - def send_motion(self, motion_id: str) -> None: + def send_motion(self, motion_id: str) -> NoReturn: raise UnavailableError(self.base_client.PLAN) diff --git a/emo_platform/api_async.py b/emo_platform/api_async.py index 252377c..f4209a0 100644 --- a/emo_platform/api_async.py +++ b/emo_platform/api_async.py @@ -2,7 +2,7 @@ import json from dataclasses import asdict from functools import partial -from typing import Callable, List, Optional, Union +from typing import Callable, List, NoReturn, Optional, Union import aiohttp import uvicorn # type: ignore @@ -39,13 +39,13 @@ class AsyncClient: - _BASE_URL = Client._BASE_URL _DEFAULT_ROOM_ID = Client._DEFAULT_ROOM_ID _MAX_SAVED_REQUEST_ID = Client._MAX_SAVED_REQUEST_ID + PLAN = "Personal" def __init__( self, - endpoint_url: str = _BASE_URL, + endpoint_url: Optional[str] = None, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None, ): @@ -401,17 +401,20 @@ class BizAsyncClient(AsyncClient): def __init__( self, x_channel_user: str, + endpoint_url: Optional[str] = None, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None, ): - super().__init__(tokens, token_file_path) + super().__init__( + endpoint_url=endpoint_url, tokens=tokens, token_file_path=token_file_path + ) self._client.headers["X-Channel-User"] = x_channel_user - async def get_account_info(self) -> EmoBizAccountInfo: + async def get_account_info(self) -> EmoBizAccountInfo: # type: ignore[override] response = await self._get_account_info() return EmoBizAccountInfo(**response) - async def delete_account_info(self) -> None: + async def delete_account_info(self) -> NoReturn: raise UnavailableError(self.PLAN) async def change_account_info(self, acount: AccountInfo) -> EmoBizAccountInfo: @@ -449,36 +452,36 @@ class BizBasicAsyncClient(BizAsyncClient): def create_room_client(self, room_id: str): return BizBasicAsyncRoom(self, room_id) - async def get_motions_list(self) -> None: + async def get_motions_list(self) -> NoReturn: raise UnavailableError(self.PLAN) async def get_webhook_setting( self, - ) -> EmoWebhookInfo: + ) -> NoReturn: raise UnavailableError(self.PLAN) - async def change_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + async def change_webhook_setting(self, webhook: WebHook) -> NoReturn: raise UnavailableError(self.PLAN) - async def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: + async def register_webhook_event(self, events: List[str]) -> NoReturn: raise UnavailableError(self.PLAN) - async def create_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + async def create_webhook_setting(self, webhook: WebHook) -> NoReturn: raise UnavailableError(self.PLAN) async def delete_webhook_setting( self, - ) -> EmoWebhookInfo: + ) -> NoReturn: raise UnavailableError(self.PLAN) def event( self, event: str, room_id_list: List[str] = [Client._DEFAULT_ROOM_ID] - ) -> Callable: + ) -> NoReturn: raise UnavailableError(self.PLAN) async def start_webhook_event( - self, host: str = "localhost", port: int = 8000 - ) -> None: + self, host: str = "localhost", port: int = 8000, tasks: List[asyncio.Task] = [] + ) -> NoReturn: raise UnavailableError(self.PLAN) @@ -593,19 +596,19 @@ async def get_emo_settings(self) -> EmoSettingsInfo: class BizBasicAsyncRoom(AsyncRoom): - async def get_sensor_values(self, sensor_id: str) -> None: + async def get_sensor_values(self, sensor_id: str) -> NoReturn: raise UnavailableError(self.base_client.PLAN) - async def send_original_motion(self, motion_data: Union[str, dict]) -> None: + async def send_original_motion(self, motion_data: Union[str, dict]) -> NoReturn: raise UnavailableError(self.base_client.PLAN) - async def change_led_color(self, color: Color) -> None: + async def change_led_color(self, color: Color) -> NoReturn: raise UnavailableError(self.base_client.PLAN) - async def move_to(self, head: Head) -> None: + async def move_to(self, head: Head) -> NoReturn: raise UnavailableError(self.base_client.PLAN) - async def send_motion(self, motion_id: str) -> None: + async def send_motion(self, motion_id: str) -> NoReturn: raise UnavailableError(self.base_client.PLAN) From c8a6dda298bcf859e9525cff0ea1af1bba08c0d3 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Mon, 13 Dec 2021 18:33:18 +0900 Subject: [PATCH 13/73] style: Fix docstring in api.py --- emo_platform/api.py | 599 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 566 insertions(+), 33 deletions(-) diff --git a/emo_platform/api.py b/emo_platform/api.py index 7401d8e..3deaa06 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -42,8 +42,6 @@ class PostContentType: - """POSTするデータの種類""" - APPLICATION_JSON = "application/json" MULTIPART_FORMDATA = None @@ -134,6 +132,42 @@ def save_tokens(self) -> None: class Client: + """各種apiを呼び出す同期版のclient(Personal版) + + Parameters + ---------- + endpoint_url : str, default https://platform-api.bocco.me + BOCCO emo platform apiにアクセスするためのendpoint + tokens : Tokens, default None + refresh token及びaccess tokenを指定します。 + 指定しない場合は、環境変数に設定されているあるいはこのpkg内のファイル(emo-platform-api.json)に保存されているトークンが使用されます。 + token_file_path : Optional[str], default None + refresh token及びaccess tokenを保存するファイルのパス。 + 指定しない場合は、このpkg内のディレクトリに保存されます。 + 指定したパスには、以下の2種類のファイルが生成されます。 + emo-platform-api.json + 最新のトークンを保存するファイル。 + emo-platform-api_previous.json + 現在、環境変数として設定されているトークンが記録されたファイル。 + 前回から更新があったかを確認するために使用されます。 + 更新があった場合は、emo-platform-api.jsonに保存されているトークンが上書きされます。 + Raises + ---------- + TokenError + refresh tokenあるいはaccess tokenが環境変数として設定されていない場合。 + 引数tokensにトークンを指定している時は出ません。 + + Note + ---- + 各メソッドの実行時にaccess tokenの期限が切れていた場合 + emo-platform-api.jsonに保存されているrefresh tokenを使用して自動的にaccess tokenが更新されます。 + その際にAPI呼び出しが1回行われます。 + + Business版をお使いの方へ + このクラスは使用せずに、継承先である :class:`BizBasicClient` あるいは :class:`BizAdvancedClient` をお使いください。 + + """ + _BASE_URL = "https://platform-api.bocco.me" _DEFAULT_ROOM_ID = "" _MAX_SAVED_REQUEST_ID = 10 @@ -162,15 +196,15 @@ def tm(self): def update_tokens(self) -> None: """トークンの更新と保存 - jsonファイルに保存されているもしくは環境変数として設定されているrefresh tokenを用いて、 + jsonファイルに保存されているrefresh tokenを用いて、 refresh tokenとaccess tokenを更新、jsonファイルに保存します。 access tokenが切れると自動で呼び出されるため、基本的に外部から使用することはありません。 Raises ---------- - NoRefreshTokenError - refresh tokenが設定されていない、もしくは間違っている場合。 + TokenError + refresh tokenが間違っている場合。 Note ---- @@ -178,7 +212,7 @@ def update_tokens(self) -> None: https://platform-api.bocco.me/dashboard/api-docs#post-/oauth/token/refresh API呼び出し回数 - 最大2回 + 1回 """ try: @@ -305,7 +339,7 @@ def get_account_info( https://platform-api.bocco.me/dashboard/api-docs#get-/v1/me API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -334,7 +368,7 @@ def delete_account_info( https://platform-api.bocco.me/dashboard/api-docs#delete-/v1/me API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -361,7 +395,7 @@ def get_rooms_list(self) -> EmoRoomInfo: https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -388,7 +422,7 @@ def get_rooms_id(self) -> List[str]: https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -448,7 +482,7 @@ def get_stamps_list( https://platform-api.bocco.me/dashboard/api-docs#get-/v1/stamps API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -475,7 +509,7 @@ def get_motions_list( https://platform-api.bocco.me/dashboard/api-docs#get-/v1/motions API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -503,7 +537,7 @@ def get_webhook_setting( https://platform-api.bocco.me/dashboard/api-docs#get-/v1/webhook API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -535,7 +569,7 @@ def change_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: https://platform-api.bocco.me/dashboard/api-docs#put-/v1/webhook API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -572,7 +606,7 @@ def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: https://platform-api.bocco.me/dashboard/api-docs#put-/v1/webhook/events API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -604,7 +638,7 @@ def create_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: https://platform-api.bocco.me/dashboard/api-docs#post-/v1/webhook API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -634,7 +668,7 @@ def delete_webhook_setting( https://platform-api.bocco.me/dashboard/api-docs#delete-/v1/webhook API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -704,7 +738,7 @@ def start_webhook_event(self, host: str = "localhost", port: int = 8000) -> None Example ----- - この関数は、bloking処理になっている点に注意してください:: + この関数は、blocking処理になっている点に注意してください:: import emo_platform @@ -737,7 +771,7 @@ def test_event_callback(body): https://platform-api.bocco.me/dashboard/api-docs#put-/v1/webhook/events API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -771,11 +805,19 @@ def emo_callback( class BizClient(Client): + """各種apiを呼び出す同期版のclient(Business版) + + Note + ---- + 使用上の注意 + このクラスは使用せずに、継承先である :class:`BizBasicClient` あるいは :class:`BizAdvancedClient` をお使いください。 + """ + PLAN = "Business" def __init__( self, - x_channel_user: str, + api_key: str, endpoint_url: Optional[str] = None, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None, @@ -783,29 +825,172 @@ def __init__( super().__init__( endpoint_url=endpoint_url, tokens=tokens, token_file_path=token_file_path ) - self.headers["X-Channel-User"] = x_channel_user + self.headers["X-Channel-User"] = api_key def get_account_info(self) -> EmoBizAccountInfo: # type: ignore[override] + """アカウント情報の取得 + + Returns + ------- + account_info : EmoBizAccountInfo + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + Personal版とBusiness版での違い + 返り値の型が異なるので注意してください。 + + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/me + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = self._get_account_info() return EmoBizAccountInfo(**response) def delete_account_info(self) -> NoReturn: + """アカウント情報の取得 + + Business版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + Note + ---- + Personal版とBusiness版での違い + Business版では使用できません。 + + """ + raise UnavailableError(self.PLAN) def change_account_info(self, acount: AccountInfo) -> EmoBizAccountInfo: + """アカウント情報の編集 + + Parameters + ---------- + account : AccountInfo + 新たなアカウント情報。 + + Returns + ------- + account_info : EmoBizAccountInfo + 編集後のアカウント情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPUTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#put-/v1/me + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = asdict(acount) response = self._put("/v1/me", json.dumps(payload)) return EmoBizAccountInfo(**response) def get_broadcast_msgs_list(self) -> EmoBroadcastInfoList: + """配信メッセージの一覧の取得 + + Returns + ------- + broadcast_info_list : EmoBroadcastInfoList + 配信メッセージの一覧。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/broadcast_messages + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = self._get("/v1/broadcast_messages") return EmoBroadcastInfoList(**response) def get_broadcast_msg_details(self, message_id: int) -> EmoBroadcastInfo: + """配信メッセージの詳細の取得 + + Parameters + ---------- + message_id : int + 詳細を取得したい配信メッセージのid + + Returns + ------- + broadcast_info_list : EmoBroadcastInfo + 配信メッセージの詳細。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/broadcast_messages/-broadcast_message_id- + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = self._get("/v1/broadcast_messages/" + str(message_id)) return EmoBroadcastInfo(**response) def create_broadcast_msg(self, message: BroadcastMsg) -> EmoBroadcastMessage: + """配信メッセージの新規作成 + + Parameters + ---------- + message : BroadcastMsg + 新規に作成する配信メッセージ。 + + Returns + ------- + broadcast_msg : EmoBroadcastMessage + 新規に作成した配信メッセージの内容。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/broadcast_messages + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = asdict(message) if message.immediate: payload.pop("executed_at") @@ -813,57 +998,326 @@ def create_broadcast_msg(self, message: BroadcastMsg) -> EmoBroadcastMessage: return EmoBroadcastMessage(**response) def get_payments_info(self) -> EmoPaymentsInfo: + """支払い情報の取得 + + 請求情報の一覧を取得します。 + + Returns + ------- + payments_info : EmoPaymentsInfo + 請求情報の一覧。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/payments + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = self._get("/v1/payments") return EmoPaymentsInfo(**response) def get_payment_info_detail(self, payment_id: int) -> EmoPaymentInfo: + """支払い情報の詳細の取得 + + Parameters + ---------- + payment_id : int + 詳細を取得したい支払い情報のid。 + + Returns + ------- + payments_info : EmoPaymentInfo + 請求情報の詳細。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/payments/-payment_id- + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = self._get("/v1/payments/" + str(payment_id)) return EmoPaymentInfo(**response) class BizBasicClient(BizClient): + """各種apiを呼び出す同期版のclient(Business Basic版) + + Parameters + ---------- + api_key : str, default None + 法人向けAPIキー。 + + 法人アカウントでログインした時の `ダッシュボード `_ + から確認することができます。 + + endpoint_url : str, default https://platform-api.bocco.me + BOCCO emo platform apiにアクセスするためのendpoint + + tokens : Tokens, default None + refresh token及びaccess tokenを指定します。 + + 指定しない場合は、環境変数に設定されているあるいはこのpkg内のファイル(emo-platform-api.json)に保存されているトークンが使用されます。 + token_file_path : Optional[str], default None + refresh token及びaccess tokenを保存するファイルのパス。 + + 指定しない場合は、このpkg内のディレクトリに保存されます。 + 指定したパスには、以下の2種類のファイルが生成されます。 + emo-platform-api.json + 最新のトークンを保存するファイル。 + emo-platform-api_previous.json + 現在、環境変数として設定されているトークンが記録されたファイル。 + + 前回から更新があったかを確認するために使用されます。 + + 更新があった場合は、emo-platform-api.jsonに保存されているトークンが上書きされます。 + Raises + ---------- + TokenError + refresh tokenあるいはaccess tokenが環境変数として設定されていない場合。 + 引数tokensにトークンを指定している時は出ません。 + + Note + ---- + 各メソッドの実行時にaccess tokenの期限が切れていた場合 + emo-platform-api.jsonに保存されているrefresh tokenを使用して自動的にaccess tokenが更新されます。 + その際にAPI呼び出しが1回行われます。 + + """ + PLAN = "Business Basic" def create_room_client(self, room_id: str): + """部屋固有の各種apiを呼び出すclientの作成 + + 部屋のidは、:func:`get_rooms_id` を使用することで、取得できます。 + + Parameters + ---------- + room_id : str + 部屋のid + + Returns + ------- + room_client : BizBasicRoom + 部屋のclient + + Note + ---- + API呼び出し回数 + 0回 + + """ + return BizBasicRoom(self, room_id) def get_motions_list(self) -> NoReturn: + """利用可能なプリセットモーション一覧の取得 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.PLAN) def get_webhook_setting( self, ) -> NoReturn: + """現在設定されているWebhookの情報の取得 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.PLAN) def change_webhook_setting(self, webhook: WebHook) -> NoReturn: + """Webhookの設定の変更 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.PLAN) def register_webhook_event(self, events: List[str]) -> NoReturn: + """Webhook通知するイベントの指定 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.PLAN) def create_webhook_setting(self, webhook: WebHook) -> NoReturn: + """Webhookの設定の作成 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.PLAN) def delete_webhook_setting( self, ) -> NoReturn: + """現在設定されているWebhookの情報の削除 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.PLAN) def event( self, event: str, room_id_list: List[str] = [Client._DEFAULT_ROOM_ID] ) -> NoReturn: + """Webhookの指定のeventが通知されたときに呼び出す関数の登録 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.PLAN) def start_webhook_event( self, host: str = "localhost", port: int = 8000 ) -> NoReturn: + """BOCCO emoのWebhookのイベント通知の開始 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.PLAN) class BizAdvancedClient(BizClient): + """各種apiを呼び出す同期版のclient(Business Advanced版) + + Parameters + ---------- + api_key : str, default None + 法人向けAPIキー。 + + 法人アカウントでログインした時の `ダッシュボード `_ + から確認することができます。 + + endpoint_url : str, default https://platform-api.bocco.me + BOCCO emo platform apiにアクセスするためのendpoint + + tokens : Tokens, default None + refresh token及びaccess tokenを指定します。 + + 指定しない場合は、環境変数に設定されているあるいはこのpkg内のファイル(emo-platform-api.json)に保存されているトークンが使用されます。 + token_file_path : Optional[str], default None + refresh token及びaccess tokenを保存するファイルのパス。 + + 指定しない場合は、このpkg内のディレクトリに保存されます。 + 指定したパスには、以下の2種類のファイルが生成されます。 + emo-platform-api.json + 最新のトークンを保存するファイル。 + emo-platform-api_previous.json + 現在、環境変数として設定されているトークンが記録されたファイル。 + + 前回から更新があったかを確認するために使用されます。 + + 更新があった場合は、emo-platform-api.jsonに保存されているトークンが上書きされます。 + Raises + ---------- + TokenError + refresh tokenあるいはaccess tokenが環境変数として設定されていない場合。 + 引数tokensにトークンを指定している時は出ません。 + + Note + ---- + 各メソッドの実行時にaccess tokenの期限が切れていた場合 + emo-platform-api.jsonに保存されているrefresh tokenを使用して自動的にaccess tokenが更新されます。 + その際にAPI呼び出しが1回行われます。 + + """ + PLAN = "Business Advanced" def create_room_client(self, room_id: str): + """部屋固有の各種apiを呼び出すclientの作成 + + 部屋のidは、:func:`get_rooms_id` を使用することで、取得できます。 + + Parameters + ---------- + room_id : str + 部屋のid + + Returns + ------- + room_client : BizAdvancedRoom + 部屋のclient + + Note + ---- + API呼び出し回数 + 0回 + + """ + return BizAdvancedRoom(self, room_id) @@ -910,7 +1364,7 @@ def get_msgs(self, ts: int = None) -> EmoMsgsInfo: https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms/-room_uuid-/messages API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -945,7 +1399,7 @@ def get_sensors_list( https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms/-room_uuid-/sensors API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -979,7 +1433,7 @@ def get_sensor_values(self, sensor_id: str) -> EmoRoomSensorInfo: https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms/-room_uuid-/sensors/-sensor_uuid-/values API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1019,7 +1473,7 @@ def send_audio_msg(self, audio_data_path: str) -> EmoMessageInfo: https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/messages/audio API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1063,7 +1517,7 @@ def send_image(self, image_data_path: str) -> EmoMessageInfo: https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/messages/image API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1100,7 +1554,7 @@ def send_msg(self, msg: str) -> EmoMessageInfo: https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/messages/text API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1141,7 +1595,7 @@ def send_stamp(self, stamp_id: str, msg: Optional[str] = None) -> EmoMessageInfo https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/messages/stamp API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1184,7 +1638,7 @@ def send_original_motion(self, motion_data: Union[str, dict]) -> EmoMessageInfo: https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/motions API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1224,7 +1678,7 @@ def change_led_color(self, color: Color) -> EmoMessageInfo: https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/motions/led_color API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1260,7 +1714,7 @@ def move_to(self, head: Head) -> EmoMessageInfo: https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/motions/move_to API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1296,7 +1750,7 @@ def send_motion(self, motion_id: str) -> EmoMessageInfo: https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/motions/preset API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1327,7 +1781,7 @@ def get_emo_settings( https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms/-room_uuid-/emo/settings API呼び出し回数 - 1回 + 最大2回(access tokenが切れていた場合) + 1回 + 1回(access tokenが切れていた場合) """ @@ -1336,21 +1790,100 @@ def get_emo_settings( class BizBasicRoom(Room): + """部屋固有の各種apiを呼び出すclient(Business Basic版) + + Parameters + ---------- + base_client : BizBasicClient + このclientを作成しているclient。 + + room_id : str + 部屋のuuid。 + + """ + def get_sensor_values(self, sensor_id: str) -> NoReturn: + """部屋センサの送信値を取得 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.base_client.PLAN) def send_original_motion(self, motion_data: Union[str, dict]) -> NoReturn: + """独自定義した、オリジナルのモーションをBOCCO emoに送信 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.base_client.PLAN) def change_led_color(self, color: Color) -> NoReturn: + """ほっぺたの色の変更 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.base_client.PLAN) def move_to(self, head: Head) -> NoReturn: + """首の角度の変更 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.base_client.PLAN) def send_motion(self, motion_id: str) -> NoReturn: + """プリセットモーションをBOCCO emoに送信 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + raise UnavailableError(self.base_client.PLAN) class BizAdvancedRoom(Room): + """部屋固有の各種apiを呼び出すclient(Business Advanced版) + + Parameters + ---------- + base_client : BizAdvancedClient + このclientを作成しているclient。 + + room_id : str + 部屋のuuid。 + + """ + pass From ae1fdc509735f9a696a741eb02219f250a3746aa Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Tue, 14 Dec 2021 11:13:08 +0900 Subject: [PATCH 14/73] feat: Add doc to api_async --- emo_platform/api.py | 43 +- emo_platform/api_async.py | 1279 +++++++++++++++++++++++++++++++++++-- 2 files changed, 1265 insertions(+), 57 deletions(-) diff --git a/emo_platform/api.py b/emo_platform/api.py index 3deaa06..920e569 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -171,7 +171,7 @@ class Client: _BASE_URL = "https://platform-api.bocco.me" _DEFAULT_ROOM_ID = "" _MAX_SAVED_REQUEST_ID = 10 - PLAN = "Personal" + _PLAN = "Personal" def __init__( self, @@ -460,6 +460,7 @@ def create_room_client(self, room_id: str): 0回 """ + return Room(self, room_id) def get_stamps_list( @@ -813,7 +814,7 @@ class BizClient(Client): このクラスは使用せずに、継承先である :class:`BizBasicClient` あるいは :class:`BizAdvancedClient` をお使いください。 """ - PLAN = "Business" + _PLAN = "Business" def __init__( self, @@ -872,7 +873,7 @@ def delete_account_info(self) -> NoReturn: """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) def change_account_info(self, acount: AccountInfo) -> EmoBizAccountInfo: """アカウント情報の編集 @@ -1102,7 +1103,7 @@ class BizBasicClient(BizClient): """ - PLAN = "Business Basic" + _PLAN = "Business Basic" def create_room_client(self, room_id: str): """部屋固有の各種apiを呼び出すclientの作成 @@ -1140,7 +1141,7 @@ def get_motions_list(self) -> NoReturn: """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) def get_webhook_setting( self, @@ -1156,7 +1157,7 @@ def get_webhook_setting( """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) def change_webhook_setting(self, webhook: WebHook) -> NoReturn: """Webhookの設定の変更 @@ -1170,7 +1171,7 @@ def change_webhook_setting(self, webhook: WebHook) -> NoReturn: """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) def register_webhook_event(self, events: List[str]) -> NoReturn: """Webhook通知するイベントの指定 @@ -1184,7 +1185,7 @@ def register_webhook_event(self, events: List[str]) -> NoReturn: """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) def create_webhook_setting(self, webhook: WebHook) -> NoReturn: """Webhookの設定の作成 @@ -1198,7 +1199,7 @@ def create_webhook_setting(self, webhook: WebHook) -> NoReturn: """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) def delete_webhook_setting( self, @@ -1214,7 +1215,7 @@ def delete_webhook_setting( """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) def event( self, event: str, room_id_list: List[str] = [Client._DEFAULT_ROOM_ID] @@ -1230,7 +1231,7 @@ def event( """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) def start_webhook_event( self, host: str = "localhost", port: int = 8000 @@ -1246,7 +1247,7 @@ def start_webhook_event( """ - raise UnavailableError(self.PLAN) + raise UnavailableError(self._PLAN) class BizAdvancedClient(BizClient): @@ -1294,7 +1295,7 @@ class BizAdvancedClient(BizClient): """ - PLAN = "Business Advanced" + _PLAN = "Business Advanced" def create_room_client(self, room_id: str): """部屋固有の各種apiを呼び出すclientの作成 @@ -1322,7 +1323,7 @@ def create_room_client(self, room_id: str): class Room: - """部屋固有の各種apiを呼び出すclient + """部屋固有の各種apiを呼び出す同期版のclient Parameters ---------- @@ -1790,7 +1791,7 @@ def get_emo_settings( class BizBasicRoom(Room): - """部屋固有の各種apiを呼び出すclient(Business Basic版) + """部屋固有の各種apiを呼び出す同期版のclient(Business Basic版) Parameters ---------- @@ -1814,7 +1815,7 @@ def get_sensor_values(self, sensor_id: str) -> NoReturn: """ - raise UnavailableError(self.base_client.PLAN) + raise UnavailableError(self.base_client._PLAN) def send_original_motion(self, motion_data: Union[str, dict]) -> NoReturn: """独自定義した、オリジナルのモーションをBOCCO emoに送信 @@ -1828,7 +1829,7 @@ def send_original_motion(self, motion_data: Union[str, dict]) -> NoReturn: """ - raise UnavailableError(self.base_client.PLAN) + raise UnavailableError(self.base_client._PLAN) def change_led_color(self, color: Color) -> NoReturn: """ほっぺたの色の変更 @@ -1842,7 +1843,7 @@ def change_led_color(self, color: Color) -> NoReturn: """ - raise UnavailableError(self.base_client.PLAN) + raise UnavailableError(self.base_client._PLAN) def move_to(self, head: Head) -> NoReturn: """首の角度の変更 @@ -1856,7 +1857,7 @@ def move_to(self, head: Head) -> NoReturn: """ - raise UnavailableError(self.base_client.PLAN) + raise UnavailableError(self.base_client._PLAN) def send_motion(self, motion_id: str) -> NoReturn: """プリセットモーションをBOCCO emoに送信 @@ -1870,11 +1871,11 @@ def send_motion(self, motion_id: str) -> NoReturn: """ - raise UnavailableError(self.base_client.PLAN) + raise UnavailableError(self.base_client._PLAN) class BizAdvancedRoom(Room): - """部屋固有の各種apiを呼び出すclient(Business Advanced版) + """部屋固有の各種apiを呼び出す同期版のclient(Business Advanced版) Parameters ---------- diff --git a/emo_platform/api_async.py b/emo_platform/api_async.py index f4209a0..a5ccf07 100644 --- a/emo_platform/api_async.py +++ b/emo_platform/api_async.py @@ -8,7 +8,7 @@ import uvicorn # type: ignore from fastapi import BackgroundTasks, FastAPI, Request -from emo_platform.api import Client, PostContentType +from emo_platform.api import Client, BizClient, BizBasicClient, BizAdvancedClient, PostContentType from emo_platform.exceptions import ( TokenError, UnauthorizedError, @@ -39,9 +39,45 @@ class AsyncClient: + """各種apiを呼び出す非同期版のclient(Personal版) + + Parameters + ---------- + endpoint_url : str, default https://platform-api.bocco.me + BOCCO emo platform apiにアクセスするためのendpoint + tokens : Tokens, default None + refresh token及びaccess tokenを指定します。 + 指定しない場合は、環境変数に設定されているあるいはこのpkg内のファイル(emo-platform-api.json)に保存されているトークンが使用されます。 + token_file_path : Optional[str], default None + refresh token及びaccess tokenを保存するファイルのパス。 + 指定しない場合は、このpkg内のディレクトリに保存されます。 + 指定したパスには、以下の2種類のファイルが生成されます。 + emo-platform-api.json + 最新のトークンを保存するファイル。 + emo-platform-api_previous.json + 現在、環境変数として設定されているトークンが記録されたファイル。 + 前回から更新があったかを確認するために使用されます。 + 更新があった場合は、emo-platform-api.jsonに保存されているトークンが上書きされます。 + Raises + ---------- + TokenError + refresh tokenあるいはaccess tokenが環境変数として設定されていない場合。 + 引数tokensにトークンを指定している時は出ません。 + + Note + ---- + 各メソッドの実行時にaccess tokenの期限が切れていた場合 + emo-platform-api.jsonに保存されているrefresh tokenを使用して自動的にaccess tokenが更新されます。 + その際にAPI呼び出しが1回行われます。 + + Business版をお使いの方へ + このクラスは使用せずに、継承先である :class:`BizBasicAsyncClient` あるいは :class:`BizAdvancedAsyncClient` をお使いください。 + + """ + _DEFAULT_ROOM_ID = Client._DEFAULT_ROOM_ID _MAX_SAVED_REQUEST_ID = Client._MAX_SAVED_REQUEST_ID - PLAN = "Personal" + _PLAN = Client._PLAN def __init__( self, @@ -52,6 +88,26 @@ def __init__( self._client = Client(endpoint_url, tokens, token_file_path) async def update_tokens(self) -> None: + """トークンの更新と保存 + + jsonファイルに保存されているrefresh tokenを用いて、 + refresh tokenとaccess tokenを更新、jsonファイルに保存します。 + + access tokenが切れると自動で呼び出されるため、基本的に外部から使用することはありません。 + + Raises + ---------- + TokenError + refresh tokenが間違っている場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/oauth/token/refresh + + API呼び出し回数 + 1回 + """ try: res_tokens = await self.get_access_token( @@ -143,6 +199,34 @@ async def _delete(self, path: str) -> dict: return await self._check_http_error(request) async def get_access_token(self, refresh_token: str) -> EmoTokens: + """トークンの取得 + + refresh_tokenを用いて、refresh tokenとaccess tokenを取得します。 + + Parameters + ---------- + refresh_token : str + refresh tokenとaccess tokenを取得するのに用いるrefresh token。 + + Returns + ------- + emo_tokens : EmoTokens + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/oauth/token/refresh + + API呼び出し回数 + 1回 + + """ + payload = {"refresh_token": refresh_token} response = await self._post( "/oauth/token/refresh", json.dumps(payload), update_tokens=False @@ -153,42 +237,277 @@ async def _get_account_info(self) -> dict: return await self._get("/v1/me") async def get_account_info(self) -> EmoAccountInfo: + """アカウント情報の取得 + + Returns + ------- + account_info : EmoAccountInfo + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/me + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get_account_info() return EmoAccountInfo(**response) async def delete_account_info(self) -> EmoAccountInfo: + """アカウントの削除 + + 紐づくWebhook等の設定も全て削除されます。 + + Returns + ------- + account_info : EmoAccountInfo + + Raises + ---------- + EmoPlatformError + 関数内部で行っているDELETEの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#delete-/v1/me + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._delete("/v1/me") return EmoAccountInfo(**response) async def get_rooms_list(self) -> EmoRoomInfo: + """ユーザが参加している部屋の一覧の取得 + + 取得可能な部屋は、「BOCCO emo Wi-Fiモデル」のものに限られます。 + + Returns + ------- + rooms_list : EmoRoomInfo + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get("/v1/rooms") return EmoRoomInfo(**response) async def get_rooms_id(self) -> List[str]: + """ユーザーが参加している全ての部屋のidの取得 + + Returns + ------- + rooms_id : List[str] + 取得した部屋のidのリスト + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合 + あるいは、ユーザーが参加している部屋が1つもなかった場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + rooms_info = await self.get_rooms_list() return self._client._get_rooms_id(rooms_info) def create_room_client(self, room_id: str): + """部屋固有の各種apiを呼び出すclientの作成 + + 部屋のidは、:func:`get_rooms_id` を使用することで、取得できます。 + + Parameters + ---------- + room_id : str + 部屋のid + + Returns + ------- + room_client : AsyncRoom + 部屋のclient + + Note + ---- + API呼び出し回数 + 0回 + + """ + return AsyncRoom(self, room_id) async def get_stamps_list(self) -> EmoStampsInfo: + """利用可能なスタンプ一覧の取得 + + Returns + ------- + stamps_info : EmoStampsInfo + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/stamps + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get("/v1/stamps") return EmoStampsInfo(**response) async def get_motions_list(self) -> EmoMotionsInfo: + """利用可能なプリセットモーション一覧の取得 + + Returns + ------- + motions_info : EmoMotionsInfo + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/motions + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get("/v1/motions") return EmoMotionsInfo(**response) async def get_webhook_setting(self) -> EmoWebhookInfo: + """現在設定されているWebhookの情報の取得 + + Returns + ------- + webhook_info : EmoWebhookInfo + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + (BOCCO emoにWebhookの設定がされていない場合を含む) + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/webhook + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get("/v1/webhook") return EmoWebhookInfo(**response) async def change_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: + """Webhookの設定の変更 + + Parameters + ---------- + webhook : WebHook + 適用するWebhookの設定。 + + Returns + ------- + webhook_info : EmoWebhookInfo + 変更後のWebhookの設定 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPUTの処理が失敗した場合。 + (BOCCO emoにWebhookの設定がされていない場合を含む) + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#put-/v1/webhook + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = {"description": webhook.description, "url": webhook.url} response = await self._put("/v1/webhook", json.dumps(payload)) return EmoWebhookInfo(**response) async def register_webhook_event(self, events: List[str]) -> EmoWebhookInfo: + """Webhook通知するイベントの指定 + + eventの種類は、 + `こちらのページ `_ + から確認できます。 + + Parameters + ---------- + events : List[str] + 指定するWebhook event。 + + Returns + ------- + webhook_info : EmoWebhookInfo + 設定したWebhookの情報 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPUTの処理が失敗した場合。 + (BOCCO emoにWebhookの設定がされていない場合を含む) + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#put-/v1/webhook/events + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = {"events": events} response = await self._put("/v1/webhook/events", json.dumps(payload)) return EmoWebhookInfo(**response) @@ -226,6 +545,29 @@ async def create_webhook_setting(self, webhook: WebHook) -> EmoWebhookInfo: return EmoWebhookInfo(**response) async def delete_webhook_setting(self) -> EmoWebhookInfo: + """現在設定されているWebhookの情報の削除 + + Returns + ------- + webhook_info : EmoWebhookInfo + 削除したWebhookの情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているDELETEの処理が失敗した場合 + (BOCCO emoにWebhookの設定がされていない場合を含む) + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#delete-/v1/webhook + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._delete("/v1/webhook") return EmoWebhookInfo(**response) @@ -396,11 +738,19 @@ def stop_webhook_event(self): class BizAsyncClient(AsyncClient): - PLAN = "Business" + """各種apiを呼び出す非同期版のclient(Business版) + + Note + ---- + 使用上の注意 + このクラスは使用せずに、継承先である :class:`BizBasicAsyncClient` あるいは :class:`BizAdvancedAsyncClient` をお使いください。 + """ + + _PLAN = BizClient._PLAN def __init__( self, - x_channel_user: str, + api_key: str, endpoint_url: Optional[str] = None, tokens: Optional[Tokens] = None, token_file_path: Optional[str] = None, @@ -408,29 +758,171 @@ def __init__( super().__init__( endpoint_url=endpoint_url, tokens=tokens, token_file_path=token_file_path ) - self._client.headers["X-Channel-User"] = x_channel_user + self._client.headers["X-Channel-User"] = api_key async def get_account_info(self) -> EmoBizAccountInfo: # type: ignore[override] + """アカウント情報の取得 + + Returns + ------- + account_info : EmoBizAccountInfo + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + Personal版とBusiness版での違い + 返り値の型が異なるので注意してください。 + + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/me + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ response = await self._get_account_info() return EmoBizAccountInfo(**response) async def delete_account_info(self) -> NoReturn: - raise UnavailableError(self.PLAN) + """アカウント情報の取得 - async def change_account_info(self, acount: AccountInfo) -> EmoBizAccountInfo: - payload = asdict(acount) + Business版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + Note + ---- + Personal版とBusiness版での違い + Business版では使用できません。 + + """ + + raise UnavailableError(self._PLAN) + + async def change_account_info(self, acount: AccountInfo) -> EmoBizAccountInfo: + """アカウント情報の編集 + + Parameters + ---------- + account : AccountInfo + 新たなアカウント情報。 + + Returns + ------- + account_info : EmoBizAccountInfo + 編集後のアカウント情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPUTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#put-/v1/me + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + + payload = asdict(acount) response = await self._put("/v1/me", json.dumps(payload)) return EmoBizAccountInfo(**response) async def get_broadcast_msgs_list(self) -> EmoBroadcastInfoList: + """配信メッセージの一覧の取得 + + Returns + ------- + broadcast_info_list : EmoBroadcastInfoList + 配信メッセージの一覧。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/broadcast_messages + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get("/v1/broadcast_messages") return EmoBroadcastInfoList(**response) async def get_broadcast_msg_details(self, message_id: int) -> EmoBroadcastInfo: + """配信メッセージの詳細の取得 + + Parameters + ---------- + message_id : int + 詳細を取得したい配信メッセージのid + + Returns + ------- + broadcast_info_list : EmoBroadcastInfo + 配信メッセージの詳細。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/broadcast_messages/-broadcast_message_id- + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get("/v1/broadcast_messages/" + str(message_id)) return EmoBroadcastInfo(**response) async def create_broadcast_msg(self, message: BroadcastMsg) -> EmoBroadcastMessage: + """配信メッセージの新規作成 + + Parameters + ---------- + message : BroadcastMsg + 新規に作成する配信メッセージ。 + + Returns + ------- + broadcast_msg : EmoBroadcastMessage + 新規に作成した配信メッセージの内容。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/broadcast_messages + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = asdict(message) if message.immediate: payload.pop("executed_at") @@ -438,83 +930,483 @@ async def create_broadcast_msg(self, message: BroadcastMsg) -> EmoBroadcastMessa return EmoBroadcastMessage(**response) async def get_payments_info(self) -> EmoPaymentsInfo: + """支払い情報の取得 + + 請求情報の一覧を取得します。 + + Returns + ------- + payments_info : EmoPaymentsInfo + 請求情報の一覧。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/payments + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get("/v1/payments") return EmoPaymentsInfo(**response) async def get_payment_info_detail(self, payment_id: int) -> EmoPaymentInfo: + """支払い情報の詳細の取得 + + Parameters + ---------- + payment_id : int + 詳細を取得したい支払い情報のid。 + + Returns + ------- + payments_info : EmoPaymentInfo + 請求情報の詳細。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/payments/-payment_id- + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self._get("/v1/payments/" + str(payment_id)) return EmoPaymentInfo(**response) class BizBasicAsyncClient(BizAsyncClient): - PLAN = "Business Basic" + """各種apiを呼び出す非同期版のclient(Business Basic版) + + Parameters + ---------- + api_key : str, default None + 法人向けAPIキー。 + + 法人アカウントでログインした時の `ダッシュボード `_ + から確認することができます。 + + endpoint_url : str, default https://platform-api.bocco.me + BOCCO emo platform apiにアクセスするためのendpoint + + tokens : Tokens, default None + refresh token及びaccess tokenを指定します。 + + 指定しない場合は、環境変数に設定されているあるいはこのpkg内のファイル(emo-platform-api.json)に保存されているトークンが使用されます。 + token_file_path : Optional[str], default None + refresh token及びaccess tokenを保存するファイルのパス。 + + 指定しない場合は、このpkg内のディレクトリに保存されます。 + 指定したパスには、以下の2種類のファイルが生成されます。 + emo-platform-api.json + 最新のトークンを保存するファイル。 + emo-platform-api_previous.json + 現在、環境変数として設定されているトークンが記録されたファイル。 + + 前回から更新があったかを確認するために使用されます。 + + 更新があった場合は、emo-platform-api.jsonに保存されているトークンが上書きされます。 + Raises + ---------- + TokenError + refresh tokenあるいはaccess tokenが環境変数として設定されていない場合。 + 引数tokensにトークンを指定している時は出ません。 + + Note + ---- + 各メソッドの実行時にaccess tokenの期限が切れていた場合 + emo-platform-api.jsonに保存されているrefresh tokenを使用して自動的にaccess tokenが更新されます。 + その際にAPI呼び出しが1回行われます。 + + """ + + _PLAN = BizBasicClient._PLAN def create_room_client(self, room_id: str): + """部屋固有の各種apiを呼び出すclientの作成 + + 部屋のidは、:func:`get_rooms_id` を使用することで、取得できます。 + + Parameters + ---------- + room_id : str + 部屋のid + + Returns + ------- + room_client : BizBasicAsyncRoom + 部屋のclient + + Note + ---- + API呼び出し回数 + 0回 + + """ + return BizBasicAsyncRoom(self, room_id) async def get_motions_list(self) -> NoReturn: - raise UnavailableError(self.PLAN) + """利用可能なプリセットモーション一覧の取得 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self._PLAN) async def get_webhook_setting( self, ) -> NoReturn: - raise UnavailableError(self.PLAN) + """現在設定されているWebhookの情報の取得 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self._PLAN) async def change_webhook_setting(self, webhook: WebHook) -> NoReturn: - raise UnavailableError(self.PLAN) + """Webhookの設定の変更 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self._PLAN) async def register_webhook_event(self, events: List[str]) -> NoReturn: - raise UnavailableError(self.PLAN) + """Webhook通知するイベントの指定 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self._PLAN) async def create_webhook_setting(self, webhook: WebHook) -> NoReturn: - raise UnavailableError(self.PLAN) + """Webhookの設定の作成 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self._PLAN) async def delete_webhook_setting( self, ) -> NoReturn: - raise UnavailableError(self.PLAN) + """現在設定されているWebhookの情報の削除 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self._PLAN) def event( self, event: str, room_id_list: List[str] = [Client._DEFAULT_ROOM_ID] ) -> NoReturn: - raise UnavailableError(self.PLAN) + """Webhookの指定のeventが通知されたときに呼び出す関数の登録 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self._PLAN) async def start_webhook_event( self, host: str = "localhost", port: int = 8000, tasks: List[asyncio.Task] = [] ) -> NoReturn: - raise UnavailableError(self.PLAN) + """BOCCO emoのWebhookのイベント通知の開始 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self._PLAN) class BizAdvancedAsyncClient(BizAsyncClient): - PLAN = "Business Advanced" + """各種apiを呼び出す非同期版のclient(Business Advanced版) + + Parameters + ---------- + api_key : str, default None + 法人向けAPIキー。 + + 法人アカウントでログインした時の `ダッシュボード `_ + から確認することができます。 + + endpoint_url : str, default https://platform-api.bocco.me + BOCCO emo platform apiにアクセスするためのendpoint + + tokens : Tokens, default None + refresh token及びaccess tokenを指定します。 + + 指定しない場合は、環境変数に設定されているあるいはこのpkg内のファイル(emo-platform-api.json)に保存されているトークンが使用されます。 + token_file_path : Optional[str], default None + refresh token及びaccess tokenを保存するファイルのパス。 + + 指定しない場合は、このpkg内のディレクトリに保存されます。 + 指定したパスには、以下の2種類のファイルが生成されます。 + emo-platform-api.json + 最新のトークンを保存するファイル。 + emo-platform-api_previous.json + 現在、環境変数として設定されているトークンが記録されたファイル。 + + 前回から更新があったかを確認するために使用されます。 + + 更新があった場合は、emo-platform-api.jsonに保存されているトークンが上書きされます。 + Raises + ---------- + TokenError + refresh tokenあるいはaccess tokenが環境変数として設定されていない場合。 + 引数tokensにトークンを指定している時は出ません。 + + Note + ---- + 各メソッドの実行時にaccess tokenの期限が切れていた場合 + emo-platform-api.jsonに保存されているrefresh tokenを使用して自動的にaccess tokenが更新されます。 + その際にAPI呼び出しが1回行われます。 + + """ + + _PLAN = BizAdvancedClient._PLAN def create_room_client(self, room_id: str): + """部屋固有の各種apiを呼び出すclientの作成 + + 部屋のidは、:func:`get_rooms_id` を使用することで、取得できます。 + + Parameters + ---------- + room_id : str + 部屋のid + + Returns + ------- + room_client : BizAdvancedAsyncRoom + 部屋のclient + + Note + ---- + API呼び出し回数 + 0回 + + """ + return BizAdvancedAsyncRoom(self, room_id) class AsyncRoom: + """部屋固有の各種apiを呼び出す非同期版のclient + + Parameters + ---------- + base_client : AsyncClient + このclientを作成しているclient。 + + room_id : str + 部屋のuuid。 + + """ + def __init__(self, base_client: AsyncClient, room_id: str): self.base_client = base_client self.room_id = room_id - async def get_msgs(self, ts: int = None) -> EmoMsgsInfo: - params = {"before": ts} if ts else {} - response = await self.base_client._get( - "/v1/rooms/" + self.room_id + "/messages", params=params - ) - return EmoMsgsInfo(**response) + async def get_msgs(self, ts: int = None) -> EmoMsgsInfo: + """部屋に投稿されたメッセージの取得 + + Parameters + ---------- + ts : int or None + 指定した場合は、その時刻以前のメッセージを取得できます。 + + 指定方法:2021/07/01 12:30:45以前なら、20210701123045000 + + Returns + ------- + response : EmoMsgsInfo + 投稿されたメッセージの情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms/-room_uuid-/messages + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + + params = {"before": ts} if ts else {} + response = await self.base_client._get( + "/v1/rooms/" + self.room_id + "/messages", params=params + ) + return EmoMsgsInfo(**response) + + async def get_sensors_list(self) -> EmoSensorsInfo: + """BOCCO emoとペアリングされているセンサの一覧の取得 + + センサの種類は + `こちらのページ `_ + で確認できます。 + + Returns + ------- + sensors_info : EmoSensorsInfo + 取得した設定値。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms/-room_uuid-/sensors + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + + response = await self.base_client._get("/v1/rooms/" + self.room_id + "/sensors") + return EmoSensorsInfo(**response) + + async def get_sensor_values(self, sensor_id: str) -> EmoRoomSensorInfo: + """部屋センサの送信値を取得 + + Parameters + ---------- + sensor_id : str + 部屋センサのuuid。 + + 各部屋センサのuuidは、:func:`get_sensors_list` で確認できます。 + + Returns + ------- + response : EmoRoomSensorInfo + 部屋センサの送信値の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + (部屋センサ以外のBOCCOセンサ / 紐づいていない部屋センサ、のidを指定した場合も含みます) + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms/-room_uuid-/sensors/-sensor_uuid-/values + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) - async def get_sensors_list(self) -> EmoSensorsInfo: - response = await self.base_client._get("/v1/rooms/" + self.room_id + "/sensors") - return EmoSensorsInfo(**response) + """ - async def get_sensor_values(self, sensor_id: str) -> EmoRoomSensorInfo: response = await self.base_client._get( "/v1/rooms/" + self.room_id + "/sensors/" + sensor_id + "/values" ) return EmoRoomSensorInfo(**response) async def send_audio_msg(self, audio_data_path: str) -> EmoMessageInfo: + """音声ファイルの部屋への投稿 + + Attention + ---- + 送信できるファイルの制限について + フォーマット: MP3, M4A + + ファイルサイズ: 1MB + + Parameters + ---------- + audio_data_path : str + 投稿する音声ファイルの絶対パス。 + + Returns + ------- + response : EmoMessageInfo + 音声ファイル投稿時の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/messages/audio + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + with open(audio_data_path, "rb") as audio_data: data = aiohttp.FormData() data.add_field("audio", audio_data, content_type="multipart/form-data") @@ -526,6 +1418,40 @@ async def send_audio_msg(self, audio_data_path: str) -> EmoMessageInfo: return EmoMessageInfo(**response) async def send_image(self, image_data_path: str) -> EmoMessageInfo: + """画像ファイルの部屋への投稿 + + Attention + ---- + 送信できるファイルの制限について + フォーマット: JPG, PNG + + ファイルサイズ: 1MB + + Parameters + ---------- + image_data_path : str + 投稿する画像ファイルの絶対パス。 + + Returns + ------- + response : EmoMessageInfo + 画像投稿時の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/messages/image + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + with open(image_data_path, "rb") as image_data: data = aiohttp.FormData() data.add_field("image", image_data, content_type="multipart/form-data") @@ -537,6 +1463,33 @@ async def send_image(self, image_data_path: str) -> EmoMessageInfo: return EmoMessageInfo(**response) async def send_msg(self, msg: str) -> EmoMessageInfo: + """テキストメッセージの部屋への投稿 + + Parameters + ---------- + msg : str + 投稿するメッセージ。 + + Returns + ------- + response : EmoMessageInfo + メッセージ投稿時の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/messages/text + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = {"text": msg} response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/messages/text", json.dumps(payload) @@ -546,6 +1499,40 @@ async def send_msg(self, msg: str) -> EmoMessageInfo: async def send_stamp( self, stamp_id: str, msg: Optional[str] = None ) -> EmoMessageInfo: + """スタンプの部屋への投稿 + + Parameters + ---------- + stamp_id : str + スタンプのuuid。 + + 各スタンプのuuidは、:func:`Client.get_stamps_list` で確認できます。 + + msg : Optional[str], default None + スタンプ投稿時に、BOCCO emoが行うモーション再生と共に発話されるメッセージ。 + + 引数なしの場合は、発話なしでモーションが再生されます。 + + Returns + ------- + response : EmoMessageInfo + スタンプモーション送信時の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/messages/stamp + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = {"uuid": stamp_id} if msg: payload["text"] = msg @@ -554,9 +1541,41 @@ async def send_stamp( ) return EmoMessageInfo(**response) - async def send_original_motion( - self, motion_data: Union[str, dict] - ) -> EmoMessageInfo: + async def send_original_motion(self, motion_data: Union[str, dict]) -> EmoMessageInfo: + """独自定義した、オリジナルのモーションをBOCCO emoに送信 + + 詳しくは、 + `こちらのページ `_ + を参照してください。 + + Parameters + ---------- + file_path : str or dict + モーションファイルを置いている絶対パス。 + + あるいは、モーションを記述した辞書オブジェクト。 + + Returns + ------- + response : EmoMessageInfo + モーション送信時の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + (モーションのデータ形式が誤っている場合も含みます) + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/motions + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + if type(motion_data) == str: with open(motion_data) as f: payload = json.load(f) @@ -568,6 +1587,35 @@ async def send_original_motion( return EmoMessageInfo(**response) async def change_led_color(self, color: Color) -> EmoMessageInfo: + """ほっぺたの色の変更 + + 3秒間、ほっぺたの色を指定した色に変更します。 + + Parameters + ---------- + color : Color + 送信するほっぺたの色。 + + Returns + ------- + response : EmoMessageInfo + モーション送信時の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/motions/led_color + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = {"red": color.red, "green": color.green, "blue": color.blue} response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/motions/led_color", json.dumps(payload) @@ -575,6 +1623,35 @@ async def change_led_color(self, color: Color) -> EmoMessageInfo: return EmoMessageInfo(**response) async def move_to(self, head: Head) -> EmoMessageInfo: + """首の角度の変更 + + 首の角度を変更するモーションをBOCCO emoに送信します。 + + Parameters + ---------- + head : Head + 送信する首の角度。 + + Returns + ------- + response : EmoMessageInfo + モーション送信時の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/motions/move_to + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = {"angle": head.angle, "vertical_angle": head.vertical_angle} response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/motions/move_to", json.dumps(payload) @@ -582,6 +1659,35 @@ async def move_to(self, head: Head) -> EmoMessageInfo: return EmoMessageInfo(**response) async def send_motion(self, motion_id: str) -> EmoMessageInfo: + """プリセットモーションをBOCCO emoに送信 + + Parameters + ---------- + motion_id : str + プリセットモーションのuuid + + 各プリセットモーションのuuidは、:func:`Client.get_motions_list` で確認できます。 + + Returns + ------- + response : EmoMessageInfo + モーション送信時の情報。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているPOSTの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#post-/v1/rooms/-room_uuid-/motions/preset + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + payload = {"uuid": motion_id} response = await self.base_client._post( "/v1/rooms/" + self.room_id + "/motions/preset", json.dumps(payload) @@ -589,6 +1695,28 @@ async def send_motion(self, motion_id: str) -> EmoMessageInfo: return EmoMessageInfo(**response) async def get_emo_settings(self) -> EmoSettingsInfo: + """現在のBOCCO emoの設定値を取得 + + Returns + ------- + settings : EmoSettingsInfo + 取得した設定値。 + + Raises + ---------- + EmoPlatformError + 関数内部で行っているGETの処理が失敗した場合。 + + Note + ---- + 呼び出しているAPI + https://platform-api.bocco.me/dashboard/api-docs#get-/v1/rooms/-room_uuid-/emo/settings + + API呼び出し回数 + 1回 + 1回(access tokenが切れていた場合) + + """ + response = await self.base_client._get( "/v1/rooms/" + self.room_id + "/emo/settings" ) @@ -596,21 +1724,100 @@ async def get_emo_settings(self) -> EmoSettingsInfo: class BizBasicAsyncRoom(AsyncRoom): + """部屋固有の各種apiを呼び出す非同期版のclient(Business Basic版) + + Parameters + ---------- + base_client : BizBasicAsyncClient + このclientを作成しているclient。 + + room_id : str + 部屋のuuid。 + + """ + async def get_sensor_values(self, sensor_id: str) -> NoReturn: - raise UnavailableError(self.base_client.PLAN) + """部屋センサの送信値を取得 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self.base_client._PLAN) async def send_original_motion(self, motion_data: Union[str, dict]) -> NoReturn: - raise UnavailableError(self.base_client.PLAN) + """独自定義した、オリジナルのモーションをBOCCO emoに送信 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self.base_client._PLAN) async def change_led_color(self, color: Color) -> NoReturn: - raise UnavailableError(self.base_client.PLAN) + """ほっぺたの色の変更 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self.base_client._PLAN) async def move_to(self, head: Head) -> NoReturn: - raise UnavailableError(self.base_client.PLAN) + """首の角度の変更 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self.base_client._PLAN) async def send_motion(self, motion_id: str) -> NoReturn: - raise UnavailableError(self.base_client.PLAN) + """プリセットモーションをBOCCO emoに送信 + + Business Basic版では使用できないメソッドです。 + + Raises + ---------- + UnavailableError + この関数を呼び出した場合。 + + """ + + raise UnavailableError(self.base_client._PLAN) class BizAdvancedAsyncRoom(AsyncRoom): + """部屋固有の各種apiを呼び出す非同期版のclient(Business Advanced版) + + Parameters + ---------- + base_client : BizAdvancedAsyncClient + このclientを作成しているclient。 + + room_id : str + 部屋のuuid。 + + """ + pass From f9f8757571faf7881175b0f50d4b44eda411233b Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Tue, 14 Dec 2021 11:13:35 +0900 Subject: [PATCH 15/73] style: Fix doc in models.py --- emo_platform/models.py | 111 ++++++++++++++++++++++++++++++++--------- 1 file changed, 87 insertions(+), 24 deletions(-) diff --git a/emo_platform/models.py b/emo_platform/models.py index 436d667..076de95 100644 --- a/emo_platform/models.py +++ b/emo_platform/models.py @@ -3,23 +3,29 @@ @dataclass class Tokens: + """API利用に必要なトークンの情報。 + + Note + ---------- + トークンは `ダッシュボード `_ にログイン後に確認できます。 + + """ + access_token: str = "" + """ + アクセストークン + """ + refresh_token: str = "" + """ + リフレッシュトークン + """ @dataclass class Color: """BOCCO emoのほっぺの色。 - Parameters - ---------- - red : int, default 0 - 赤の輝度(0~255)。 - green : int, default 0 - 緑の輝度(0~255)。 - blue : int, default 0 - 青の輝度(0~255)。 - Note ---------- 範囲外の値を入れた際は、最小値と最大値のうち近い方の値になります。 @@ -27,8 +33,19 @@ class Color: """ red: int = 0 + """ + 赤の輝度(0~255) + """ + green: int = 0 + """ + 緑の輝度(0~255) + """ + blue: int = 0 + """ + 青の輝度(0~255) + """ def __post_init__(self): self.red = self._check_constraints(self.red) @@ -44,13 +61,6 @@ class Head: """ BOCCO emoの首の角度。 - Parameters - ---------- - angle: float, default 0 - 左右方向の首の角度(-45~45)。 - vertical_angle: float, default 0 - 上下方向の首の角度(-20~20)。 - Note ---------- 範囲外の値を入れた際は、最小値と最大値のうち近い方の値になります。 @@ -58,7 +68,15 @@ class Head: """ angle: float = 0 + """ + 左右方向の首の角度(-45~45) + """ + vertical_angle: float = 0 + """ + 上下方向の首の角度(-20~20) + """ + def __post_init__(self): self.angle = self._check_constraints(self.angle, -45, 45) @@ -70,34 +88,79 @@ def _check_constraints(self, value: float, min_val: float, max_val: float): @dataclass class WebHook: + """BOCCO emoに設定するWebhook。 """ - BOCCO emoに設定するWebhook。 - Parameters - ---------- url: str - Webhookの通知先のurl。 - description: str, default "" - Webhookの設定に関する説明書き。 - + """ + Webhookの通知先のurl """ - url: str description: str = "" + """ + Webhookの設定に関する説明書き + """ @dataclass class AccountInfo: + """ + BOCCOアカウント情報。 + """ + name: str + """ + アカウント名(1~20文字) + """ + name_furigana: str + """ + アカウント名のふりがな(平仮名表記)(1~20文字) + """ + organization_name: str + """ + 組織名(1~100文字) + """ + organization_unit_name: str + """ + 部署名(1~100文字) + """ + phone_number: str + """ + 電話番号(10~11文字のハイフンなし) + """ @dataclass class BroadcastMsg: + """ + 配信メッセージの情報。 + """ + title: str + """ + 配信メッセージのタイトル + """ + text: str + """ + 配信するメッセージ + """ + executed_at: int = 0 + """ + 配信予定時刻(UNIX Timestamp形式) + """ + immediate: bool = False + """ + 即時配信にするかどうか + + Note + ---------- + immediateをTrueにした場合、executed_atに書いた時刻は反映されず、即時配信となります。 + + """ From 44a5e3d1ac93556faa6d6b22909fa9de1b1cb95d Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Wed, 15 Dec 2021 14:50:40 +0900 Subject: [PATCH 16/73] style: Add docs to response.py --- emo_platform/response.py | 592 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 581 insertions(+), 11 deletions(-) diff --git a/emo_platform/response.py b/emo_platform/response.py index 0c7860c..f15e611 100644 --- a/emo_platform/response.py +++ b/emo_platform/response.py @@ -4,27 +4,78 @@ class EmoAccountInfo(BaseModel): + """BOCCOアカウント情報(Personal版)。 + """ + name: str + """アカウント名 + """ + email: str + """アカウントのメールアドレス + """ + profile_image: str + """アカウントのプロフィール画像のURL + """ + uuid: str + """アカウントのid + """ + plan: str + """アカウントのプラン + """ class EmoBizAccountInfo(BaseModel): + """BOCCOアカウント情報(Business版)。 + """ + account_id: int + """アカウントのid + """ + name: str + """アカウント名 + """ + name_furigana: str + """アカウント名のふりがな + """ + email: str + """アカウント名のメールアドレス + """ + organization_name: str + """組織名 + """ + organization_unit_name: str + """部署名 + """ + phone_number: str + """電話番号 + """ + plan: str + """アカウントのプラン + """ class EmoTokens(BaseModel): + """API利用に必要なトークンの情報。 + """ + access_token: str + """アクセストークン + """ + refresh_token: str + """リフレッシュトークン + """ class Listing(BaseModel): @@ -34,269 +85,777 @@ class Listing(BaseModel): class EmoRoomMember(BaseModel): + """部屋に参加しているメンバーの情報 + """ + uuid: str + """メンバーのid + """ + user_type: str + """メンバーの種別 + """ + nickname: str + """メンバーのニックネーム + """ + profile_image: str + """メンバーのプロフィール画像のURL + """ class RoomInfo(BaseModel): + """部屋の情報 + """ + uuid: str + """部屋のid + """ + name: str + """部屋の名前 + """ + room_type: str + """部屋の種類 + """ + room_members: List[EmoRoomMember] + """部屋に参加しているメンバーの一覧 + """ class EmoRoomInfo(BaseModel): + """ユーザーが参加している部屋の一覧情報 + """ + listing: Listing + rooms: List[RoomInfo] + """ユーザーが参加している部屋の一覧 + """ class EmoMessage(BaseModel): + """部屋に投稿されたテキストメッセージの内容 + """ + ja: str class EmoMessageInfo(BaseModel): + """部屋に投稿されたメッセージの情報 + """ + sequence: int + """メッセージの順序関係を示すシーケンス値 + + 数字の意味は、`こちらのページ `_ をご覧ください。 + """ + unique_id: str + """メッセージのid + """ + user: EmoRoomMember + """メッセージを投稿したメンバーの情報 + """ + message: EmoMessage + """テキストメッセージの内容 + """ + media: str + """メッセージのタイプ + + Note + ---- + text + テキストメッセージ + audio + 音声メッセージ + image + 画像メッセージ + stamp + スタンプメッセージ + + """ + audio_url: str + """送信された音声ファイルのURL + """ + image_url: str + """送信された画像ファイルのURL + """ + lang: str + """メッセージの言語 + """ class EmoMsgsInfo(BaseModel): + """部屋に投稿されたメッセージの一覧情報 + """ + messages: List[EmoMessageInfo] + """部屋に投稿されたメッセージの一覧 + """ class EmoStamp(BaseModel): + """スタンプの情報 + """ + uuid: str + """スタンプのid + """ + name: str + """スタンプの名前 + """ + summary: str + """スタンプの内容説明 + """ + image: str + """スタンプ画像のURL + """ class EmoStampsInfo(BaseModel): + """利用可能なスタンプの一覧情報 + """ + listing: Listing + stamps: List[EmoStamp] + """スタンプの一覧 + """ class EmoMotion(BaseModel): + """モーションの情報 + """ + uuid: str + """モーションのid + """ + name: str + """モーションの名前 + """ + preview: str + """モーションの音声ファイルのURL + """ class EmoMotionsInfo(BaseModel): + """利用可能なモーションの一覧情報 + """ + listing: Listing motions: List[EmoMotion] + """モーションの一覧 + """ class EmoWebhookInfo(BaseModel): + """現在設定されているWebhookの情報 + """ + description: str + """Webhookの設定に関する説明書き + """ + events: List[str] + """Webhookを受け取る対象のイベントの一覧 + """ + status: str + """Webhookの設定状態 + """ + secret: str + """WebhookリクエストのHTTP Headerに含まれるX-Platform-API-Secretと同一の文字列。 + + この文字列とX-Platform-API-Secretの値が同一か確かめることで、第三者からの予期せぬリクエストを防ぐことができます。 + """ + url: str + """Webhookの送信先のURL + """ class EmoSensor(BaseModel): + """BOCCO emoとペアリングされているセンサ情報 + """ + uuid: str + """センサのid + """ + sensor_type: str + """センサの種類 + """ + nickname: str + """センサのニックネーム + """ + signal_strength: int + """センサの信号の強さ + """ + battery: int + """センサの残りバッテリー + """ class EmoSensorsInfo(BaseModel): - sensors: List[EmoSensor] + """BOCCO emoとペアリングされているセンサ情報の一覧 + """ + sensors: List[EmoSensor] + """ベアリングされているセンサの一覧 + """ class EmoRoomSensorEvent(BaseModel): + """部屋センサの送信値 + """ + temperature: Union[int, float] + """温度 + """ + humidity: Union[int, float] + """湿度 + """ + illuminance: Union[int, float] + """照度 + """ class EmoRoomSensorInfo(BaseModel): + """部屋センサの送信値の一覧 + """ + sensor_type: str + """センサの種類 + """ + uuid: str + """センサのid + """ + nickname: str + """センサのニックネーム + """ + events: List[EmoRoomSensorEvent] + """センサの送信値の一覧 + """ class EmoSettingsInfo(BaseModel): + """現在のBOCCO emoの設定値 + """ + nickname: str + """ニックネーム + """ + wakeword: str + """ウェイクアップワード + """ + volume: int + """音量 + """ + voice_pitch: int + """声の高さ + """ + voice_speed: int + """話すスピード + """ + lang: str + """言語設定 + """ + serial_number: str + """シリアルナンバー + """ + timezone: str + """タイムゾーン + """ + zip_code: str + """郵便番号 + """ class EmoBroadcastMessage(BaseModel): + """配信メッセージの情報 + """ + id: int + """配信メッセージのid + """ + channel_uuid: str + """チャンネルのid + """ + title: str + """配信メッセージのタイトル + """ + text: str + """配信メッセージの内容 + """ + executed_at: int + """配信時間 + """ + finished: bool + """配信済みか + """ + success: bool + """配信に成功したか + """ + failed: bool + """配信に失敗したか + """ + + +class EmoBroadcastInfoList(BaseModel): + """配信メッセージの一覧情報 + """ + + listing: Listing + + messages: List[EmoBroadcastMessage] + """配信メッセージの一覧 + """ class EmoBroadcastMessageDetail(BaseModel): + """配信メッセージの詳細 + """ + room_uuid: str + """配信された部屋のid + """ + room_name: str + """配信された部屋の名前 + """ + success: bool + """配信メッセージの詳細 + """ + status_code: int - description: str - executed_at: int + """配信リクエストのステータスコード + """ + description: str + """配信リクエストの結果 + """ -class EmoBroadcastInfoList(BaseModel): - listing: Listing - messages: List[EmoBroadcastMessage] + executed_at: int + """配信時間 + """ class EmoBroadcastInfo(BaseModel): + """配信メッセージの詳細情報 + """ + message: EmoBroadcastMessage + """配信メッセージの情報 + """ + details: List[EmoBroadcastMessageDetail] + """配信メッセージの詳細 + """ class EmoPaymentInfo(BaseModel): + """請求情報の詳細 + """ + id: int + """請求情報のid + """ + account_id: int + """BOCCOアカウントid + """ + year: int + """請求年 + """ + month: int + """請求月 + """ + plan: str + """アカウントのプラン + """ + payment_method: str + """支払い方法 + """ + amount: int + """請求金額 + """ + currency: str + """請求金額の単位 + """ + due_date: int + """支払い期限 + """ + paid: bool + """支払い済みか + """ + created_at: int + """請求情報の作成時期 + """ + updated_at: int + """請求情報の更新時期 + """ class EmoPaymentsInfo(BaseModel): + """請求情報の一覧 + """ + listing: Listing payments: List[EmoPaymentInfo] - + """請求情報の詳細の一覧 + """ class EmoKind(BaseModel): + """様々な種別に関する情報 + """ + kind: str class EmoWebhookTriggerWord(BaseModel): + """Webhookで受信したトリガーワードイベントに関する情報 + """ + trigger_word: EmoKind + """トリガーワードの種別の情報 + + default_bocco + 「ねえボッコ」の呼びかけに反応した場合 + default_emo + 「エモちゃん」の呼びかけに反応した場合 + user_nickname + ニックネームでの呼びかけに反応した場合 + """ class EmoPerformedBy(BaseModel): + """録音が実行されたきっかけに関する情報 + """ + performed_by: str + """録音が実行されたきっかけのアクションを示す値 + record_button + 本体の録音ボタンが押された場合の値 + vui_command + 音声コマンドでの録音命令が実施された場合の値 + """ class EmoWebhookRecording(BaseModel): + """Webhookで受信した録音イベントに関する情報 + """ + recording: EmoPerformedBy + """録音が実行されたきっかけに関する情報 + """ class EmoMinutes(BaseModel): + """Webhookで受信した音声イベントコマンドのタイマーでセットした時間(分)に関する情報 + """ + minutes: str class EmoTime(BaseModel): + """Webhookで受信した音声イベントコマンドのアラームのセット時刻に関する情報 + """ + time: str class EmoArea(BaseModel): + """Webhookで受信した音声イベントコマンドの天気の場所に関する情報 + """ + area: str class EmoVolume(BaseModel): + """Webhookで受信した音声イベントコマンドの音量の値に関する情報 + """ + volume: str class EmoVuiCommand(BaseModel): + """音声コマンドに関する情報 + """ + kind: str + """音声コマンドの種別を示す値 + """ + parameters: Union[EmoMinutes, EmoTime, EmoArea, EmoVolume] + """「エモちゃん、10時にアラーム設定して」のように、パラメータ付きで実行されたVUIの詳細を示す値 + + 「エモちゃん、しゃべって」のように、パラメータを持たない音声コマンドが実行された場合はparametersの値は付与されません。 + """ class EmoWebhookVuiCommand(BaseModel): + """Webhookで受信した音声コマンドイベントに関する情報 + """ + vui_command: Union[EmoVuiCommand, EmoKind] + """音声コマンドとトリガワードの種類に関する情報 + """ class EmoWebhookMotion(BaseModel): + """Webhookで受信したモーション実行完了イベントに関する情報 + """ + motion: EmoKind + """実行されたモーションの種別を示す値 + """ class EmoTalk(BaseModel): + """BOCCO emoが発話した内容に関する情報 + """ + talk: str + """発話した内容を示すテキスト + """ class EmoWebhookEmoTalk(BaseModel): + """Webhookで受信した発話完了イベントに関する情報 + """ + emo_talk: EmoTalk + """BOCCO emoが発話した内容に関する情報 + """ class EmoWebhookAccel(BaseModel): + """Webhookで受信した内蔵加速度センサイベントに関する情報 + """ + accel: EmoKind + """レーダセンサが検知したイベントを示す値 + + normal + 直立静止している状態に移行した場合の値 + upside_down + 逆さまの状態に移行した場合の値 + lying_down + 横倒しの状態に移行した場合の値 + shaken + 揺さぶられた状態に移行した場合の値 + beaten + つつかれた状態に移行した場合の値 + dropped + 落とされた状態に移行した場合の値 + lift + 持ち上げられた状態に移行した場合の値 + """ class EmoWebhookIlluminance(BaseModel): + """Webhookで受信した内蔵照度センサイベントに関する情報 + """ + illuminance: EmoKind + """照度センサが検知したイベントを示す値 + + brighter + 明るくなった時の値 + darker + 暗くなった時の値 + """ class EmoRadar(BaseModel): + """レーダセンサが検知したイベントの情報 + """ + begin: bool + """BOCCO emoの近くに人がいる時に、true が設定されます。 + """ + end: bool + """BOCCO emoの近くから人が立ち去った時に、true が設定されます。 + """ + near_begin: bool + """BOCCO emoのすぐ近くに人がいる時に、true が設定されます。 + """ + near_end: bool + """BOCCO emoのすぐ近くから人が立ち去った時に、true が設定されます。 + """ class EmoWebhookRadar(BaseModel): + """Webhookで受信した内蔵レーダーセンサイベントに関する情報 + """ + radar: EmoRadar + """レーダセンサが検知したイベントの情報 + """ + + +class EmoWebhookMessage(BaseModel): + """Webhookで受信した新規メッセージ受信イベントに関する情報 + """ + + message: EmoMessageInfo + """BOCCO emoが受信したメッセージを示す値 + """ class EmoWebhookSensorMessage(BaseModel): + """センサの通知内容 + """ + sequence: int + """通知された時間を示す値 + + 数字の意味は、`こちらのページ `_ をご覧ください。 + """ + unique_id: str + """センサ通知のid + """ + user: EmoRoomMember + """センサのメンバー情報 + """ + message_type: str - sensor_action: str - lang: str + """メッセージの種類 + sensor固定です。 + """ -class EmoWebhookMessage(BaseModel): - message: EmoMessageInfo + sensor_action: str + """センサ通知の種別 + """ + + lang: str + """言語設定 + """ class EmoWebhookMovementSensor(BaseModel): + """Webhookで受信した振動センサ反応イベントに関する情報 + """ + movement_sensor: EmoWebhookSensorMessage + """振動センサの通知内容 + """ class EmoWebhookLockSensor(BaseModel): + """Webhookで受信した鍵センサ反応イベントに関する情報 + """ + lock_sensor: EmoWebhookSensorMessage + """鍵センサの通知内容 + """ class EmoWebhookHumanSensor(BaseModel): + """Webhookで受信した人感センサ反応イベントに関する情報 + """ + human_sensor: EmoWebhookSensorMessage + """人感センサの通知内容 + """ class EmoWebhookRoomSensor(BaseModel): + """Webhookで受信した部屋センサ反応イベントに関する情報 + """ + room_sensor: EmoWebhookSensorMessage + """部屋センサの通知内容 + """ class EmoWebhookBody(BaseModel): + """受信したWebhookの内容 + """ + request_id: str + """リクエストの同一性を示す、一意の文字列 + """ + uuid: str + """BOCCO emoを識別する一意なID + """ + serial_number: str + """BOCCO emoの製造番号 + """ + nickname: str + """BOCCO emoに設定されているニックネーム + """ + timestamp: int + """イベントが発生した時刻を示すUNIX Timestamp + """ + event: str + """発生したイベントの種別を示す文字列 + + Note + ---- + eventの種類は、`こちらのページ `_ から確認できます。 + """ + data: Union[ EmoWebhookTriggerWord, EmoWebhookRecording, @@ -313,4 +872,15 @@ class EmoWebhookBody(BaseModel): EmoWebhookRoomSensor, dict, ] + """発生したイベントの詳細を示すオブジェクト + + イベントの種類に応じてデータ構造が変わります。 + + + Attention + ---- + eventの種類がfunction_button.pressedの時、dataは空の辞書 {} となります。 + + """ + receiver: str From 6be6e0ad21e435308214a5f8386ba5479816acb2 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Wed, 15 Dec 2021 14:56:22 +0900 Subject: [PATCH 17/73] style: Format python code --- emo_platform/api_async.py | 12 ++- emo_platform/models.py | 4 +- emo_platform/response.py | 150 +++++++++++++------------------------- 3 files changed, 63 insertions(+), 103 deletions(-) diff --git a/emo_platform/api_async.py b/emo_platform/api_async.py index a5ccf07..888021d 100644 --- a/emo_platform/api_async.py +++ b/emo_platform/api_async.py @@ -8,7 +8,13 @@ import uvicorn # type: ignore from fastapi import BackgroundTasks, FastAPI, Request -from emo_platform.api import Client, BizClient, BizBasicClient, BizAdvancedClient, PostContentType +from emo_platform.api import ( + BizAdvancedClient, + BizBasicClient, + BizClient, + Client, + PostContentType, +) from emo_platform.exceptions import ( TokenError, UnauthorizedError, @@ -1541,7 +1547,9 @@ async def send_stamp( ) return EmoMessageInfo(**response) - async def send_original_motion(self, motion_data: Union[str, dict]) -> EmoMessageInfo: + async def send_original_motion( + self, motion_data: Union[str, dict] + ) -> EmoMessageInfo: """独自定義した、オリジナルのモーションをBOCCO emoに送信 詳しくは、 diff --git a/emo_platform/models.py b/emo_platform/models.py index 076de95..9505bc4 100644 --- a/emo_platform/models.py +++ b/emo_platform/models.py @@ -77,7 +77,6 @@ class Head: 上下方向の首の角度(-20~20) """ - def __post_init__(self): self.angle = self._check_constraints(self.angle, -45, 45) self.vertical_angle = self._check_constraints(self.vertical_angle, -20, 20) @@ -88,8 +87,7 @@ def _check_constraints(self, value: float, min_val: float, max_val: float): @dataclass class WebHook: - """BOCCO emoに設定するWebhook。 - """ + """BOCCO emoに設定するWebhook。""" url: str """ diff --git a/emo_platform/response.py b/emo_platform/response.py index f15e611..d06a1c8 100644 --- a/emo_platform/response.py +++ b/emo_platform/response.py @@ -4,8 +4,7 @@ class EmoAccountInfo(BaseModel): - """BOCCOアカウント情報(Personal版)。 - """ + """BOCCOアカウント情報(Personal版)。""" name: str """アカウント名 @@ -29,8 +28,7 @@ class EmoAccountInfo(BaseModel): class EmoBizAccountInfo(BaseModel): - """BOCCOアカウント情報(Business版)。 - """ + """BOCCOアカウント情報(Business版)。""" account_id: int """アカウントのid @@ -66,8 +64,7 @@ class EmoBizAccountInfo(BaseModel): class EmoTokens(BaseModel): - """API利用に必要なトークンの情報。 - """ + """API利用に必要なトークンの情報。""" access_token: str """アクセストークン @@ -85,8 +82,7 @@ class Listing(BaseModel): class EmoRoomMember(BaseModel): - """部屋に参加しているメンバーの情報 - """ + """部屋に参加しているメンバーの情報""" uuid: str """メンバーのid @@ -106,8 +102,7 @@ class EmoRoomMember(BaseModel): class RoomInfo(BaseModel): - """部屋の情報 - """ + """部屋の情報""" uuid: str """部屋のid @@ -127,8 +122,7 @@ class RoomInfo(BaseModel): class EmoRoomInfo(BaseModel): - """ユーザーが参加している部屋の一覧情報 - """ + """ユーザーが参加している部屋の一覧情報""" listing: Listing @@ -138,15 +132,13 @@ class EmoRoomInfo(BaseModel): class EmoMessage(BaseModel): - """部屋に投稿されたテキストメッセージの内容 - """ + """部屋に投稿されたテキストメッセージの内容""" ja: str class EmoMessageInfo(BaseModel): - """部屋に投稿されたメッセージの情報 - """ + """部屋に投稿されたメッセージの情報""" sequence: int """メッセージの順序関係を示すシーケンス値 @@ -196,8 +188,7 @@ class EmoMessageInfo(BaseModel): class EmoMsgsInfo(BaseModel): - """部屋に投稿されたメッセージの一覧情報 - """ + """部屋に投稿されたメッセージの一覧情報""" messages: List[EmoMessageInfo] """部屋に投稿されたメッセージの一覧 @@ -205,8 +196,7 @@ class EmoMsgsInfo(BaseModel): class EmoStamp(BaseModel): - """スタンプの情報 - """ + """スタンプの情報""" uuid: str """スタンプのid @@ -226,8 +216,7 @@ class EmoStamp(BaseModel): class EmoStampsInfo(BaseModel): - """利用可能なスタンプの一覧情報 - """ + """利用可能なスタンプの一覧情報""" listing: Listing @@ -237,8 +226,7 @@ class EmoStampsInfo(BaseModel): class EmoMotion(BaseModel): - """モーションの情報 - """ + """モーションの情報""" uuid: str """モーションのid @@ -254,8 +242,7 @@ class EmoMotion(BaseModel): class EmoMotionsInfo(BaseModel): - """利用可能なモーションの一覧情報 - """ + """利用可能なモーションの一覧情報""" listing: Listing motions: List[EmoMotion] @@ -264,8 +251,7 @@ class EmoMotionsInfo(BaseModel): class EmoWebhookInfo(BaseModel): - """現在設定されているWebhookの情報 - """ + """現在設定されているWebhookの情報""" description: str """Webhookの設定に関する説明書き @@ -291,8 +277,7 @@ class EmoWebhookInfo(BaseModel): class EmoSensor(BaseModel): - """BOCCO emoとペアリングされているセンサ情報 - """ + """BOCCO emoとペアリングされているセンサ情報""" uuid: str """センサのid @@ -316,16 +301,15 @@ class EmoSensor(BaseModel): class EmoSensorsInfo(BaseModel): - """BOCCO emoとペアリングされているセンサ情報の一覧 - """ + """BOCCO emoとペアリングされているセンサ情報の一覧""" sensors: List[EmoSensor] """ベアリングされているセンサの一覧 """ + class EmoRoomSensorEvent(BaseModel): - """部屋センサの送信値 - """ + """部屋センサの送信値""" temperature: Union[int, float] """温度 @@ -341,8 +325,7 @@ class EmoRoomSensorEvent(BaseModel): class EmoRoomSensorInfo(BaseModel): - """部屋センサの送信値の一覧 - """ + """部屋センサの送信値の一覧""" sensor_type: str """センサの種類 @@ -362,8 +345,7 @@ class EmoRoomSensorInfo(BaseModel): class EmoSettingsInfo(BaseModel): - """現在のBOCCO emoの設定値 - """ + """現在のBOCCO emoの設定値""" nickname: str """ニックネーム @@ -403,8 +385,7 @@ class EmoSettingsInfo(BaseModel): class EmoBroadcastMessage(BaseModel): - """配信メッセージの情報 - """ + """配信メッセージの情報""" id: int """配信メッセージのid @@ -440,8 +421,7 @@ class EmoBroadcastMessage(BaseModel): class EmoBroadcastInfoList(BaseModel): - """配信メッセージの一覧情報 - """ + """配信メッセージの一覧情報""" listing: Listing @@ -451,8 +431,7 @@ class EmoBroadcastInfoList(BaseModel): class EmoBroadcastMessageDetail(BaseModel): - """配信メッセージの詳細 - """ + """配信メッセージの詳細""" room_uuid: str """配信された部屋のid @@ -480,8 +459,7 @@ class EmoBroadcastMessageDetail(BaseModel): class EmoBroadcastInfo(BaseModel): - """配信メッセージの詳細情報 - """ + """配信メッセージの詳細情報""" message: EmoBroadcastMessage """配信メッセージの情報 @@ -493,8 +471,7 @@ class EmoBroadcastInfo(BaseModel): class EmoPaymentInfo(BaseModel): - """請求情報の詳細 - """ + """請求情報の詳細""" id: int """請求情報のid @@ -546,24 +523,22 @@ class EmoPaymentInfo(BaseModel): class EmoPaymentsInfo(BaseModel): - """請求情報の一覧 - """ + """請求情報の一覧""" listing: Listing payments: List[EmoPaymentInfo] """請求情報の詳細の一覧 """ + class EmoKind(BaseModel): - """様々な種別に関する情報 - """ + """様々な種別に関する情報""" kind: str class EmoWebhookTriggerWord(BaseModel): - """Webhookで受信したトリガーワードイベントに関する情報 - """ + """Webhookで受信したトリガーワードイベントに関する情報""" trigger_word: EmoKind """トリガーワードの種別の情報 @@ -578,8 +553,7 @@ class EmoWebhookTriggerWord(BaseModel): class EmoPerformedBy(BaseModel): - """録音が実行されたきっかけに関する情報 - """ + """録音が実行されたきっかけに関する情報""" performed_by: str """録音が実行されたきっかけのアクションを示す値 @@ -590,9 +564,9 @@ class EmoPerformedBy(BaseModel): 音声コマンドでの録音命令が実施された場合の値 """ + class EmoWebhookRecording(BaseModel): - """Webhookで受信した録音イベントに関する情報 - """ + """Webhookで受信した録音イベントに関する情報""" recording: EmoPerformedBy """録音が実行されたきっかけに関する情報 @@ -600,36 +574,31 @@ class EmoWebhookRecording(BaseModel): class EmoMinutes(BaseModel): - """Webhookで受信した音声イベントコマンドのタイマーでセットした時間(分)に関する情報 - """ + """Webhookで受信した音声イベントコマンドのタイマーでセットした時間(分)に関する情報""" minutes: str class EmoTime(BaseModel): - """Webhookで受信した音声イベントコマンドのアラームのセット時刻に関する情報 - """ + """Webhookで受信した音声イベントコマンドのアラームのセット時刻に関する情報""" time: str class EmoArea(BaseModel): - """Webhookで受信した音声イベントコマンドの天気の場所に関する情報 - """ + """Webhookで受信した音声イベントコマンドの天気の場所に関する情報""" area: str class EmoVolume(BaseModel): - """Webhookで受信した音声イベントコマンドの音量の値に関する情報 - """ + """Webhookで受信した音声イベントコマンドの音量の値に関する情報""" volume: str class EmoVuiCommand(BaseModel): - """音声コマンドに関する情報 - """ + """音声コマンドに関する情報""" kind: str """音声コマンドの種別を示す値 @@ -643,8 +612,7 @@ class EmoVuiCommand(BaseModel): class EmoWebhookVuiCommand(BaseModel): - """Webhookで受信した音声コマンドイベントに関する情報 - """ + """Webhookで受信した音声コマンドイベントに関する情報""" vui_command: Union[EmoVuiCommand, EmoKind] """音声コマンドとトリガワードの種類に関する情報 @@ -652,8 +620,7 @@ class EmoWebhookVuiCommand(BaseModel): class EmoWebhookMotion(BaseModel): - """Webhookで受信したモーション実行完了イベントに関する情報 - """ + """Webhookで受信したモーション実行完了イベントに関する情報""" motion: EmoKind """実行されたモーションの種別を示す値 @@ -661,8 +628,7 @@ class EmoWebhookMotion(BaseModel): class EmoTalk(BaseModel): - """BOCCO emoが発話した内容に関する情報 - """ + """BOCCO emoが発話した内容に関する情報""" talk: str """発話した内容を示すテキスト @@ -670,8 +636,7 @@ class EmoTalk(BaseModel): class EmoWebhookEmoTalk(BaseModel): - """Webhookで受信した発話完了イベントに関する情報 - """ + """Webhookで受信した発話完了イベントに関する情報""" emo_talk: EmoTalk """BOCCO emoが発話した内容に関する情報 @@ -679,8 +644,7 @@ class EmoWebhookEmoTalk(BaseModel): class EmoWebhookAccel(BaseModel): - """Webhookで受信した内蔵加速度センサイベントに関する情報 - """ + """Webhookで受信した内蔵加速度センサイベントに関する情報""" accel: EmoKind """レーダセンサが検知したイベントを示す値 @@ -703,8 +667,7 @@ class EmoWebhookAccel(BaseModel): class EmoWebhookIlluminance(BaseModel): - """Webhookで受信した内蔵照度センサイベントに関する情報 - """ + """Webhookで受信した内蔵照度センサイベントに関する情報""" illuminance: EmoKind """照度センサが検知したイベントを示す値 @@ -717,8 +680,7 @@ class EmoWebhookIlluminance(BaseModel): class EmoRadar(BaseModel): - """レーダセンサが検知したイベントの情報 - """ + """レーダセンサが検知したイベントの情報""" begin: bool """BOCCO emoの近くに人がいる時に、true が設定されます。 @@ -738,8 +700,7 @@ class EmoRadar(BaseModel): class EmoWebhookRadar(BaseModel): - """Webhookで受信した内蔵レーダーセンサイベントに関する情報 - """ + """Webhookで受信した内蔵レーダーセンサイベントに関する情報""" radar: EmoRadar """レーダセンサが検知したイベントの情報 @@ -747,8 +708,7 @@ class EmoWebhookRadar(BaseModel): class EmoWebhookMessage(BaseModel): - """Webhookで受信した新規メッセージ受信イベントに関する情報 - """ + """Webhookで受信した新規メッセージ受信イベントに関する情報""" message: EmoMessageInfo """BOCCO emoが受信したメッセージを示す値 @@ -756,8 +716,7 @@ class EmoWebhookMessage(BaseModel): class EmoWebhookSensorMessage(BaseModel): - """センサの通知内容 - """ + """センサの通知内容""" sequence: int """通知された時間を示す値 @@ -789,8 +748,7 @@ class EmoWebhookSensorMessage(BaseModel): class EmoWebhookMovementSensor(BaseModel): - """Webhookで受信した振動センサ反応イベントに関する情報 - """ + """Webhookで受信した振動センサ反応イベントに関する情報""" movement_sensor: EmoWebhookSensorMessage """振動センサの通知内容 @@ -798,8 +756,7 @@ class EmoWebhookMovementSensor(BaseModel): class EmoWebhookLockSensor(BaseModel): - """Webhookで受信した鍵センサ反応イベントに関する情報 - """ + """Webhookで受信した鍵センサ反応イベントに関する情報""" lock_sensor: EmoWebhookSensorMessage """鍵センサの通知内容 @@ -807,8 +764,7 @@ class EmoWebhookLockSensor(BaseModel): class EmoWebhookHumanSensor(BaseModel): - """Webhookで受信した人感センサ反応イベントに関する情報 - """ + """Webhookで受信した人感センサ反応イベントに関する情報""" human_sensor: EmoWebhookSensorMessage """人感センサの通知内容 @@ -816,8 +772,7 @@ class EmoWebhookHumanSensor(BaseModel): class EmoWebhookRoomSensor(BaseModel): - """Webhookで受信した部屋センサ反応イベントに関する情報 - """ + """Webhookで受信した部屋センサ反応イベントに関する情報""" room_sensor: EmoWebhookSensorMessage """部屋センサの通知内容 @@ -825,8 +780,7 @@ class EmoWebhookRoomSensor(BaseModel): class EmoWebhookBody(BaseModel): - """受信したWebhookの内容 - """ + """受信したWebhookの内容""" request_id: str """リクエストの同一性を示す、一意の文字列 From 185ac98270667743c089a9f6cbe9009aba14f7c3 Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Wed, 15 Dec 2021 15:45:18 +0900 Subject: [PATCH 18/73] fix: Delete payment method --- emo_platform/api.py | 61 ----------------- emo_platform/api_async.py | 61 ----------------- emo_platform/response.py | 61 ----------------- examples/async_version/async_for_biz.py | 91 +++++++++++++++++++++++++ examples/for_biz.py | 89 ++++++++++++++++++++++++ 5 files changed, 180 insertions(+), 183 deletions(-) create mode 100644 examples/async_version/async_for_biz.py create mode 100644 examples/for_biz.py diff --git a/emo_platform/api.py b/emo_platform/api.py index 920e569..426c601 100644 --- a/emo_platform/api.py +++ b/emo_platform/api.py @@ -26,8 +26,6 @@ EmoMessageInfo, EmoMotionsInfo, EmoMsgsInfo, - EmoPaymentInfo, - EmoPaymentsInfo, EmoRoomInfo, EmoRoomSensorInfo, EmoSensorsInfo, @@ -998,65 +996,6 @@ def create_broadcast_msg(self, message: BroadcastMsg) -> EmoBroadcastMessage: response = self._post("/v1/broadcast_messages", json.dumps(payload)) return EmoBroadcastMessage(**response) - def get_payments_info(self) -> EmoPaymentsInfo: - """支払い情報の取得 - - 請求情報の一覧を取得します。 - - Returns - ------- - payments_info : EmoPaymentsInfo - 請求情報の一覧。 - - Raises - ---------- - EmoPlatformError - 関数内部で行っているGETの処理が失敗した場合。 - - Note - ---- - 呼び出しているAPI - https://platform-api.bocco.me/dashboard/api-docs#get-/v1/payments - - API呼び出し回数 - 1回 + 1回(access tokenが切れていた場合) - - """ - - response = self._get("/v1/payments") - return EmoPaymentsInfo(**response) - - def get_payment_info_detail(self, payment_id: int) -> EmoPaymentInfo: - """支払い情報の詳細の取得 - - Parameters - ---------- - payment_id : int - 詳細を取得したい支払い情報のid。 - - Returns - ------- - payments_info : EmoPaymentInfo - 請求情報の詳細。 - - Raises - ---------- - EmoPlatformError - 関数内部で行っているGETの処理が失敗した場合。 - - Note - ---- - 呼び出しているAPI - https://platform-api.bocco.me/dashboard/api-docs#get-/v1/payments/-payment_id- - - API呼び出し回数 - 1回 + 1回(access tokenが切れていた場合) - - """ - - response = self._get("/v1/payments/" + str(payment_id)) - return EmoPaymentInfo(**response) - class BizBasicClient(BizClient): """各種apiを呼び出す同期版のclient(Business Basic版) diff --git a/emo_platform/api_async.py b/emo_platform/api_async.py index 888021d..cef26a3 100644 --- a/emo_platform/api_async.py +++ b/emo_platform/api_async.py @@ -31,8 +31,6 @@ EmoMessageInfo, EmoMotionsInfo, EmoMsgsInfo, - EmoPaymentInfo, - EmoPaymentsInfo, EmoRoomInfo, EmoRoomSensorInfo, EmoSensorsInfo, @@ -935,65 +933,6 @@ async def create_broadcast_msg(self, message: BroadcastMsg) -> EmoBroadcastMessa response = await self._post("/v1/broadcast_messages", json.dumps(payload)) return EmoBroadcastMessage(**response) - async def get_payments_info(self) -> EmoPaymentsInfo: - """支払い情報の取得 - - 請求情報の一覧を取得します。 - - Returns - ------- - payments_info : EmoPaymentsInfo - 請求情報の一覧。 - - Raises - ---------- - EmoPlatformError - 関数内部で行っているGETの処理が失敗した場合。 - - Note - ---- - 呼び出しているAPI - https://platform-api.bocco.me/dashboard/api-docs#get-/v1/payments - - API呼び出し回数 - 1回 + 1回(access tokenが切れていた場合) - - """ - - response = await self._get("/v1/payments") - return EmoPaymentsInfo(**response) - - async def get_payment_info_detail(self, payment_id: int) -> EmoPaymentInfo: - """支払い情報の詳細の取得 - - Parameters - ---------- - payment_id : int - 詳細を取得したい支払い情報のid。 - - Returns - ------- - payments_info : EmoPaymentInfo - 請求情報の詳細。 - - Raises - ---------- - EmoPlatformError - 関数内部で行っているGETの処理が失敗した場合。 - - Note - ---- - 呼び出しているAPI - https://platform-api.bocco.me/dashboard/api-docs#get-/v1/payments/-payment_id- - - API呼び出し回数 - 1回 + 1回(access tokenが切れていた場合) - - """ - - response = await self._get("/v1/payments/" + str(payment_id)) - return EmoPaymentInfo(**response) - class BizBasicAsyncClient(BizAsyncClient): """各種apiを呼び出す非同期版のclient(Business Basic版) diff --git a/emo_platform/response.py b/emo_platform/response.py index d06a1c8..0f59f80 100644 --- a/emo_platform/response.py +++ b/emo_platform/response.py @@ -470,67 +470,6 @@ class EmoBroadcastInfo(BaseModel): """ -class EmoPaymentInfo(BaseModel): - """請求情報の詳細""" - - id: int - """請求情報のid - """ - - account_id: int - """BOCCOアカウントid - """ - - year: int - """請求年 - """ - - month: int - """請求月 - """ - - plan: str - """アカウントのプラン - """ - - payment_method: str - """支払い方法 - """ - - amount: int - """請求金額 - """ - - currency: str - """請求金額の単位 - """ - - due_date: int - """支払い期限 - """ - - paid: bool - """支払い済みか - """ - - created_at: int - """請求情報の作成時期 - """ - - updated_at: int - """請求情報の更新時期 - """ - - -class EmoPaymentsInfo(BaseModel): - """請求情報の一覧""" - - listing: Listing - payments: List[EmoPaymentInfo] - """請求情報の詳細の一覧 - """ - - class EmoKind(BaseModel): """様々な種別に関する情報""" diff --git a/examples/async_version/async_for_biz.py b/examples/async_version/async_for_biz.py new file mode 100644 index 0000000..42e5bad --- /dev/null +++ b/examples/async_version/async_for_biz.py @@ -0,0 +1,91 @@ +import asyncio + +from emo_platform import BizBasicAsyncClient, BizAdvancedAsyncClient +from emo_platform.models import AccountInfo, BroadcastMsg + +# Your api key to use biz version +api_key = "" + +client = BizBasicAsyncClient(api_key=api_key) +# client = BizAdvancedAsyncClient(api_key=api_key) + +async def main(): + await get_account_info() + + await delete_account_info() + + account_info = AccountInfo( + name = "ユカイ太郎", + name_furigana = "ゆかいたろう", + organization_name = "ユカイ工学株式会社", + organization_unit_name = "ソフトウェア事業部", + phone_number = "01200001111" + ) + await change_account_info(account_info) + + broadcast_msg = BroadcastMsg( + title = "テスト", + text = "テスト", + executed_at = 1819300000, + immediate = True + ) + await create_broadcast_msg(broadcast_msg) + + await get_broadcast_msgs() + + +async def get_account_info(): + print("\n" + "=" * 20 + " get account info " + "=" * 20) + account_info = await client.get_account_info() + print("account_id:", account_info.account_id) + print("name:", account_info.name) + print("name_furigana:", account_info.name_furigana) + print("email:", account_info.email) + print("organization_name:", account_info.organization_name) + print("organization_unit_name:", account_info.organization_unit_name) + print("phone_number:", account_info.phone_number) + print("plan:", account_info.plan) + +async def delete_account_info(): + try: + await client.delete_account_info() + except Exception as e: + print("\n" + "=" * 20 + " delete account info " + "=" * 20) + print(e) + +async def change_account_info(account_info): + print("\n" + "=" * 20 + " change account info " + "=" * 20) + account_info = await client.change_account_info(account_info) + print("account_id:", account_info.account_id) + print("name:", account_info.name) + print("name_furigana:", account_info.name_furigana) + print("email:", account_info.email) + print("organization_name:", account_info.organization_name) + print("organization_unit_name:", account_info.organization_unit_name) + print("phone_number:", account_info.phone_number) + print("plan:", account_info.plan) + +async def create_broadcast_msg(broadcast_msg): + print("\n" + "=" * 20 + " create broadcast message" + "=" * 20) + broadcast_msg = await client.create_broadcast_msg(broadcast_msg) + print("id: ", broadcast_msg.id) + print("title: ", broadcast_msg.title) + print("text: ", broadcast_msg.text) + print("executed_at: ", broadcast_msg.executed_at) + print("finished: ", broadcast_msg.finished) + +async def get_broadcast_msgs(): + print("\n" + "=" * 20 + " get broadcast msgs list " + "=" * 20) + broadcast_msgs_list = await client.get_broadcast_msgs_list() + print("listing: ", broadcast_msgs_list.listing) + print("messages: ", broadcast_msgs_list.messages) + if len(broadcast_msgs_list.messages) != 0: + message_id = broadcast_msgs_list.messages[0].id + print("\n" + "=" * 20 + " get broadcast msg detail " + "=" * 20) + broadcast_msg = await client.get_broadcast_msg_details(message_id) + print("messages: ", broadcast_msg.message) + print("details: ", broadcast_msg.details) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/for_biz.py b/examples/for_biz.py new file mode 100644 index 0000000..0560184 --- /dev/null +++ b/examples/for_biz.py @@ -0,0 +1,89 @@ +from emo_platform import BizBasicClient, BizAdvancedClient +from emo_platform.models import AccountInfo, BroadcastMsg + +# Your api key to use biz version +api_key = "" + +client = BizBasicClient(api_key=api_key) +# client = BizAdvancedClient(api_key=api_key) + +def main(): + get_account_info() + + delete_account_info() + + account_info = AccountInfo( + name = "ユカイ太郎", + name_furigana = "ゆかいたろう", + organization_name = "ユカイ工学株式会社", + organization_unit_name = "ソフトウェア事業部", + phone_number = "01200001111" + ) + change_account_info(account_info) + + broadcast_msg = BroadcastMsg( + title = "テスト", + text = "テスト", + executed_at = 1819300000, + immediate = True + ) + create_broadcast_msg(broadcast_msg) + + get_broadcast_msgs() + + +def get_account_info(): + print("\n" + "=" * 20 + " get account info " + "=" * 20) + account_info = client.get_account_info() + print("account_id:", account_info.account_id) + print("name:", account_info.name) + print("name_furigana:", account_info.name_furigana) + print("email:", account_info.email) + print("organization_name:", account_info.organization_name) + print("organization_unit_name:", account_info.organization_unit_name) + print("phone_number:", account_info.phone_number) + print("plan:", account_info.plan) + +def delete_account_info(): + try: + client.delete_account_info() + except Exception as e: + print("\n" + "=" * 20 + " delete account info " + "=" * 20) + print(e) + +def change_account_info(account_info): + print("\n" + "=" * 20 + " change account info " + "=" * 20) + account_info = client.change_account_info(account_info) + print("account_id:", account_info.account_id) + print("name:", account_info.name) + print("name_furigana:", account_info.name_furigana) + print("email:", account_info.email) + print("organization_name:", account_info.organization_name) + print("organization_unit_name:", account_info.organization_unit_name) + print("phone_number:", account_info.phone_number) + print("plan:", account_info.plan) + +def create_broadcast_msg(broadcast_msg): + print("\n" + "=" * 20 + " create broadcast message" + "=" * 20) + broadcast_msg = client.create_broadcast_msg(broadcast_msg) + print("id: ", broadcast_msg.id) + print("title: ", broadcast_msg.title) + print("text: ", broadcast_msg.text) + print("executed_at: ", broadcast_msg.executed_at) + print("finished: ", broadcast_msg.finished) + +def get_broadcast_msgs(): + print("\n" + "=" * 20 + " get broadcast msgs list " + "=" * 20) + broadcast_msgs_list = client.get_broadcast_msgs_list() + print("listing: ", broadcast_msgs_list.listing) + print("messages: ", broadcast_msgs_list.messages) + if len(broadcast_msgs_list.messages) != 0: + message_id = broadcast_msgs_list.messages[0].id + print("\n" + "=" * 20 + " get broadcast msg detail " + "=" * 20) + broadcast_msg = client.get_broadcast_msg_details(message_id) + print("messages: ", broadcast_msg.message) + print("details: ", broadcast_msg.details) + + +if __name__ == "__main__": + main() From c72eea4c797563714e87b7bd35ec14582a9df44c Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Wed, 15 Dec 2021 16:09:39 +0900 Subject: [PATCH 19/73] feat: Add docs to receiver in EmoWebhookBody --- emo_platform/response.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/emo_platform/response.py b/emo_platform/response.py index 0f59f80..08a769f 100644 --- a/emo_platform/response.py +++ b/emo_platform/response.py @@ -777,3 +777,11 @@ class EmoWebhookBody(BaseModel): """ receiver: str + """Webhook受信者を示すid + + Personal版の場合 + :func:`get_account_info` から確認できるBOCCOアカウントのuuid + Business版の場合 + 法人アカウントでログインした時の `ダッシュボード `_ + から確認できる法人向けAPIキーと同じ文字列 + """ \ No newline at end of file From d20caab84f9c5d5d3852e0bdb8e7b41ec996432a Mon Sep 17 00:00:00 2001 From: Keita Ito Date: Wed, 15 Dec 2021 16:11:39 +0900 Subject: [PATCH 20/73] feat: Update document --- docs-src/conf.py | 4 +- docs-src/emo_platform.rst | 4 - docs-src/modules.rst | 1 + docs/.doctrees/emo_platform.doctree | Bin 858630 -> 1339827 bytes docs/.doctrees/environment.pickle | Bin 62921 -> 84478 bytes docs/.doctrees/modules.doctree | Bin 2717 -> 2731 bytes docs/_sources/emo_platform.rst.txt | 4 - docs/_sources/modules.rst.txt | 1 + docs/emo_platform.html | 4246 +++++++++++++++++++-------- docs/genindex.html | 346 ++- docs/index.html | 1 - docs/modules.html | 2 +- docs/objects.inv | Bin 1915 -> 2414 bytes docs/py-modindex.html | 11 +- docs/searchindex.js | 2 +- 15 files changed, 3303 insertions(+), 1319 deletions(-) diff --git a/docs-src/conf.py b/docs-src/conf.py index 049d1b2..0f1c404 100644 --- a/docs-src/conf.py +++ b/docs-src/conf.py @@ -54,4 +54,6 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] -html_style = "css/custom_theme.css" \ No newline at end of file +html_style = "css/custom_theme.css" + +autodoc_member_order = 'bysource' \ No newline at end of file diff --git a/docs-src/emo_platform.rst b/docs-src/emo_platform.rst index 53e6950..0075d33 100644 --- a/docs-src/emo_platform.rst +++ b/docs-src/emo_platform.rst @@ -1,15 +1,11 @@ emo\_platform package ===================== -Submodules ----------- - emo\_platform.api module ------------------------ .. automodule:: emo_platform.api :members: - :undoc-members: :show-inheritance: emo\_platform.api\_async module diff --git a/docs-src/modules.rst b/docs-src/modules.rst index 3cc9ea9..961e511 100644 --- a/docs-src/modules.rst +++ b/docs-src/modules.rst @@ -5,3 +5,4 @@ emo-platform-api-python :maxdepth: 4 emo_platform + memo diff --git a/docs/.doctrees/emo_platform.doctree b/docs/.doctrees/emo_platform.doctree index 85e528f71f74ac29003263b587516b55cd09806a..4e36b05f9f8a8b7fb5fc0624aabc3eed1d684a94 100644 GIT binary patch literal 1339827 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π-1>te#w9Ochm{#%gHU`F>(&@>dT6cUCR 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 XO3ucCLVc=nijsBU5JbG8vh05Wh!Qgn literal 858630 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%0A9)f4=pbxf5!F` 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

257AZR)k^5# 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 diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle index c11abb00bc8ab207db6eeb326fa7138b8f1d4b82..62653a0cfa383d96f6fd6f97c0ccf2d2295158b1 100644 GIT binary patch literal 84478 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 literal 62921 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 diff --git a/docs/.doctrees/modules.doctree b/docs/.doctrees/modules.doctree index f0bb3738f049f92cee5ce4260c3b790e5a6d9e2d..a71f6df48c25cc0a8b082b073a26fb330bc0cb80 100644 GIT binary patch delta 113 zcmbO$x>}T_fpzMFjVz)}rW$@dJgK?)@dY`FC29FZxl`Jv`1P>l0)>FA)E=J9yyTqH zl+?7$oYdkeu~RfM95S3zH#;y{GBY-Au43K9EEAm(QQX6smzbMcQdt00R68Xj+OIf6 N5lBaD_TUU<1OQFMDiHtx delta 99 zcmZ22I#-mXfpzMnjVz)}>V7>usk!;_1v!Z&Y57IDQ`)8^_V8rpCFhi;q^4!&q!v$! zos!{@xY>`%l9{o7a|i1tW|_#0u;L!hyu{qplF9<0irOg|k$%M)iaContents:

-
  • send_motion() (emo_platform.api.Room method) +
  • send_motion() (emo_platform.api.BizBasicRoom method)
  • send_msg() (emo_platform.api.Room method) @@ -690,10 +918,14 @@

    S

  • (emo_platform.api_async.AsyncRoom method)
  • -
  • send_original_motion() (emo_platform.api.Room method) +
  • send_original_motion() (emo_platform.api.BizBasicRoom method)
  • send_stamp() (emo_platform.api.Room method) @@ -730,16 +962,28 @@

    S

  • stamps (emo_platform.response.EmoStampsInfo attribute)
  • -
  • start_webhook_event() (emo_platform.api.Client method) +
  • start_webhook_event() (emo_platform.api.BizBasicClient method)
  • status (emo_platform.response.EmoWebhookInfo attribute) +
  • +
  • status_code (emo_platform.response.EmoBroadcastMessageDetail attribute)
  • stop_webhook_event() (emo_platform.api_async.AsyncClient method)
  • +
  • success (emo_platform.response.EmoBroadcastMessage attribute) + +
  • summary (emo_platform.response.EmoStamp attribute)
  • @@ -752,6 +996,12 @@

    T

  • temperature (emo_platform.response.EmoRoomSensorEvent attribute)
  • +
  • text (emo_platform.models.BroadcastMsg attribute) + +
  • time (emo_platform.response.EmoTime attribute)
  • timestamp (emo_platform.response.EmoWebhookBody attribute) @@ -760,7 +1010,15 @@

    T

    - +