: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 .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

View File

@ -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")

View File

@ -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,

View File

@ -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请检查后重新输入详情见<待添加的文档>")

View File

@ -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)

View File

@ -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):

View File

@ -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}"