"""nbesf is Nonebot Bison Enchangable Subscribes File! ver.2""" from functools import partial from typing import Any from nonebot.compat import PYDANTIC_V2, ConfigDict, model_dump, type_validate_json, type_validate_python from nonebot.log import logger from nonebot_plugin_saa.registries import AllSupportedPlatformTarget from pydantic import BaseModel, Field from nonebot_bison.config.db_config import SubscribeDupException, config from nonebot_bison.config.subs_io.utils import NBESFParseErr from nonebot_bison.types import Category, Tag from .base import NBESFBase, SubReceipt # ===== nbesf 定义格式 ====== # NBESF_VERSION = 2 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] = Field(default_factory=list) # ======================= # 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"!添加订阅条目 {receipt!r} 失败: 相同的订阅已存在") except Exception as e: logger.error(f"!添加订阅条目 {receipt!r} 失败: {e!r}") else: logger.success(f"添加订阅条目 {receipt!r} 成功!") 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