diff --git a/nonebot_bison/platform/__init__.py b/nonebot_bison/platform/__init__.py index c99ce12..accdf83 100644 --- a/nonebot_bison/platform/__init__.py +++ b/nonebot_bison/platform/__init__.py @@ -3,6 +3,7 @@ from pkgutil import iter_modules from collections import defaultdict from importlib import import_module +from ..plugin_config import plugin_config from .platform import Platform, make_no_target_group _package_dir = str(Path(__file__).resolve().parent) @@ -22,3 +23,15 @@ for name, platform_list in _platform_list.items(): platform_manager[name] = platform_list[0] else: platform_manager[name] = make_no_target_group(platform_list) + + +def _get_unavailable_platforms() -> dict[str, str]: + res = {} + for name, platform in platform_manager.items(): + if platform.site.require_browser and not plugin_config.bison_use_browser: + res[name] = "需要启用 bison_use_browser" + return res + + +# platform => reason for not available +unavailable_paltforms: dict[str, str] = _get_unavailable_platforms() diff --git a/nonebot_bison/sub_manager/add_sub.py b/nonebot_bison/sub_manager/add_sub.py index 38dddf0..107b9b5 100644 --- a/nonebot_bison/sub_manager/add_sub.py +++ b/nonebot_bison/sub_manager/add_sub.py @@ -9,9 +9,9 @@ from nonebot_plugin_saa import Text, PlatformTarget, SupportedAdapters from ..types import Target from ..config import config from ..apis import check_sub_target -from ..platform import Platform, platform_manager from ..config.db_config import SubscribeDupException from .utils import common_platform, ensure_user_info, gen_handle_cancel +from ..platform import Platform, platform_manager, unavailable_paltforms def do_add_sub(add_sub: type[Matcher]): @@ -39,6 +39,8 @@ def do_add_sub(add_sub: type[Matcher]): elif platform == "取消": await add_sub.finish("已中止订阅") elif platform in platform_manager: + if platform in unavailable_paltforms: + await add_sub.finish(f"无法订阅 {platform},{unavailable_paltforms[platform]}") state["platform"] = platform else: await add_sub.reject("平台输入错误") diff --git a/tests/conftest.py b/tests/conftest.py index 6c19b90..ae03f71 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -113,3 +113,12 @@ async def use_legacy_config(app: App): # 清除单例的缓存 Singleton._instances.clear() + + +@pytest.fixture +async def _no_browser(app: App, mocker: MockerFixture): + from nonebot_bison.plugin_config import plugin_config + from nonebot_bison.platform import _get_unavailable_platforms + + mocker.patch.object(plugin_config, "bison_use_browser", False) + mocker.patch("nonebot_bison.platform.unavailable_paltforms", _get_unavailable_platforms()) diff --git a/tests/sub_manager/test_add.py b/tests/sub_manager/test_add.py index 68bc415..77d633f 100644 --- a/tests/sub_manager/test_add.py +++ b/tests/sub_manager/test_add.py @@ -615,3 +615,48 @@ async def test_add_with_bilibili_bangumi_target_parser(app: App, init_scheduler) assert sub.tags == [] assert sub.target.platform_name == "bilibili-bangumi" assert sub.target.target_name == "汉化日记 第三季" + + +@pytest.mark.asyncio +async def test_subscribe_platform_requires_browser(app: App, mocker: MockerFixture): + from nonebot.adapters.onebot.v11.event import Sender + from nonebot.adapters.onebot.v11.message import Message + + from nonebot_bison.plugin_config import plugin_config + from nonebot_bison.sub_manager import add_sub_matcher, common_platform + from nonebot_bison.platform import platform_manager, unavailable_paltforms + + mocker.patch.object(plugin_config, "bison_use_browser", False) + mocker.patch.dict(unavailable_paltforms, {"bilibili": "需要启用 bison_use_browser"}) + + async with app.test_matcher(add_sub_matcher) as ctx: + bot = ctx.create_bot() + event_1 = fake_group_message_event( + message=Message("添加订阅"), + sender=Sender(card="", nickname="test", role="admin"), + to_me=True, + ) + ctx.receive_event(bot, event_1) + ctx.should_pass_rule() + ctx.should_call_send( + event_1, + BotReply.add_reply_on_platform(platform_manager=platform_manager, common_platform=common_platform), + True, + ) + event_2 = fake_group_message_event( + message=Message("全部"), sender=Sender(card="", nickname="test", role="admin") + ) + ctx.receive_event(bot, event_2) + ctx.should_rejected() + ctx.should_call_send( + event_2, + BotReply.add_reply_on_platform_input_allplatform(platform_manager), + True, + ) + event_3 = fake_group_message_event(message=Message("bilibili"), sender=fake_admin_user) + ctx.receive_event(bot, event_3) + ctx.should_call_send( + event_3, + BotReply.add_reply_platform_unavailable("bilibili", "需要启用 bison_use_browser"), + True, + ) diff --git a/tests/utils.py b/tests/utils.py index 5ea3440..c8dd343 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -146,6 +146,10 @@ class BotReply: extra_text = ("1." + target_promot + "\n2.") if target_promot else "" return extra_text + base_text + @staticmethod + def add_reply_platform_unavailable(platform: str, reason: str) -> str: + return f"无法订阅 {platform},{reason}" + add_reply_on_id_input_error = "id输入错误" add_reply_on_target_parse_input_error = "不能从你的输入中提取出id,请检查你输入的内容是否符合预期" add_reply_on_platform_input_error = "平台输入错误"