From f959e3ee0886eefab283a15548d522d021043c1d Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Mon, 9 Sep 2024 10:04:19 +0800 Subject: [PATCH] =?UTF-8?q?:recycles:=20=E4=BB=BF=E7=85=A7=20platform=5Fma?= =?UTF-8?q?nager=20=E6=B7=BB=E5=8A=A0=20site=5Fmanager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nonebot_bison/platform/__init__.py | 9 +++++++++ nonebot_bison/platform/platform.py | 17 +---------------- nonebot_bison/sub_manager/__init__.py | 16 ++++++++-------- nonebot_bison/sub_manager/add_cookie.py | 21 +++++++++++---------- nonebot_bison/types.py | 15 +++++++++++++++ nonebot_bison/utils/__init__.py | 18 +++++++++--------- nonebot_bison/utils/site.py | 7 +++++-- 7 files changed, 58 insertions(+), 45 deletions(-) diff --git a/nonebot_bison/platform/__init__.py b/nonebot_bison/platform/__init__.py index c99ce12..66a6e5b 100644 --- a/nonebot_bison/platform/__init__.py +++ b/nonebot_bison/platform/__init__.py @@ -4,6 +4,7 @@ from collections import defaultdict from importlib import import_module from .platform import Platform, make_no_target_group +from ..utils import Site _package_dir = str(Path(__file__).resolve().parent) for _, module_name, _ in iter_modules([_package_dir]): @@ -22,3 +23,11 @@ for name, platform_list in _platform_list.items(): platform_manager[name] = platform_list[0] else: platform_manager[name] = make_no_target_group(platform_list) + + +site_manager: dict[str, type[Site]] = {} +for site in Site.registry: + if not hasattr(site, "name"): + continue + site_manager[site.name] = site + diff --git a/nonebot_bison/platform/platform.py b/nonebot_bison/platform/platform.py index ecbafe6..111adaf 100644 --- a/nonebot_bison/platform/platform.py +++ b/nonebot_bison/platform/platform.py @@ -16,7 +16,7 @@ from nonebot_plugin_saa import PlatformTarget from ..post import Post from ..utils import Site, ProcessContext from ..plugin_config import plugin_config -from ..types import Tag, Target, RawPost, SubUnit, Category +from ..types import Tag, Target, RawPost, SubUnit, Category, RegistryMeta class CategoryNotSupport(Exception): @@ -29,21 +29,6 @@ class CategoryNotRecognize(Exception): """raise in get_category, when you don't know the category of post""" -class RegistryMeta(type): - def __new__(cls, name, bases, namespace, **kwargs): - return super().__new__(cls, name, bases, namespace) - - def __init__(cls, name, bases, namespace, **kwargs): - if kwargs.get("base"): - # this is the base class - cls.registry = [] - elif not kwargs.get("abstract"): - # this is the subclass - cls.registry.append(cls) - - super().__init__(name, bases, namespace, **kwargs) - - P = ParamSpec("P") R = TypeVar("R") diff --git a/nonebot_bison/sub_manager/__init__.py b/nonebot_bison/sub_manager/__init__.py index ec58e30..d54c0f8 100644 --- a/nonebot_bison/sub_manager/__init__.py +++ b/nonebot_bison/sub_manager/__init__.py @@ -44,15 +44,15 @@ del_sub_matcher = on_command( del_sub_matcher.handle()(set_target_user_info) do_del_sub(del_sub_matcher) -# add_cookie_matcher = on_command( -# "添加cookie", -# rule=configurable_to_me, -# permission=SUPERUSER, -# priority=5, -# block=True, -# ) +add_cookie_matcher = on_command( + "添加cookie", + rule=configurable_to_me, + permission=SUPERUSER, + priority=5, + block=True, +) # do_add_cookie(add_cookie_matcher) -# + # add_cookie_target_matcher = on_command( # "关联cookie", # rule=configurable_to_me, diff --git a/nonebot_bison/sub_manager/add_cookie.py b/nonebot_bison/sub_manager/add_cookie.py index 9ae36e3..4b912fe 100644 --- a/nonebot_bison/sub_manager/add_cookie.py +++ b/nonebot_bison/sub_manager/add_cookie.py @@ -1,14 +1,14 @@ from typing import cast -from nonebot.typing import T_State +from nonebot.adapters import Message, MessageTemplate from nonebot.matcher import Matcher from nonebot.params import Arg, ArgPlainText -from nonebot.adapters import Message, MessageTemplate +from nonebot.typing import T_State +from .utils import common_platform, gen_handle_cancel from ..config import config from ..config.db_model import Cookie from ..platform import platform_manager -from .utils import common_platform, gen_handle_cancel from ..utils.site import CookieClientManager, is_cookie_client_manager @@ -20,12 +20,12 @@ def do_add_cookie(add_cookie: type[Matcher]): state["_prompt"] = ( "请输入想要添加 Cookie 的平台,目前支持,请输入冒号左边的名称:\n" + "".join( - [ - f"{platform_name}: {platform_manager[platform_name].name}\n" - for platform_name in common_platform - if is_cookie_client_manager(platform_manager[platform_name].site.client_mgr) - ] - ) + [ + f"{platform_name}: {platform_manager[platform_name].name}\n" + for platform_name in common_platform + if is_cookie_client_manager(platform_manager[platform_name].site.client_mgr) + ] + ) + "要查看全部平台请输入:“全部”\n中止添加cookie过程请输入:“取消”" ) @@ -53,7 +53,8 @@ def do_add_cookie(add_cookie: type[Matcher]): @add_cookie.got("cookie", MessageTemplate("{_prompt}"), [handle_cancel]) async def got_cookie(state: T_State, cookie: Message = Arg()): - client_mgr: CookieClientManager = platform_manager[state["platform"]].site.client_mgr + client_mgr: type[CookieClientManager] = cast(type[CookieClientManager], + platform_manager[state["platform"]].site.client_mgr) cookie_text = cookie.extract_plain_text() if not await client_mgr.valid_cookie(cookie_text): await add_cookie.reject("无效的 Cookie,请检查后重新输入,详情见<待添加的文档>") diff --git a/nonebot_bison/types.py b/nonebot_bison/types.py index 0d08bfd..d90bcd3 100644 --- a/nonebot_bison/types.py +++ b/nonebot_bison/types.py @@ -58,3 +58,18 @@ class ApiError(Exception): class SubUnit(NamedTuple): sub_target: Target user_sub_infos: list[UserSubInfo] + + +class RegistryMeta(type): + def __new__(cls, name, bases, namespace, **kwargs): + return super().__new__(cls, name, bases, namespace) + + def __init__(cls, name, bases, namespace, **kwargs): + if kwargs.get("base"): + # this is the base class + cls.registry = [] + elif not kwargs.get("abstract"): + # this is the subclass + cls.registry.append(cls) + + super().__init__(name, bases, namespace, **kwargs) diff --git a/nonebot_bison/utils/__init__.py b/nonebot_bison/utils/__init__.py index 5da51f3..c61ef46 100644 --- a/nonebot_bison/utils/__init__.py +++ b/nonebot_bison/utils/__init__.py @@ -1,25 +1,25 @@ +import difflib import re import sys -import difflib import nonebot -from nonebot.plugin import require from bs4 import BeautifulSoup as bs from nonebot.log import logger, default_format +from nonebot.plugin import require from nonebot_plugin_saa import Text, Image, MessageSegmentFactory -from .site import Site as Site -from ..plugin_config import plugin_config -from .image import pic_merge as pic_merge +from .context import ProcessContext as ProcessContext from .http import http_client as http_client from .image import capture_html as capture_html -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_merge as pic_merge from .image import pic_url_to_image as pic_url_to_image +from .image import text_to_image as text_to_image +from .site import ClientManager as ClientManager from .site import DefaultClientManager as DefaultClientManager +from .site import Site as Site +from .site import anonymous_site as anonymous_site +from ..plugin_config import plugin_config class Singleton(type): diff --git a/nonebot_bison/utils/site.py b/nonebot_bison/utils/site.py index b93ff56..1ad2f4e 100644 --- a/nonebot_bison/utils/site.py +++ b/nonebot_bison/utils/site.py @@ -7,8 +7,9 @@ from datetime import datetime, timedelta import httpx from httpx import AsyncClient from nonebot.log import logger +from sqlalchemy.testing.suite.test_reflection import metadata -from ..types import Target +from ..types import Target, RegistryMeta from ..config import config from .http import http_client from ..config.db_model import Cookie @@ -163,12 +164,14 @@ def create_cookie_client_manager(platform_name: str): -class Site: +class Site(metaclass=RegistryMeta,base=True): schedule_type: Literal["date", "interval", "cron"] schedule_setting: dict name: str client_mgr: type[ClientManager] = DefaultClientManager require_browser: bool = False + registry: list[type["Site"]] + def __str__(self): return f"[{self.name}]-{self.name}-{self.schedule_setting}"