diff --git a/nonebot_bison/config/subs_io/nbesf_model/v3.py b/nonebot_bison/config/subs_io/nbesf_model/v3.py new file mode 100644 index 0000000..6f525e3 --- /dev/null +++ b/nonebot_bison/config/subs_io/nbesf_model/v3.py @@ -0,0 +1,106 @@ +"""nbesf is Nonebot Bison Enchangable Subscribes File! ver.2""" + +from typing import Any +from functools import partial + +from nonebot.log import logger +from pydantic import BaseModel +from nonebot_plugin_saa.registries import AllSupportedPlatformTarget +from nonebot.compat import PYDANTIC_V2, ConfigDict, model_dump, type_validate_json, type_validate_python + +from ..utils import NBESFParseErr +from ....types import Tag, Category +from .base import NBESFBase, SubReceipt +from ...db_config import SubscribeDupException, config + +# ===== nbesf 定义格式 ====== # +NBESF_VERSION = 3 + + +class Target(BaseModel): + """Bsion快递包发货信息""" + + target_name: str + target: str + platform_name: str + default_schedule_weight: int + + if PYDANTIC_V2: + model_config = ConfigDict(from_attributes=True) + else: + + class Config: + orm_mode = True + + +class SubPayload(BaseModel): + """Bison快递包里的单件货物""" + + categories: list[Category] + tags: list[Tag] + target: Target + + if PYDANTIC_V2: + model_config = ConfigDict(from_attributes=True) + else: + + class Config: + orm_mode = True + + +class SubPack(BaseModel): + """Bison给指定用户派送的快递包""" + + # user_target: Bison快递包收货信息 + user_target: AllSupportedPlatformTarget + subs: list[SubPayload] + + +class SubGroup(NBESFBase): + """ + Bison的全部订单(按用户分组) + + 结构参见`nbesf_model`下的对应版本 + """ + + version: int = NBESF_VERSION + groups: list[SubPack] = [] + + +# ======================= # + + +async def subs_receipt_gen(nbesf_data: SubGroup): + for item in nbesf_data.groups: + sub_receipt = partial(SubReceipt, user=item.user_target) + + for sub in item.subs: + receipt = sub_receipt( + target=sub.target.target, + target_name=sub.target.target_name, + platform_name=sub.target.platform_name, + cats=sub.categories, + tags=sub.tags, + ) + try: + await config.add_subscribe(receipt.user, **model_dump(receipt, exclude={"user"})) + except SubscribeDupException: + logger.warning(f"!添加订阅条目 {repr(receipt)} 失败: 相同的订阅已存在") + except Exception as e: + logger.error(f"!添加订阅条目 {repr(receipt)} 失败: {repr(e)}") + else: + logger.success(f"添加订阅条目 {repr(receipt)} 成功!") + + +def nbesf_parser(raw_data: Any) -> SubGroup: + try: + if isinstance(raw_data, str): + nbesf_data = type_validate_json(SubGroup, raw_data) + else: + nbesf_data = type_validate_python(SubGroup, raw_data) + + except Exception as e: + logger.error("数据解析失败,该数据格式可能不满足NBESF格式标准!") + raise NBESFParseErr("数据解析失败") from e + else: + return nbesf_data