Files
archived-MoviePilot-Plugins/plugins.v2/clashruleprovider/models/proxy/__init__.py
wumode e15733b7de refactor(ClashRuleProvider): 重构后端核心逻辑与数据模型
- 数据模型重构: 全面引入 Pydantic 模型(ClashConfig, Proxy, ProxyGroup 等)替代原有字典结构,提供更严格的数据验证与类型安全。
- 数据迁移机制: 新增 v2.1.0 数据升级脚本,支持将旧版代理、策略组及规则数据自动迁移至新架构。
- 配置补丁系统: 实现基于 JSON Patch 的细粒度配置修补机制,替代旧版覆盖逻辑,提升配置修改的灵活性。
- 服务层优化: 重写 ClashRuleProviderService 以适配新对象模型,增强代码可维护性与扩展性。
- API模型同步: 更新相关 API 数据模型以保持与内部数据结构的一致性。
- 用户界面: 批量规则管理和数据项隐藏支持
2026-01-10 19:23:32 +08:00

79 lines
2.1 KiB
Python

import jsonpatch
from typing import Union, Any
from pydantic import Field, RootModel, model_validator
from .anytlsproxy import AnyTLSProxy
from .directproxy import DirectProxy
from .dnsproxy import DnsProxy
from .httpproxy import HttpProxy
from .hysteriaproxy import HysteriaProxy
from .hysteria2proxy import Hysteria2Proxy
from .mieruproxy import MieruProxy
from .networkmixin import NetworkMixin
from .proxybase import ProxyBase
from .shadowsocksproxy import ShadowsocksProxy
from .shadowsocksrproxy import ShadowsocksRProxy
from .snellproxy import SnellProxy
from .socks5proxy import Socks5Proxy
from .sshproxy import SshProxy
from .tlsmixin import TLSMixin
from .trojanproxy import TrojanProxy
from .tuicproxy import TuicProxy
from .vlessproxy import VlessProxy
from .vmessproxy import VmessProxy
from .wireguardproxy import WireGuardProxy
from ..generics import ResourceItem, ResourceList
ProxyType = Union[
AnyTLSProxy,
DirectProxy,
DnsProxy,
HttpProxy,
HysteriaProxy,
Hysteria2Proxy,
MieruProxy,
ShadowsocksProxy,
ShadowsocksRProxy,
SnellProxy,
Socks5Proxy,
SshProxy,
TrojanProxy,
TuicProxy,
VlessProxy,
VmessProxy,
WireGuardProxy,
]
class Proxy(RootModel[ProxyType]):
root: ProxyType = Field(..., discriminator="type")
@property
def name(self) -> str:
return self.root.name
def __getattr__(self, item):
return getattr(self.root, item)
def patch(self, patch: str) -> 'Proxy':
src = self.model_dump(mode='json', by_alias=True)
patched = jsonpatch.apply_patch(src, patch=patch, in_place=True)
return Proxy.model_validate(patched)
class ProxyData(ResourceItem[Proxy]):
raw: Union[str, dict[str, Any], None] = None
v2ray_link: str | None = None
@model_validator(mode="after")
def validate_name_consistency(self):
if self.name != self.data.name:
raise ValueError(f"name ({self.name}) must equal data.name ({self.data.name})")
return self
class Proxies(ResourceList[ProxyData]):
"""Proxies Collection"""
pass