mirror of
https://github.com/suyiiyii/nonebot-bison.git
synced 2026-05-09 10:17:56 +08:00
♻️ rename scheduler_config -> site
This commit is contained in:
@@ -5,7 +5,7 @@ from .platform import platform_manager
|
||||
|
||||
async def check_sub_target(platform_name: str, target: Target):
|
||||
platform = platform_manager[platform_name]
|
||||
scheduler_conf_class = platform.scheduler
|
||||
scheduler_conf_class = platform.site
|
||||
scheduler = scheduler_dict[scheduler_conf_class]
|
||||
client = await scheduler.client_mgr.get_query_name_client()
|
||||
|
||||
|
||||
@@ -8,9 +8,9 @@ from pydantic import Field, BaseModel
|
||||
from nonebot.compat import type_validate_python
|
||||
|
||||
from ..post import Post
|
||||
from ..utils import Site
|
||||
from ..types import Target, RawPost, Category
|
||||
from .platform import NewMessage, StatusChange
|
||||
from ..utils.scheduler_config import SchedulerConfig
|
||||
|
||||
|
||||
class ArkResponseBase(BaseModel):
|
||||
@@ -52,7 +52,7 @@ class ArkBulletinResponse(ArkResponseBase):
|
||||
data: BulletinData
|
||||
|
||||
|
||||
class ArknightsSchedConf(SchedulerConfig):
|
||||
class ArknightsSite(Site):
|
||||
name = "arknights"
|
||||
schedule_type = "interval"
|
||||
schedule_setting = {"seconds": 30}
|
||||
@@ -65,7 +65,7 @@ class Arknights(NewMessage):
|
||||
enable_tag = False
|
||||
enabled = True
|
||||
is_common = False
|
||||
scheduler = ArknightsSchedConf
|
||||
site = ArknightsSite
|
||||
has_target = False
|
||||
default_theme = "arknights"
|
||||
|
||||
@@ -127,7 +127,7 @@ class AkVersion(StatusChange):
|
||||
enable_tag = False
|
||||
enabled = True
|
||||
is_common = False
|
||||
scheduler = ArknightsSchedConf
|
||||
site = ArknightsSite
|
||||
has_target = False
|
||||
default_theme = "brief"
|
||||
|
||||
@@ -172,7 +172,7 @@ class MonsterSiren(NewMessage):
|
||||
enable_tag = False
|
||||
enabled = True
|
||||
is_common = False
|
||||
scheduler = ArknightsSchedConf
|
||||
site = ArknightsSite
|
||||
has_target = False
|
||||
|
||||
@classmethod
|
||||
@@ -220,7 +220,7 @@ class TerraHistoricusComic(NewMessage):
|
||||
enable_tag = False
|
||||
enabled = True
|
||||
is_common = False
|
||||
scheduler = ArknightsSchedConf
|
||||
site = ArknightsSite
|
||||
has_target = False
|
||||
default_theme = "brief"
|
||||
|
||||
|
||||
@@ -11,12 +11,10 @@ from nonebot.log import logger
|
||||
from pydantic import Field, BaseModel
|
||||
from nonebot.compat import PYDANTIC_V2, ConfigDict, type_validate_json, type_validate_python
|
||||
|
||||
from nonebot_bison.compat import model_rebuild
|
||||
from nonebot_bison.utils.scheduler_config import ClientManager
|
||||
|
||||
from ..post import Post
|
||||
from ..compat import model_rebuild
|
||||
from ..types import Tag, Target, RawPost, ApiError, Category
|
||||
from ..utils import SchedulerConfig, http_client, text_similarity
|
||||
from ..utils import Site, ClientManager, http_client, text_similarity
|
||||
from .platform import NewMessage, StatusChange, CategoryNotSupport, CategoryNotRecognize
|
||||
|
||||
TBaseModel = TypeVar("TBaseModel", bound=type[BaseModel])
|
||||
@@ -133,18 +131,18 @@ class BilibiliClient(ClientManager):
|
||||
return self._client
|
||||
|
||||
|
||||
class BilibiliSchedConf(SchedulerConfig):
|
||||
class BilibiliSite(Site):
|
||||
name = "bilibili.com"
|
||||
schedule_type = "interval"
|
||||
schedule_setting = {"seconds": 10}
|
||||
client_man = BilibiliClient
|
||||
client_mgr = BilibiliClient
|
||||
|
||||
|
||||
class BililiveSchedConf(SchedulerConfig):
|
||||
class BililiveSchedConf(Site):
|
||||
name = "live.bilibili.com"
|
||||
schedule_type = "interval"
|
||||
schedule_setting = {"seconds": 3}
|
||||
client_man = BilibiliClient
|
||||
client_mgr = BilibiliClient
|
||||
|
||||
|
||||
class Bilibili(NewMessage):
|
||||
@@ -160,7 +158,7 @@ class Bilibili(NewMessage):
|
||||
enable_tag = True
|
||||
enabled = True
|
||||
is_common = True
|
||||
scheduler = BilibiliSchedConf
|
||||
site = BilibiliSite
|
||||
name = "B站"
|
||||
has_target = True
|
||||
parse_target_promot = "请输入用户主页的链接"
|
||||
@@ -333,7 +331,7 @@ class Bilibililive(StatusChange):
|
||||
enable_tag = False
|
||||
enabled = True
|
||||
is_common = True
|
||||
scheduler = BililiveSchedConf
|
||||
site = BililiveSchedConf
|
||||
name = "Bilibili直播"
|
||||
has_target = True
|
||||
use_batch = True
|
||||
@@ -483,7 +481,7 @@ class BilibiliBangumi(StatusChange):
|
||||
enable_tag = False
|
||||
enabled = True
|
||||
is_common = True
|
||||
scheduler = BilibiliSchedConf
|
||||
site = BilibiliSite
|
||||
name = "Bilibili剧集"
|
||||
has_target = True
|
||||
parse_target_promot = "请输入剧集主页"
|
||||
|
||||
@@ -3,8 +3,8 @@ from typing import Any
|
||||
from httpx import AsyncClient
|
||||
|
||||
from ..post import Post
|
||||
from ..utils import scheduler
|
||||
from .platform import NewMessage
|
||||
from ..utils import anonymous_site
|
||||
from ..types import Target, RawPost
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ class FF14(NewMessage):
|
||||
enabled = True
|
||||
is_common = False
|
||||
scheduler_class = "ff14"
|
||||
scheduler = scheduler("interval", {"seconds": 60})
|
||||
site = anonymous_site("interval", {"seconds": 60})
|
||||
has_target = False
|
||||
|
||||
@classmethod
|
||||
|
||||
@@ -4,12 +4,12 @@ from typing import Any
|
||||
from httpx import AsyncClient
|
||||
|
||||
from ..post import Post
|
||||
from ..utils import Site
|
||||
from .platform import NewMessage
|
||||
from ..utils import SchedulerConfig
|
||||
from ..types import Target, RawPost, ApiError
|
||||
|
||||
|
||||
class NcmSchedConf(SchedulerConfig):
|
||||
class NcmSite(Site):
|
||||
name = "music.163.com"
|
||||
schedule_type = "interval"
|
||||
schedule_setting = {"minutes": 1}
|
||||
@@ -21,7 +21,7 @@ class NcmArtist(NewMessage):
|
||||
enable_tag = False
|
||||
enabled = True
|
||||
is_common = True
|
||||
scheduler = NcmSchedConf
|
||||
site = NcmSite
|
||||
name = "网易云-歌手"
|
||||
has_target = True
|
||||
parse_target_promot = "请输入歌手主页(包含数字ID)的链接"
|
||||
@@ -78,7 +78,7 @@ class NcmRadio(NewMessage):
|
||||
enable_tag = False
|
||||
enabled = True
|
||||
is_common = False
|
||||
scheduler = NcmSchedConf
|
||||
site = NcmSite
|
||||
name = "网易云-电台"
|
||||
has_target = True
|
||||
parse_target_promot = "请输入主播电台主页(包含数字ID)的链接"
|
||||
|
||||
@@ -14,8 +14,8 @@ from nonebot.log import logger
|
||||
from nonebot_plugin_saa import PlatformTarget
|
||||
|
||||
from ..post import Post
|
||||
from ..utils import Site, ProcessContext
|
||||
from ..plugin_config import plugin_config
|
||||
from ..utils import ProcessContext, SchedulerConfig
|
||||
from ..types import Tag, Target, RawPost, SubUnit, Category
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ class PlatformABCMeta(PlatformMeta, ABC): ...
|
||||
|
||||
|
||||
class Platform(metaclass=PlatformABCMeta, base=True):
|
||||
scheduler: type[SchedulerConfig]
|
||||
site: type[Site]
|
||||
ctx: ProcessContext
|
||||
is_common: bool
|
||||
enabled: bool
|
||||
@@ -444,7 +444,7 @@ def make_no_target_group(platform_list: list[type[Platform]]) -> type[Platform]:
|
||||
name = DUMMY_STR
|
||||
categories_keys = set()
|
||||
categories = {}
|
||||
scheduler = platform_list[0].scheduler
|
||||
site = platform_list[0].site
|
||||
|
||||
for platform in platform_list:
|
||||
if platform.has_target:
|
||||
@@ -458,7 +458,7 @@ def make_no_target_group(platform_list: list[type[Platform]]) -> type[Platform]:
|
||||
raise RuntimeError(f"Platform categories for {platform_name} duplicate")
|
||||
categories_keys |= platform_category_key_set
|
||||
categories.update(platform.categories)
|
||||
if platform.scheduler != scheduler:
|
||||
if platform.site != site:
|
||||
raise RuntimeError(f"Platform scheduler for {platform_name} not fit")
|
||||
|
||||
def __init__(self: "NoTargetGroup", ctx: ProcessContext):
|
||||
@@ -490,7 +490,7 @@ def make_no_target_group(platform_list: list[type[Platform]]) -> type[Platform]:
|
||||
"platform_name": platform_list[0].platform_name,
|
||||
"name": name,
|
||||
"categories": categories,
|
||||
"scheduler": scheduler,
|
||||
"site": site,
|
||||
"is_common": platform_list[0].is_common,
|
||||
"enabled": True,
|
||||
"has_target": False,
|
||||
|
||||
@@ -9,10 +9,10 @@ from bs4 import BeautifulSoup as bs
|
||||
from ..post import Post
|
||||
from .platform import NewMessage
|
||||
from ..types import Target, RawPost
|
||||
from ..utils import SchedulerConfig, text_similarity
|
||||
from ..utils import Site, text_similarity
|
||||
|
||||
|
||||
class RssSchedConf(SchedulerConfig):
|
||||
class RssSite(Site):
|
||||
name = "rss"
|
||||
schedule_type = "interval"
|
||||
schedule_setting = {"seconds": 30}
|
||||
@@ -25,7 +25,7 @@ class Rss(NewMessage):
|
||||
name = "Rss"
|
||||
enabled = True
|
||||
is_common = True
|
||||
scheduler = RssSchedConf
|
||||
site = RssSite
|
||||
has_target = True
|
||||
|
||||
@classmethod
|
||||
|
||||
@@ -12,7 +12,7 @@ from bs4 import BeautifulSoup as bs
|
||||
|
||||
from ..post import Post
|
||||
from .platform import NewMessage
|
||||
from ..utils import SchedulerConfig, http_client
|
||||
from ..utils import Site, http_client
|
||||
from ..types import Tag, Target, RawPost, ApiError, Category
|
||||
|
||||
_HEADER = {
|
||||
@@ -35,7 +35,7 @@ _HEADER = {
|
||||
}
|
||||
|
||||
|
||||
class WeiboSchedConf(SchedulerConfig):
|
||||
class WeiboSite(Site):
|
||||
name = "weibo.com"
|
||||
schedule_type = "interval"
|
||||
schedule_setting = {"seconds": 3}
|
||||
@@ -53,7 +53,7 @@ class Weibo(NewMessage):
|
||||
name = "新浪微博"
|
||||
enabled = True
|
||||
is_common = True
|
||||
scheduler = WeiboSchedConf
|
||||
site = WeiboSite
|
||||
has_target = True
|
||||
parse_target_promot = "请输入用户主页(包含数字UID)的链接"
|
||||
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
from nonebot.log import logger
|
||||
|
||||
from ..utils import Site
|
||||
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] = {}
|
||||
scheduler_dict: dict[type[Site], Scheduler] = {}
|
||||
|
||||
|
||||
async def init_scheduler():
|
||||
_schedule_class_dict: dict[type[SchedulerConfig], list[Target]] = {}
|
||||
_schedule_class_platform_dict: dict[type[SchedulerConfig], list[str]] = {}
|
||||
_schedule_class_dict: dict[type[Site], list[Target]] = {}
|
||||
_schedule_class_platform_dict: dict[type[Site], list[str]] = {}
|
||||
for platform in platform_manager.values():
|
||||
scheduler_config = platform.scheduler
|
||||
if not hasattr(scheduler_config, "name") or not scheduler_config.name:
|
||||
scheduler_config.name = f"AnonymousScheduleConfig[{platform.platform_name}]"
|
||||
site = platform.site
|
||||
if not hasattr(site, "name") or not site.name:
|
||||
site.name = f"AnonymousScheduleConfig[{platform.platform_name}]"
|
||||
|
||||
platform_name = platform.platform_name
|
||||
targets = await config.get_platform_target(platform_name)
|
||||
if scheduler_config not in _schedule_class_dict:
|
||||
_schedule_class_dict[scheduler_config] = list(targets)
|
||||
if site not in _schedule_class_dict:
|
||||
_schedule_class_dict[site] = list(targets)
|
||||
else:
|
||||
_schedule_class_dict[scheduler_config].extend(targets)
|
||||
if scheduler_config not in _schedule_class_platform_dict:
|
||||
_schedule_class_platform_dict[scheduler_config] = [platform_name]
|
||||
_schedule_class_dict[site].extend(targets)
|
||||
if site not in _schedule_class_platform_dict:
|
||||
_schedule_class_platform_dict[site] = [platform_name]
|
||||
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.")
|
||||
_schedule_class_platform_dict[site].append(platform_name)
|
||||
for site, target_list in _schedule_class_dict.items():
|
||||
if not plugin_config.bison_use_browser and site.require_browser:
|
||||
logger.warning(f"{site.name} requires browser, it will not schedule.")
|
||||
continue
|
||||
|
||||
schedulable_args = []
|
||||
@@ -39,19 +39,19 @@ async def init_scheduler():
|
||||
schedulable_args.append(
|
||||
(target.platform_name, T_Target(target.target), platform_manager[target.platform_name].use_batch)
|
||||
)
|
||||
platform_name_list = _schedule_class_platform_dict[scheduler_config]
|
||||
scheduler_dict[scheduler_config] = Scheduler(scheduler_config, schedulable_args, platform_name_list)
|
||||
platform_name_list = _schedule_class_platform_dict[site]
|
||||
scheduler_dict[site] = Scheduler(site, schedulable_args, platform_name_list)
|
||||
config.register_add_target_hook(handle_insert_new_target)
|
||||
config.register_delete_target_hook(handle_delete_target)
|
||||
|
||||
|
||||
async def handle_insert_new_target(platform_name: str, target: T_Target):
|
||||
platform = platform_manager[platform_name]
|
||||
scheduler_obj = scheduler_dict[platform.scheduler]
|
||||
scheduler_obj = scheduler_dict[platform.site]
|
||||
scheduler_obj.insert_new_schedulable(platform_name, target)
|
||||
|
||||
|
||||
async def handle_delete_target(platform_name: str, target: T_Target):
|
||||
platform = platform_manager[platform_name]
|
||||
scheduler_obj = scheduler_dict[platform.scheduler]
|
||||
scheduler_obj = scheduler_dict[platform.site]
|
||||
scheduler_obj.delete_schedulable(platform_name, target)
|
||||
|
||||
@@ -5,13 +5,13 @@ from nonebot.log import logger
|
||||
from nonebot_plugin_apscheduler import scheduler
|
||||
from nonebot_plugin_saa.utils.exceptions import NoBotFound
|
||||
|
||||
from nonebot_bison.utils.scheduler_config import ClientManager
|
||||
from nonebot_bison.utils import ClientManager
|
||||
|
||||
from ..config import config
|
||||
from ..send import send_msgs
|
||||
from ..types import Target, SubUnit
|
||||
from ..platform import platform_manager
|
||||
from ..utils import ProcessContext, SchedulerConfig
|
||||
from ..utils import Site, ProcessContext
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -30,7 +30,7 @@ class Scheduler:
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
scheduler_config: type[SchedulerConfig],
|
||||
scheduler_config: type[Site],
|
||||
schedulables: list[tuple[str, Target, bool]], # [(platform_name, target, use_batch)]
|
||||
platform_name_list: list[str],
|
||||
):
|
||||
|
||||
@@ -8,27 +8,17 @@ from bs4 import BeautifulSoup as bs
|
||||
from nonebot.log import logger, default_format
|
||||
from nonebot_plugin_saa import Text, Image, MessageSegmentFactory
|
||||
|
||||
from .http import http_client
|
||||
from .context import ProcessContext
|
||||
from .site import Site as Site
|
||||
from ..plugin_config import plugin_config
|
||||
from .image import pic_merge, text_to_image, is_pics_mergable, pic_url_to_image
|
||||
from .scheduler_config import ClientManager, SchedulerConfig, DefaultClientManager, scheduler
|
||||
|
||||
__all__ = [
|
||||
"http_client",
|
||||
"Singleton",
|
||||
"parse_text",
|
||||
"ProcessContext",
|
||||
"ClientManager",
|
||||
"DefaultClientManager",
|
||||
"html_to_text",
|
||||
"SchedulerConfig",
|
||||
"scheduler",
|
||||
"pic_merge",
|
||||
"pic_url_to_image",
|
||||
"is_pics_mergable",
|
||||
"text_to_image",
|
||||
]
|
||||
from .image import pic_merge as pic_merge
|
||||
from .http import http_client as http_client
|
||||
from .site import ClientManager as ClientManager
|
||||
from .image import text_to_image as text_to_image
|
||||
from .site import anonymous_site as anonymous_site
|
||||
from .context import ProcessContext as ProcessContext
|
||||
from .image import is_pics_mergable as is_pics_mergable
|
||||
from .image import pic_url_to_image as pic_url_to_image
|
||||
from .site import DefaultClientManager as DefaultClientManager
|
||||
|
||||
|
||||
class Singleton(type):
|
||||
|
||||
@@ -4,7 +4,7 @@ from httpx import Response, AsyncClient
|
||||
|
||||
from nonebot_bison.types import Target
|
||||
|
||||
from .scheduler_config import ClientManager
|
||||
from .site import ClientManager
|
||||
|
||||
|
||||
class ProcessContext:
|
||||
|
||||
@@ -28,7 +28,7 @@ class DefaultClientManager(ClientManager):
|
||||
return http_client()
|
||||
|
||||
|
||||
class SchedulerConfig:
|
||||
class Site:
|
||||
schedule_type: Literal["date", "interval", "cron"]
|
||||
schedule_setting: dict
|
||||
name: str
|
||||
@@ -42,10 +42,10 @@ class SchedulerConfig:
|
||||
self.default_http_client = http_client()
|
||||
|
||||
|
||||
def scheduler(schedule_type: Literal["date", "interval", "cron"], schedule_setting: dict) -> type[SchedulerConfig]:
|
||||
def anonymous_site(schedule_type: Literal["date", "interval", "cron"], schedule_setting: dict) -> type[Site]:
|
||||
return type(
|
||||
"AnonymousScheduleConfig",
|
||||
(SchedulerConfig,),
|
||||
"AnonymousSite",
|
||||
(Site,),
|
||||
{
|
||||
"schedule_type": schedule_type,
|
||||
"schedule_setting": schedule_setting,
|
||||
Reference in New Issue
Block a user