:recycles: 仿照 platform_manager 添加 site_manager

This commit is contained in:
suyiiyii 2024-09-09 10:04:19 +08:00
parent 4db7e7b911
commit f959e3ee08
7 changed files with 58 additions and 45 deletions

View File

@ -4,6 +4,7 @@ from collections import defaultdict
from importlib import import_module from importlib import import_module
from .platform import Platform, make_no_target_group from .platform import Platform, make_no_target_group
from ..utils import Site
_package_dir = str(Path(__file__).resolve().parent) _package_dir = str(Path(__file__).resolve().parent)
for _, module_name, _ in iter_modules([_package_dir]): 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] platform_manager[name] = platform_list[0]
else: else:
platform_manager[name] = make_no_target_group(platform_list) 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

View File

@ -16,7 +16,7 @@ from nonebot_plugin_saa import PlatformTarget
from ..post import Post from ..post import Post
from ..utils import Site, ProcessContext from ..utils import Site, ProcessContext
from ..plugin_config import plugin_config 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): class CategoryNotSupport(Exception):
@ -29,21 +29,6 @@ class CategoryNotRecognize(Exception):
"""raise in get_category, when you don't know the category of post""" """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") P = ParamSpec("P")
R = TypeVar("R") R = TypeVar("R")

View File

@ -44,15 +44,15 @@ del_sub_matcher = on_command(
del_sub_matcher.handle()(set_target_user_info) del_sub_matcher.handle()(set_target_user_info)
do_del_sub(del_sub_matcher) do_del_sub(del_sub_matcher)
# add_cookie_matcher = on_command( add_cookie_matcher = on_command(
# "添加cookie", "添加cookie",
# rule=configurable_to_me, rule=configurable_to_me,
# permission=SUPERUSER, permission=SUPERUSER,
# priority=5, priority=5,
# block=True, block=True,
# ) )
# do_add_cookie(add_cookie_matcher) # do_add_cookie(add_cookie_matcher)
#
# add_cookie_target_matcher = on_command( # add_cookie_target_matcher = on_command(
# "关联cookie", # "关联cookie",
# rule=configurable_to_me, # rule=configurable_to_me,

View File

@ -1,14 +1,14 @@
from typing import cast from typing import cast
from nonebot.typing import T_State from nonebot.adapters import Message, MessageTemplate
from nonebot.matcher import Matcher from nonebot.matcher import Matcher
from nonebot.params import Arg, ArgPlainText 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 import config
from ..config.db_model import Cookie from ..config.db_model import Cookie
from ..platform import platform_manager from ..platform import platform_manager
from .utils import common_platform, gen_handle_cancel
from ..utils.site import CookieClientManager, is_cookie_client_manager from ..utils.site import CookieClientManager, is_cookie_client_manager
@ -20,12 +20,12 @@ def do_add_cookie(add_cookie: type[Matcher]):
state["_prompt"] = ( state["_prompt"] = (
"请输入想要添加 Cookie 的平台,目前支持,请输入冒号左边的名称:\n" "请输入想要添加 Cookie 的平台,目前支持,请输入冒号左边的名称:\n"
+ "".join( + "".join(
[ [
f"{platform_name}: {platform_manager[platform_name].name}\n" f"{platform_name}: {platform_manager[platform_name].name}\n"
for platform_name in common_platform for platform_name in common_platform
if is_cookie_client_manager(platform_manager[platform_name].site.client_mgr) if is_cookie_client_manager(platform_manager[platform_name].site.client_mgr)
] ]
) )
+ "要查看全部平台请输入:“全部”\n中止添加cookie过程请输入“取消”" + "要查看全部平台请输入:“全部”\n中止添加cookie过程请输入“取消”"
) )
@ -53,7 +53,8 @@ def do_add_cookie(add_cookie: type[Matcher]):
@add_cookie.got("cookie", MessageTemplate("{_prompt}"), [handle_cancel]) @add_cookie.got("cookie", MessageTemplate("{_prompt}"), [handle_cancel])
async def got_cookie(state: T_State, cookie: Message = Arg()): 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() cookie_text = cookie.extract_plain_text()
if not await client_mgr.valid_cookie(cookie_text): if not await client_mgr.valid_cookie(cookie_text):
await add_cookie.reject("无效的 Cookie请检查后重新输入详情见<待添加的文档>") await add_cookie.reject("无效的 Cookie请检查后重新输入详情见<待添加的文档>")

View File

@ -58,3 +58,18 @@ class ApiError(Exception):
class SubUnit(NamedTuple): class SubUnit(NamedTuple):
sub_target: Target sub_target: Target
user_sub_infos: list[UserSubInfo] 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)

View File

@ -1,25 +1,25 @@
import difflib
import re import re
import sys import sys
import difflib
import nonebot import nonebot
from nonebot.plugin import require
from bs4 import BeautifulSoup as bs from bs4 import BeautifulSoup as bs
from nonebot.log import logger, default_format from nonebot.log import logger, default_format
from nonebot.plugin import require
from nonebot_plugin_saa import Text, Image, MessageSegmentFactory from nonebot_plugin_saa import Text, Image, MessageSegmentFactory
from .site import Site as Site from .context import ProcessContext as ProcessContext
from ..plugin_config import plugin_config
from .image import pic_merge as pic_merge
from .http import http_client as http_client from .http import http_client as http_client
from .image import capture_html as capture_html 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 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 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 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): class Singleton(type):

View File

@ -7,8 +7,9 @@ from datetime import datetime, timedelta
import httpx import httpx
from httpx import AsyncClient from httpx import AsyncClient
from nonebot.log import logger 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 ..config import config
from .http import http_client from .http import http_client
from ..config.db_model import Cookie 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_type: Literal["date", "interval", "cron"]
schedule_setting: dict schedule_setting: dict
name: str name: str
client_mgr: type[ClientManager] = DefaultClientManager client_mgr: type[ClientManager] = DefaultClientManager
require_browser: bool = False require_browser: bool = False
registry: list[type["Site"]]
def __str__(self): def __str__(self):
return f"[{self.name}]-{self.name}-{self.schedule_setting}" return f"[{self.name}]-{self.name}-{self.schedule_setting}"