diff --git a/nonebot_bison/scheduler/manager.py b/nonebot_bison/scheduler/manager.py index b2ab3cc39..eea7e00d9 100644 --- a/nonebot_bison/scheduler/manager.py +++ b/nonebot_bison/scheduler/manager.py @@ -1,9 +1,12 @@ +from nonebot.log import logger + from ..config import config from .scheduler import Scheduler from ..utils import SchedulerConfig from ..config.db_model import Target from ..types import Target as T_Target from ..platform import platform_manager +from ..plugin_config import plugin_config scheduler_dict: dict[type[SchedulerConfig], Scheduler] = {} @@ -27,6 +30,10 @@ async def init_scheduler(): else: _schedule_class_platform_dict[scheduler_config].append(platform_name) for scheduler_config, target_list in _schedule_class_dict.items(): + if not plugin_config.bison_use_browser and scheduler_config.require_browser: + logger.warning(f"{scheduler_config.name} requires browser, it will not schedule.") + continue + schedulable_args = [] for target in target_list: schedulable_args.append( diff --git a/nonebot_bison/utils/scheduler_config.py b/nonebot_bison/utils/scheduler_config.py index 25daab9a2..293eae6c4 100644 --- a/nonebot_bison/utils/scheduler_config.py +++ b/nonebot_bison/utils/scheduler_config.py @@ -10,6 +10,7 @@ class SchedulerConfig: schedule_type: Literal["date", "interval", "cron"] schedule_setting: dict name: str + require_browser: bool = False def __str__(self): return f"[{self.name}]-{self.name}-{self.schedule_setting}" diff --git a/tests/scheduler/test_scheduler.py b/tests/scheduler/test_scheduler.py index ae51857e3..b51401d00 100644 --- a/tests/scheduler/test_scheduler.py +++ b/tests/scheduler/test_scheduler.py @@ -172,3 +172,64 @@ async def test_schedule_delete(init_scheduler): await config.del_subscribe(TargetQQGroup(group_id=123), T_Target("t1"), "bilibili") stat_res = await get_schedule_times(BilibiliSchedConf, 2) assert stat_res["bilibili-t2"] == 2 + + +async def test_scheduler_skip_browser(mocker: MockerFixture): + from nonebot_bison.platform import platform_manager + from nonebot_bison.plugin_config import plugin_config + from nonebot_bison.platform.platform import NewMessage + from nonebot_bison.scheduler.scheduler import SchedulerConfig + from nonebot_bison.scheduler import init_scheduler, scheduler_dict + + mocker.patch.object(plugin_config, "bison_use_browser", False) + + class MockPlatformSchedConf(SchedulerConfig): + name = "mock" + schedule_type = "interval" + schedule_setting = {"seconds": 100} + require_browser = True + + class MockPlatform(NewMessage): + platform_name = "mock_platform" + name = "Mock Platform" + enabled = True + is_common = True + enable_tag = True + has_target = True + scheduler = MockPlatformSchedConf + + mocker.patch.dict(platform_manager, {"mock_platform": MockPlatform}) + + await init_scheduler() + + assert MockPlatformSchedConf not in scheduler_dict.keys() + + +async def test_scheduler_no_skip_not_require_browser(mocker: MockerFixture): + from nonebot_bison.platform import platform_manager + from nonebot_bison.plugin_config import plugin_config + from nonebot_bison.platform.platform import NewMessage + from nonebot_bison.scheduler.scheduler import SchedulerConfig + from nonebot_bison.scheduler import init_scheduler, scheduler_dict + + mocker.patch.object(plugin_config, "bison_use_browser", False) + + class MockPlatformSchedConf(SchedulerConfig): + name = "mock" + schedule_type = "interval" + schedule_setting = {"seconds": 100} + + class MockPlatform(NewMessage): + platform_name = "mock_platform" + name = "Mock Platform" + enabled = True + is_common = True + enable_tag = True + has_target = True + scheduler = MockPlatformSchedConf + + mocker.patch.dict(platform_manager, {"mock_platform": MockPlatform}) + + await init_scheduler() + + assert MockPlatformSchedConf in scheduler_dict.keys()