diff --git a/bumper/mqttserver.py b/bumper/mqttserver.py index 31bc7b2..0d21d75 100644 --- a/bumper/mqttserver.py +++ b/bumper/mqttserver.py @@ -152,7 +152,10 @@ class MQTTHelperBot: assert self._client is not None try: - topic = f"iot/p2p/{cmdjson['cmdName']}/helperbot/bumper/helperbot/{cmdjson['toId']}/{cmdjson['toType']}/{cmdjson['toRes']}/q/{request_id}/{cmdjson['payloadType']}" + topic = ( + f"iot/p2p/{cmdjson['cmdName']}/helperbot/bumper/helperbot/{cmdjson['toId']}/" + f"{cmdjson['toType']}/{cmdjson['toRes']}/q/{request_id}/{cmdjson['payloadType']}" + ) command_dto = CommandDto(cmdjson["payloadType"]) self._commands[request_id] = command_dto diff --git a/bumper/web/images/__init__.py b/bumper/web/images/__init__.py new file mode 100644 index 0000000..fd32b16 --- /dev/null +++ b/bumper/web/images/__init__.py @@ -0,0 +1,18 @@ +import logging +import os + +from aiohttp.web_exceptions import HTTPInternalServerError +from aiohttp.web_fileresponse import FileResponse +from aiohttp.web_request import Request + + +async def get_bot_image(_: Request) -> FileResponse: + """Return image of bot.""" + try: + return FileResponse( + os.path.join(os.path.dirname(__file__), "robotvac_image.jpg") + ) + except Exception: # pylint: disable=broad-except + logging.error("Unexpected exception occurred", exc_info=True) + + raise HTTPInternalServerError diff --git a/bumper/web/plugins/__init__.py b/bumper/web/plugins/__init__.py index 9661293..0e80435 100644 --- a/bumper/web/plugins/__init__.py +++ b/bumper/web/plugins/__init__.py @@ -5,11 +5,15 @@ from abc import abstractmethod from glob import glob from os.path import dirname, isfile, join from types import ModuleType -from typing import Iterable +from typing import Any, Iterable from aiohttp import web +from aiohttp.web_response import Response from aiohttp.web_routedef import AbstractRouteDef +from bumper.models import RETURN_API_SUCCESS +from bumper.util import get_current_time_as_millis + class WebserverPlugin: """Abstract webserver plugin.""" @@ -70,3 +74,15 @@ def add_plugins(app: web.Application) -> None: continue _add_routes(app, obj, plugin_module_name) + + +def get_success_response(data: Any) -> Response: + body = { + "code": RETURN_API_SUCCESS, + "data": data, + "msg": "操作成功", + "success": True, + "time": get_current_time_as_millis(), + } + + return web.json_response(body) diff --git a/bumper/web/plugins/api/pim.py b/bumper/web/plugins/api/pim.py index 6160126..ab6c771 100644 --- a/bumper/web/plugins/api/pim.py +++ b/bumper/web/plugins/api/pim.py @@ -1,15 +1,14 @@ """Pim plugin module.""" import json import logging -import os from typing import Iterable from aiohttp import web from aiohttp.web_routedef import AbstractRouteDef -from bumper import bumper_dir from bumper.models import RETURN_API_SUCCESS, EcoVacsHomeProducts +from ...images import get_bot_image from .. import WebserverPlugin @@ -28,7 +27,7 @@ class PimPlugin(WebserverPlugin): web.route( "*", "/pim/file/get/{id}", - self.handle_pimFile, + get_bot_image, ), web.route( "*", @@ -63,19 +62,6 @@ class PimPlugin(WebserverPlugin): except Exception as e: logging.exception(f"{e}") - async def handle_pimFile(self, request): - try: - fileID = request.match_info.get("id", "") - - return web.FileResponse( - os.path.join( - bumper_dir, "bumper", "web", "images", "robotvac_image.jpg" - ) - ) - - except Exception as e: - logging.exception(f"{e}") - async def handle_getConfignetAll(self, request): try: body = confignetAllResponse diff --git a/bumper/web/plugins/upload/global.py b/bumper/web/plugins/upload/global.py index 7925e75..2012aaf 100644 --- a/bumper/web/plugins/upload/global.py +++ b/bumper/web/plugins/upload/global.py @@ -1,20 +1,14 @@ """Global plugin module.""" -import logging -import os from typing import Iterable from aiohttp import web -from aiohttp.web_exceptions import HTTPInternalServerError -from aiohttp.web_request import Request -from aiohttp.web_response import StreamResponse from aiohttp.web_routedef import AbstractRouteDef -from bumper import bumper_dir +from bumper.web.images import get_bot_image from .. import WebserverPlugin -# pylint: disable=no-self-use class GlobalPlugin(WebserverPlugin): """Global plugin.""" @@ -24,19 +18,7 @@ class GlobalPlugin(WebserverPlugin): return [ web.route( "*", - "/global/{year}/{month}/{day}/{fileid}", - self._handle_upload_global_file, + "/global/{year}/{month}/{day}/{id}", + get_bot_image, ), ] - - async def _handle_upload_global_file(self, _: Request) -> StreamResponse: - try: - return web.FileResponse( - os.path.join( - bumper_dir, "bumper", "web", "images", "robotvac_image.jpg" - ) - ) - except Exception: # pylint: disable=broad-except - logging.error("Unexpected exception occurred", exc_info=True) - - raise HTTPInternalServerError diff --git a/bumper/web/plugins/v1/private/__init__.py b/bumper/web/plugins/v1/private/__init__.py index a0a0db2..a7b8a5d 100644 --- a/bumper/web/plugins/v1/private/__init__.py +++ b/bumper/web/plugins/v1/private/__init__.py @@ -1 +1,3 @@ """Private plugins module.""" + +BASE_URL = "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/" diff --git a/bumper/web/plugins/v1/private/ad.py b/bumper/web/plugins/v1/private/ad.py index 858e2f3..010d33e 100644 --- a/bumper/web/plugins/v1/private/ad.py +++ b/bumper/web/plugins/v1/private/ad.py @@ -1,14 +1,13 @@ """Ad plugin module.""" -import logging from typing import Iterable from aiohttp import web +from aiohttp.web_request import Request +from aiohttp.web_response import Response from aiohttp.web_routedef import AbstractRouteDef -from bumper.models import RETURN_API_SUCCESS -from bumper.util import get_current_time_as_millis - -from ... import WebserverPlugin +from ... import WebserverPlugin, get_success_response +from . import BASE_URL class AdPlugin(WebserverPlugin): @@ -20,42 +19,16 @@ class AdPlugin(WebserverPlugin): return [ web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/ad/getAdByPositionType", - self.handle_getAdByPositionType, + f"{BASE_URL}ad/getAdByPositionType", + _handle, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/ad/getBootScreen", - self.handle_getBootScreen, + f"{BASE_URL}ad/getBootScreen", + _handle, ), ] - async def handle_getAdByPositionType(self, request): # EcoVacs Home - try: - body = { - "code": RETURN_API_SUCCESS, - "data": None, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - return web.json_response(body) - - except Exception as e: - logging.exception(f"{e}") - - async def handle_getBootScreen(self, request): # EcoVacs Home - try: - body = { - "code": RETURN_API_SUCCESS, - "data": None, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) - - except Exception as e: - logging.exception(f"{e}") +async def _handle(_: Request) -> Response: + return get_success_response(None) diff --git a/bumper/web/plugins/v1/private/campaign.py b/bumper/web/plugins/v1/private/campaign.py index 5abe5c9..ef88e95 100644 --- a/bumper/web/plugins/v1/private/campaign.py +++ b/bumper/web/plugins/v1/private/campaign.py @@ -1,15 +1,16 @@ """Campaign plugin module.""" -import logging from datetime import datetime, timedelta from typing import Iterable from aiohttp import web +from aiohttp.web_request import Request +from aiohttp.web_response import Response from aiohttp.web_routedef import AbstractRouteDef -from bumper.models import RETURN_API_SUCCESS from bumper.util import convert_to_millis, get_current_time_as_millis -from ... import WebserverPlugin +from ... import WebserverPlugin, get_success_response +from . import BASE_URL class CampaignPlugin(WebserverPlugin): @@ -21,33 +22,21 @@ class CampaignPlugin(WebserverPlugin): return [ web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/campaign/homePageAlert", - self.handle_homePageAlert, - name="v1_campaign_homePageAlert", + f"{BASE_URL}campaign/homePageAlert", + _handle_home_page_alert, ), ] - async def handle_homePageAlert(self, request): - try: - nextAlert = convert_to_millis( - (datetime.now() + timedelta(hours=12)).timestamp() - ) - body = { - "code": RETURN_API_SUCCESS, - "data": { - "clickSchemeUrl": None, - "clickWebUrl": None, - "hasCampaign": "N", - "imageUrl": None, - "nextAlertTime": nextAlert, - "serverTime": get_current_time_as_millis(), - }, - "msg": "操作成功", - "time": get_current_time_as_millis(), - } - - return web.json_response(body) - - except Exception as e: - logging.exception(f"{e}") +async def _handle_home_page_alert(_: Request) -> Response: + nextAlert = convert_to_millis((datetime.now() + timedelta(hours=12)).timestamp()) + return get_success_response( + { + "clickSchemeUrl": None, + "clickWebUrl": None, + "hasCampaign": "N", + "imageUrl": None, + "nextAlertTime": nextAlert, + "serverTime": get_current_time_as_millis(), + } + ) diff --git a/bumper/web/plugins/v1/private/common.py b/bumper/web/plugins/v1/private/common.py index 35db89c..f25b995 100644 --- a/bumper/web/plugins/v1/private/common.py +++ b/bumper/web/plugins/v1/private/common.py @@ -10,10 +10,10 @@ from aiohttp.web_request import Request from aiohttp.web_response import Response from aiohttp.web_routedef import AbstractRouteDef -from bumper.models import RETURN_API_SUCCESS from bumper.util import get_current_time_as_millis -from ... import WebserverPlugin +from ... import WebserverPlugin, get_success_response +from . import BASE_URL class CommonPlugin(WebserverPlugin): @@ -22,55 +22,53 @@ class CommonPlugin(WebserverPlugin): @property def routes(self) -> Iterable[AbstractRouteDef]: """Plugin routes.""" - base_url = "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/common/" return [ web.route( "*", - f"{base_url}checkAPPVersion", + f"{BASE_URL}common/checkAPPVersion", _handle_check_app_version, ), web.route( "*", - f"{base_url}checkVersion", + f"{BASE_URL}common/checkVersion", _handle_check_version, ), web.route( "*", - f"{base_url}uploadDeviceInfo", + f"{BASE_URL}common/uploadDeviceInfo", _handle_upload_device_info, ), web.route( "*", - f"{base_url}getSystemReminder", + f"{BASE_URL}common/getSystemReminder", _handle_get_system_reminder, ), web.route( "*", - f"{base_url}getConfig", + f"{BASE_URL}common/getConfig", _handle_get_config, ), web.route( "*", - f"{base_url}getAreas", + f"{BASE_URL}common/getAreas", _handle_get_areas, ), web.route( "*", - f"{base_url}getAgreementURLBatch", + f"{BASE_URL}common/getAgreementURLBatch", _handle_get_agreement_url_batch, ), web.route( "*", - f"{base_url}getTimestamp", + f"{BASE_URL}common/getTimestamp", _handle_get_timestamp, ), ] async def _handle_check_version(_: Request) -> Response: - body = { - "code": RETURN_API_SUCCESS, - "data": { + return get_success_response( + { "c": None, "img": None, "r": 0, @@ -78,18 +76,13 @@ async def _handle_check_version(_: Request) -> Response: "u": None, "ut": 0, "v": None, - }, - "msg": "操作成功", - "time": get_current_time_as_millis(), - } - - return web.json_response(body) + } + ) async def _handle_check_app_version(_: Request) -> Response: - body = { - "code": RETURN_API_SUCCESS, - "data": { + return get_success_response( + { "c": None, "downPageUrl": None, "img": None, @@ -99,44 +92,25 @@ async def _handle_check_app_version(_: Request) -> Response: "u": None, "ut": 0, "v": None, - }, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) + } + ) async def _handle_upload_device_info(_: Request) -> Response: - body = { - "code": RETURN_API_SUCCESS, - "data": None, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) + return get_success_response(None) async def _handle_get_system_reminder(_: Request) -> Response: - body = { - "code": RETURN_API_SUCCESS, - "data": { + return get_success_response( + { "iosGradeTime": {"iodGradeFlag": "N"}, "openNotification": { "openNotificationContent": None, "openNotificationFlag": "N", "openNotificationTitle": None, }, - }, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) + } + ) async def _handle_get_config(request: Request) -> Response: @@ -145,15 +119,7 @@ async def _handle_get_config(request: Request) -> Response: for key in request.query["keys"].split(","): data.append({"key": key, "value": "Y"}) - body = { - "code": RETURN_API_SUCCESS, - "data": data, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) + return get_success_response(data) except Exception: # pylint: disable=broad-except logging.error("Unexpected exception occurred", exc_info=True) @@ -162,16 +128,11 @@ async def _handle_get_config(request: Request) -> Response: async def _handle_get_areas(_: Request) -> Response: try: - with open(os.path.join(os.path.dirname(__file__), "area.json")) as file: - body = { - "code": RETURN_API_SUCCESS, - "data": json.load(file), - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) + with open( + os.path.join(os.path.dirname(__file__), "common_area.json"), + encoding="utf-8", + ) as file: + return get_success_response(json.load(file)) except Exception: # pylint: disable=broad-except logging.error("Unexpected exception occurred", exc_info=True) @@ -179,9 +140,8 @@ async def _handle_get_areas(_: Request) -> Response: async def _handle_get_agreement_url_batch(_: Request) -> Response: - body = { - "code": RETURN_API_SUCCESS, - "data": [ + return get_success_response( + [ { "acceptTime": None, "force": None, @@ -198,23 +158,9 @@ async def _handle_get_agreement_url_batch(_: Request) -> Response: "url": "https://gl-eu-wap.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN", "version": "1.03", }, - ], - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) + ] + ) async def _handle_get_timestamp(_: Request) -> Response: - time = get_current_time_as_millis() - body = { - "code": RETURN_API_SUCCESS, - "data": {"timestamp": time}, - "msg": "操作成功", - "success": True, - "time": time, - } - - return web.json_response(body) + return get_success_response({"timestamp": get_current_time_as_millis()}) diff --git a/bumper/web/plugins/v1/private/area.json b/bumper/web/plugins/v1/private/common_area.json similarity index 100% rename from bumper/web/plugins/v1/private/area.json rename to bumper/web/plugins/v1/private/common_area.json diff --git a/bumper/web/plugins/v1/private/message.py b/bumper/web/plugins/v1/private/message.py index 828bf08..cf04c9e 100644 --- a/bumper/web/plugins/v1/private/message.py +++ b/bumper/web/plugins/v1/private/message.py @@ -1,13 +1,12 @@ -import logging from typing import Iterable from aiohttp import web +from aiohttp.web_request import Request +from aiohttp.web_response import Response from aiohttp.web_routedef import AbstractRouteDef -from bumper.models import RETURN_API_SUCCESS -from bumper.util import get_current_time_as_millis - -from ... import WebserverPlugin +from ... import WebserverPlugin, get_success_response +from . import BASE_URL class MessagePlugin(WebserverPlugin): @@ -19,42 +18,20 @@ class MessagePlugin(WebserverPlugin): return [ web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/message/hasUnreadMsg", - self.handle_hasUnreadMessage, + f"{BASE_URL}message/hasUnreadMsg", + _handle_has_unread_message, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/message/getMsgList", - self.handle_getMsgList, + f"{BASE_URL}message/getMsgList", + _handle_get_msg_list, ), ] - async def handle_hasUnreadMessage(self, request): # EcoVacs Home - try: - body = { - "code": RETURN_API_SUCCESS, - "data": "N", - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - return web.json_response(body) +async def _handle_has_unread_message(_: Request) -> Response: + return get_success_response("N") - except Exception as e: - logging.exception(f"{e}") - async def handle_getMsgList(self, request): # EcoVacs Home - try: - body = { - "code": RETURN_API_SUCCESS, - "data": {"hasNextPage": 0, "items": []}, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) - - except Exception as e: - logging.exception(f"{e}") +async def _handle_get_msg_list(_: Request) -> Response: + return get_success_response({"hasNextPage": 0, "items": []}) diff --git a/bumper/web/plugins/v1/private/shop.py b/bumper/web/plugins/v1/private/shop.py index 3c4b6ca..092ec89 100644 --- a/bumper/web/plugins/v1/private/shop.py +++ b/bumper/web/plugins/v1/private/shop.py @@ -1,14 +1,13 @@ """Shop plugin module.""" -import logging from typing import Iterable from aiohttp import web +from aiohttp.web_request import Request +from aiohttp.web_response import Response from aiohttp.web_routedef import AbstractRouteDef -from bumper.models import RETURN_API_SUCCESS -from bumper.util import get_current_time_as_millis - -from ... import WebserverPlugin +from ... import WebserverPlugin, get_success_response +from . import BASE_URL class ShopPlugin(WebserverPlugin): @@ -20,27 +19,18 @@ class ShopPlugin(WebserverPlugin): return [ web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/shop/getCnWapShopConfig", - self.handle_getCnWapShopConfig, + f"{BASE_URL}shop/getCnWapShopConfig", + _handle_get_cn_wap_shop_config, ), ] - async def handle_getCnWapShopConfig(self, request): # EcoVacs Home - try: - body = { - "code": RETURN_API_SUCCESS, - "data": { - "myShopShowFlag": "N", - "myShopUrl": "", - "shopIndexShowFlag": "N", - "shopIndexUrl": "", - }, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - return web.json_response(body) - - except Exception as e: - logging.exception(f"{e}") +async def _handle_get_cn_wap_shop_config(_: Request) -> Response: + return get_success_response( + { + "myShopShowFlag": "N", + "myShopUrl": "", + "shopIndexShowFlag": "N", + "shopIndexUrl": "", + } + ) diff --git a/bumper/web/plugins/v1/private/user.py b/bumper/web/plugins/v1/private/user.py index b607e4a..2ec4b27 100644 --- a/bumper/web/plugins/v1/private/user.py +++ b/bumper/web/plugins/v1/private/user.py @@ -1,14 +1,15 @@ -import logging +"""User plugin module.""" from typing import Iterable from aiohttp import web +from aiohttp.web_request import Request +from aiohttp.web_response import Response from aiohttp.web_routedef import AbstractRouteDef -from bumper.models import RETURN_API_SUCCESS -from bumper.util import get_current_time_as_millis from bumper.web import auth_util -from ... import WebserverPlugin +from ... import WebserverPlugin, get_success_response +from . import BASE_URL class UserPlugin(WebserverPlugin): @@ -20,199 +21,148 @@ class UserPlugin(WebserverPlugin): return [ web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/login", + f"{BASE_URL}user/login", auth_util.login, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/checkLogin", + f"{BASE_URL}user/checkLogin", auth_util.login, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/getAuthCode", + f"{BASE_URL}user/getAuthCode", auth_util.get_authcode, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/logout", + f"{BASE_URL}user/logout", auth_util.logout, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/checkAgreement", - self.handle_checkAgreement, + f"{BASE_URL}user/checkAgreement", + _handle_check_agreement, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/checkAgreementBatch", - self.handle_checkAgreement, + f"{BASE_URL}user/checkAgreementBatch", + _handle_check_agreement, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/getUserAccountInfo", + f"{BASE_URL}user/getUserAccountInfo", auth_util.get_user_account_info, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/getUserMenuInfo", - self.handle_getUserMenuInfo, + f"{BASE_URL}user/getUserMenuInfo", + _handle_get_user_menu_info, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/changeArea", - self.handle_changeArea, + f"{BASE_URL}user/changeArea", + _handle_change_area, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/queryChangeArea", - self.handle_changeArea, + f"{BASE_URL}user/queryChangeArea", + _handle_change_area, ), web.route( "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/acceptAgreementBatch", - self.handle_acceptAgreementBatch, + f"{BASE_URL}user/acceptAgreementBatch", + _handle_accept_agreement_batch, ), - # Direct register from app: - # /{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/directRegister - # Register by email - # /registerByEmail ] - async def handle_checkAgreement(self, request): - try: - apptype = request.match_info.get("apptype", "") - if "global_" in apptype: - body = { - "code": RETURN_API_SUCCESS, - "data": [ - { - "force": "N", - "id": "20180804040641_7d746faf18b8cb22a50d145598fe4c90", - "type": "USER", - "url": "https://bumper.ecovacs.com/content/agreement?id=20180804040641_7d746faf18b8cb22a50d145598fe4c90&language=EN", # "https://gl-us-wap.ecovacs.com/content/agreement?id=20180804040641_7d746faf18b8cb22a50d145598fe4c90&language=EN - "version": "1.01", - }, - { - "force": "N", - "id": "20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac", - "type": "PRIVACY", - "url": "https://bumper.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN", # "https://gl-us-wap.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN" - "version": "1.01", - }, - ], - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - else: - body = { - "code": RETURN_API_SUCCESS, - "data": [], - "msg": "操作成功", - "time": get_current_time_as_millis(), - } - return web.json_response(body) +async def _handle_check_agreement(request: Request) -> Response: + apptype = request.match_info.get("apptype", "") + data = [] + if "global_" in apptype: + data = [ + { + "force": "N", + "id": "20180804040641_7d746faf18b8cb22a50d145598fe4c90", + "type": "USER", + "url": "https://bumper.ecovacs.com/content/agreement?id=20180804040641_7d746faf18b8cb22a50d145598fe4c90&language=EN", # "https://gl-us-wap.ecovacs.com/content/agreement?id=20180804040641_7d746faf18b8cb22a50d145598fe4c90&language=EN + "version": "1.01", + }, + { + "force": "N", + "id": "20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac", + "type": "PRIVACY", + "url": "https://bumper.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN", # "https://gl-us-wap.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN" + "version": "1.01", + }, + ] - except Exception as e: - logging.exception(f"{e}") + return get_success_response(data) - async def handle_getUserMenuInfo(self, request): - try: - apptype = request.match_info.get("apptype", "") - body = { - "code": "0000", - "data": [ + +async def _handle_get_user_menu_info(_: Request) -> Response: + return get_success_response( + [ + { + "menuItems": [ { - "menuItems": [ - { - "clickAction": 1, - "clickUri": "https://ecovacs.zendesk.com/hc/en-us", - "menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/2019121603180741b73907046e742b80e8fe4a90fe2498.png", - "menuId": "20191216031849_4d744630f7ad2f5208a4b8051be61d10", - "menuName": "Help & Feedback", - "paramsJson": "", - } - ], - "menuPositionKey": "A_FIRST", - }, - { - "menuItems": [ - { - "clickAction": 3, - "clickUri": "robotShare", - "menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/2019121603284185e632ec6c5da10bd82119d7047a1f9e.png", - "menuId": "20191216032853_5fac4cc9cbd0e166dfa951485d1d8cc4", - "menuName": "Share Robot", - "paramsJson": "", - } - ], - "menuPositionKey": "B_SECOND", - }, - { - "menuItems": [ - { - "clickAction": 3, - "clickUri": "config", - "menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/201912160325324068da4e4a09b8c3973db162e84784d5.png", - "menuId": "20191216032545_ebea0fbb4cb02d9c2fec5bdf3371bc2d", - "menuName": "Settings", - "paramsJson": "", - } - ], - "menuPositionKey": "C_THIRD", - }, - { - "menuItems": [ - { - "clickAction": 1, - "clickUri": "https://bumper.ecovacs.com/", - "menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/201912160325324068da4e4a09b8c3973db162e84784d5.png", - "menuId": "20191216032545_ebea0fbb4cb02d9c2fec5bdf3371bc2c", - "menuName": "Bumper Status", - "paramsJson": "", - } - ], - "menuPositionKey": "D_FOURTH", - }, + "clickAction": 1, + "clickUri": "https://ecovacs.zendesk.com/hc/en-us", + "menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/2019121603180741b73907046e742b80e8fe4a90fe2498.png", + "menuId": "20191216031849_4d744630f7ad2f5208a4b8051be61d10", + "menuName": "Help & Feedback", + "paramsJson": "", + } ], - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } + "menuPositionKey": "A_FIRST", + }, + { + "menuItems": [ + { + "clickAction": 3, + "clickUri": "robotShare", + "menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/2019121603284185e632ec6c5da10bd82119d7047a1f9e.png", + "menuId": "20191216032853_5fac4cc9cbd0e166dfa951485d1d8cc4", + "menuName": "Share Robot", + "paramsJson": "", + } + ], + "menuPositionKey": "B_SECOND", + }, + { + "menuItems": [ + { + "clickAction": 3, + "clickUri": "config", + "menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/201912160325324068da4e4a09b8c3973db162e84784d5.png", + "menuId": "20191216032545_ebea0fbb4cb02d9c2fec5bdf3371bc2d", + "menuName": "Settings", + "paramsJson": "", + } + ], + "menuPositionKey": "C_THIRD", + }, + { + "menuItems": [ + { + "clickAction": 1, + "clickUri": "https://bumper.ecovacs.com/", + "menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/201912160325324068da4e4a09b8c3973db162e84784d5.png", + "menuId": "20191216032545_ebea0fbb4cb02d9c2fec5bdf3371bc2c", + "menuName": "Bumper Status", + "paramsJson": "", + } + ], + "menuPositionKey": "D_FOURTH", + }, + ] + ) - return web.json_response(body) - except Exception as e: - logging.exception(f"{e}") +async def _handle_change_area(_: Request) -> Response: + return get_success_response({"isNeedReLogin": "N"}) - async def handle_changeArea(self, request): - try: - body = { - "code": RETURN_API_SUCCESS, - "data": {"isNeedReLogin": "N"}, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - return web.json_response(body) - - except Exception as e: - logging.exception(f"{e}") - - async def handle_acceptAgreementBatch(self, request): - try: - body = { - "code": RETURN_API_SUCCESS, - "data": None, - "msg": "操作成功", - "success": True, - "time": get_current_time_as_millis(), - } - - return web.json_response(body) - - except Exception as e: - logging.exception(f"{e}") +async def _handle_accept_agreement_batch(_: Request) -> Response: + return get_success_response(None) diff --git a/bumper/web/plugins/v1/private/user_setting.py b/bumper/web/plugins/v1/private/user_setting.py new file mode 100644 index 0000000..3be4eb0 --- /dev/null +++ b/bumper/web/plugins/v1/private/user_setting.py @@ -0,0 +1,51 @@ +"""User setting plugin module.""" + +from typing import Iterable + +from aiohttp import web +from aiohttp.web_request import Request +from aiohttp.web_response import Response +from aiohttp.web_routedef import AbstractRouteDef + +from ... import WebserverPlugin, get_success_response +from . import BASE_URL + + +class UserSettingPlugin(WebserverPlugin): + """User setting plugin.""" + + @property + def routes(self) -> Iterable[AbstractRouteDef]: + """Plugin routes.""" + return [ + web.route( + "*", + f"{BASE_URL}userSetting/getSuggestionSetting", + _handle_get_suggestion_setting, + ), + ] + + +async def _handle_get_suggestion_setting(_: Request) -> Response: + return get_success_response( + { + "acceptSuggestion": "Y", + "itemList": [ + { + "name": "Aktionen/Angebote/Ereignisse", + "settingKey": "MARKETING", + "val": "Y", + }, + { + "name": "Benutzerbefragung", + "settingKey": "QUESTIONNAIRE", + "val": "Y", + }, + { + "name": "Produkt-Upgrade/Hilfe für Benutzer", + "settingKey": "INTRODUCTION", + "val": "Y", + }, + ], + } + ) diff --git a/bumper/web/plugins/v1/private/users_setting.py b/bumper/web/plugins/v1/private/users_setting.py deleted file mode 100644 index c3cd405..0000000 --- a/bumper/web/plugins/v1/private/users_setting.py +++ /dev/null @@ -1,61 +0,0 @@ -"""user setting plugin module.""" - -import logging -from typing import Iterable - -from aiohttp import web -from aiohttp.web_routedef import AbstractRouteDef - -from bumper.models import RETURN_API_SUCCESS -from bumper.util import get_current_time_as_millis - -from ... import WebserverPlugin - - -class UserSettingPlugin(WebserverPlugin): - """User setting plugin.""" - - @property - def routes(self) -> Iterable[AbstractRouteDef]: - """Plugin routes.""" - return [ - web.route( - "*", - "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/userSetting/getSuggestionSetting", - self.handle_getSuggestionSetting, - ), - ] - - async def handle_getSuggestionSetting(self, request): - try: - - body = { - "code": RETURN_API_SUCCESS, - "data": { - "acceptSuggestion": "Y", - "itemList": [ - { - "name": "Aktionen/Angebote/Ereignisse", - "settingKey": "MARKETING", - "val": "Y", - }, - { - "name": "Benutzerbefragung", - "settingKey": "QUESTIONNAIRE", - "val": "Y", - }, - { - "name": "Produkt-Upgrade/Hilfe für Benutzer", - "settingKey": "INTRODUCTION", - "val": "Y", - }, - ], - }, - "msg": "操作成功", - "time": get_current_time_as_millis(), - } - - return web.json_response(body) - - except Exception as e: - logging.exception(f"{e}") diff --git a/example/docker-compose/docker-compose.yaml b/example/docker-compose/docker-compose.yaml index b8e388d..9aa9042 100644 --- a/example/docker-compose/docker-compose.yaml +++ b/example/docker-compose/docker-compose.yaml @@ -21,7 +21,7 @@ services: volumes: - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro - - ./nginx/:/etc/nginx:ro # See config file below + - ./nginx/:/etc/nginx:ro # See config file below bumper: image: bmartin5692/bumper @@ -33,7 +33,7 @@ services: PUID: 1000 PGID: 1000 TZ: Europe/Rome - BUMPER_ANNOUNCE_IP: XXX # Insert your IP + BUMPER_ANNOUNCE_IP: XXX # Insert your IP BUMPER_LISTEN: 0.0.0.0 # BUMPER_DEBUG: "true" LOG_TO_STDOUT: "true" diff --git a/tests/web/test_server.py b/tests/web/test_server.py index 7faf9ed..cef97be 100644 --- a/tests/web/test_server.py +++ b/tests/web/test_server.py @@ -496,7 +496,8 @@ async def test_getProductIotMap(webserver_client): jsonresp = json.loads(text) assert jsonresp["code"] == RETURN_API_SUCCESS - # Test getPimFile + +async def test_pim_file(webserver_client): resp = await webserver_client.get("/api/pim/file/get/123") assert resp.status == 200