This commit is contained in:
2025-03-09 22:31:25 +08:00
parent 73b2199d4f
commit 184b4d495d

View File

@@ -1,3 +1,4 @@
import com.charleskorn.kaml.YamlNode
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@@ -89,12 +90,13 @@ data class Clash(
val tun: Tun? = null,
val listeners: List<Listener>? = null,
// Outbound
val proxies: List<Proxy>? = null,
val proxyProviders: Map<String, ProxyProvider>? = null,
// 未在文档中提到的属性
val experimental: Experimental? = null,
val tunnels: List<Tunnel>? = null,
val proxies: List<Proxy>? = null,
val proxyGroups: List<ProxyGroup>? = null,
val proxyProviders: Map<String, ProxyProvider>? = null,
val ruleProviders: Map<String, RuleProvider>? = null,
val rules: List<String>? = null,
val subRules: Map<String, List<String>>? = null,
@@ -246,268 +248,6 @@ data class FallbackFilter(
val domain: List<String>? = null
)
//@Serializable
//sealed class Proxy {
// @Serializable
// data class Socks5Proxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val tls: Boolean? = null,
// val fingerprint: String? = null,
// val skipCertVerify: Boolean? = null,
// val udp: Boolean? = null,
// val ipVersion: String? = null
// ) : Proxy()
//
// @Serializable
// data class HttpProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val tls: Boolean? = null,
// val skipCertVerify: Boolean? = null,
// val sni: String? = null,
// val fingerprint: String? = null,
// val ipVersion: String? = null
// ) : Proxy()
//
// @Serializable
// data class SnellProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val psk: String? = null,
// val version: Int? = null,
// val obfsOpts: ObfsOpts? = null
// ) : Proxy() {
// @Serializable
// data class ObfsOpts(
// val mode: String? = null,
// val host: String? = null
// )
// }
//
// @Serializable
// data class ShadowsocksProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val cipher: String? = null,
// val password: String? = null,
// val udp: Boolean? = null,
// val ipVersion: String? = null,
// val plugin: String? = null,
// val pluginOpts: PluginOpts? = null
// ) : Proxy() {
// @Serializable
// data class PluginOpts(
// val mode: String? = null,
// val host: String? = null,
// val tls: Boolean? = null,
// val skipCertVerify: Boolean? = null,
// val fingerprint: String? = null,
// val path: String? = null,
// val headers: Map<String, String>? = null,
// val clientFingerprint: String? = null,
// val version: Int? = null,
// val password: String? = null,
// val restlsScript: String? = null
// )
// }
//
// @Serializable
// data class VmessProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val uuid: String? = null,
// val alterId: Int? = null,
// val cipher: String? = null,
// val udp: Boolean? = null,
// val tls: Boolean? = null,
// val fingerprint: String? = null,
// val skipCertVerify: Boolean? = null,
// val servername: String? = null,
// val network: String? = null,
// val wsOpts: WsOpts? = null,
// val h2Opts: H2Opts? = null,
// val grpcOpts: GrpcOpts? = null
// ) : Proxy() {
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
//
// @Serializable
// data class H2Opts(
// val host: List<String>? = null,
// val path: String? = null
// )
//
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
// }
//
// @Serializable
// data class VlessProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val uuid: String? = null,
// val network: String? = null,
// val tls: Boolean? = null,
// val udp: Boolean? = null,
// val flow: String? = null,
// val clientFingerprint: String? = null,
// val servername: String? = null,
// val realityOpts: RealityOpts? = null,
// val grpcOpts: GrpcOpts? = null,
// val wsOpts: WsOpts? = null
// ) : Proxy() {
// @Serializable
// data class RealityOpts(
// val publicKey: String? = null,
// val shortId: String? = null
// )
//
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
//
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
// }
//
// @Serializable
// data class TrojanProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val password: String? = null,
// val clientFingerprint: String? = null,
// val udp: Boolean? = null,
// val sni: String? = null,
// val skipCertVerify: Boolean? = null,
// val flow: String? = null,
// val grpcOpts: GrpcOpts? = null,
// val wsOpts: WsOpts? = null
// ) : Proxy() {
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
//
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
// }
//
// @Serializable
// @SerialName("hysteria2")
// data class HysteriaProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val authStr: String? = null,
// val obfs: String? = null,
// val protocol: String? = null,
// val up: String? = null,
// val down: String? = null,
// val sni: String? = null,
// val skipCertVerify: Boolean? = null,
// val fingerprint: String? = null
// ) : Proxy()
//
// @Serializable
// data class WireguardProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val ip: String? = null,
// val ipv6: String? = null,
// val publicKey: String? = null,
// val privateKey: String? = null,
// val udp: Boolean? = null,
// val reserved: String? = null,
// val peers: List<Peer>? = null
// ) : Proxy() {
// @Serializable
// data class Peer(
// val server: String? = null,
// val port: Int? = null,
// val publicKey: String? = null,
// val allowedIps: List<String>? = null,
// val reserved: String? = null
// )
// }
//
// @Serializable
// data class TuicProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val token: String? = null,
// val uuid: String? = null,
// val password: String? = null,
// val udpRelayMode: String? = null,
// val congestionController: String? = null,
// val skipCertVerify: Boolean? = null,
// val sni: String? = null
// ) : Proxy()
//
// @Serializable
// data class ShadowsocksRProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val cipher: String? = null,
// val password: String? = null,
// val obfs: String? = null,
// val protocol: String? = null,
// val udp: Boolean? = null
// ) : Proxy()
//
// @Serializable
// data class SSHProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val privateKey: String? = null
// ) : Proxy()
//
// @Serializable
// data class MieruProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val transport: String? = null,
// val username: String? = null,
// val password: String? = null,
// val multiplexing: String? = null
// ) : Proxy()
//
// @Serializable
// data class DNSProxy(
// val name: String? = null
// ) : Proxy()
//}
@Serializable
sealed class Proxy {
abstract val tfo: Boolean?
@@ -677,8 +417,8 @@ sealed class Proxy {
val cipher: String? = null,
val udp: Boolean? = null,
val plugin: String? = null,
// TODO:
// val pluginOpts: Map<String, @Contextual Any>? = null,
// NOTE: 暂时先不对该字段进行解析
val pluginOpts: Map<String, YamlNode>? = null,
val udpOverTCP: Boolean? = null,
val udpOverTCPVersion: Int? = null,
val clientFingerprint: String? = null,
@@ -724,8 +464,7 @@ sealed class Proxy {
val psk: String? = null,
val udp: Boolean? = null,
val version: Int? = null,
// TODO:
// val obfsOpts: Map<String, @Contextual Any>? = null,
val obfsOpts: Map<String, SimpleObfsOption>? = null,
override val tfo: Boolean? = null,
override val mptcp: Boolean? = null,
@@ -1032,6 +771,12 @@ sealed class Proxy {
val up: String? = null,
val down: String? = null,
)
@Serializable
data class SimpleObfsOption(
val mode: String? = null,
val host: String? = null
)
}
@@ -1118,31 +863,177 @@ sealed class ProxyGroup {
) : ProxyGroup()
}
//@Serializable
//sealed class ProxyProvider {
// @Serializable
// data class HttpProxyProvider(
// val type: String? = null,
// val url: String? = null,
// val interval: Int? = null,
// val path: String? = null,
// val proxy: String? = null,
// val header: Header? = null,
// val healthCheck: HealthCheck? = null,
// val override: Override? = null
// ) : ProxyProvider()
//
// @Serializable
// data class InlineProxyProvider(
// val type: String? = null, val dialerProxy: String? = null, val payload: List<Payload>? = null
// ) : ProxyProvider()
//
// @Serializable
// data class FileProxyProvider(
// val type: String? = null, val path: String? = null, val healthCheck: HealthCheck? = null
// ) : ProxyProvider()
//}
//data class ProxyProvider(
// val type: String? = null,
// val path: String? = null,
// val url: String? = null,
// val proxy: String? = null,
// val interval: Int? = null,
// val filter: String? = null,
// val excludeFilter: String? = null,
// val excludeType: String? = null,
// val dialerProxy: String? = null,
// val sizeLimit: Long? = null,
// val payload: List<Map<String, Any>>? = null,
// val healthCheck: HealthCheck? = null,
// val override: Override? = null,
// val header: Map<String, List<String>>? = null
//) {
// data class HealthCheck(
// val enable: Boolean? = null,
// val url: String? = null,
// val interval: Int? = null,
// val testTimeout: Int? = null,
// val lazy: Boolean? = null,
// val expectedStatus: String? = null
// )
//
// data class Override(
// val tfo: Boolean? = null,
// val mptcp: Boolean? = null,
// val udp: Boolean? = null,
// val udpOverTcp: Boolean? = null,
// val up: String? = null,
// val down: String? = null,
// val dialerProxy: String? = null,
// val skipCertVerify: Boolean? = null,
// val interfaceName: String? = null,
// val routingMark: Int? = null,
// val ipVersion: String? = null,
// val additionalPrefix: String? = null,
// val additionalSuffix: String? = null,
// val proxyName: List<OverrideProxyNameSchema>? = null
// )
//
// data class OverrideProxyNameSchema(
// val pattern: String? = null,
// val target: String? = null
// )
//
//}
@Serializable
sealed class ProxyProvider {
abstract val name: String?
abstract val interval: Int?
abstract val filter: String?
abstract val excludeFilter: String?
abstract val excludeType: String?
abstract val dialerProxy: String?
abstract val healthCheck: HealthCheck?
abstract val override: Override?
@Serializable
data class HttpProxyProvider(
val type: String? = null,
val url: String? = null,
val interval: Int? = null,
@SerialName("file")
data class FileProvider(
override val name: String? = null,
override val interval: Int?,
override val filter: String?,
override val excludeFilter: String?,
override val excludeType: String?,
override val dialerProxy: String?,
override val healthCheck: HealthCheck?,
override val override: Override?,
val path: String?,
) : ProxyProvider()
@Serializable
@SerialName("http")
data class HttpProvider(
override val name: String? = null,
override val interval: Int?,
override val filter: String?,
override val excludeFilter: String?,
override val excludeType: String?,
override val dialerProxy: String?,
override val healthCheck: HealthCheck?,
override val override: Override?,
val url: String,
val path: String? = null,
val proxy: String? = null,
val header: Header? = null,
val healthCheck: HealthCheck? = null,
val override: Override? = null
val sizeLimit: Long? = null,
val header: Map<String, List<String>>? = null,
) : ProxyProvider()
@Serializable
data class InlineProxyProvider(
val type: String? = null, val dialerProxy: String? = null, val payload: List<Payload>? = null
@SerialName("inline")
data class InlineProvider(
override val name: String? = null,
override val interval: Int?,
override val filter: String?,
override val excludeFilter: String?,
override val excludeType: String?,
override val dialerProxy: String?,
override val healthCheck: HealthCheck?,
override val override: Override?,
// TODO:
val payload: List<Map<String, YamlNode>>?,
) : ProxyProvider()
@Serializable
data class FileProxyProvider(
val type: String? = null, val path: String? = null, val healthCheck: HealthCheck? = null
) : ProxyProvider()
data class HealthCheck(
val enable: Boolean,
val url: String,
val interval: Int,
val timeout: Int? = null,
val lazy: Boolean? = true,
val expectedStatus: String? = null,
)
@Serializable
data class Override(
val tfo: Boolean? = null,
val mptcp: Boolean? = null,
val udp: Boolean? = null,
val udpOverTcp: Boolean? = null,
val up: String? = null,
val down: String? = null,
val dialerProxy: String? = null,
val skipCertVerify: Boolean? = null,
val interfaceName: String? = null,
val routingMark: Int? = null,
val ipVersion: String? = null,
val additionalPrefix: String? = null,
val additionalSuffix: String? = null,
val proxyName: List<OverrideProxyName>? = null,
)
@Serializable
data class OverrideProxyName(
val pattern: String,
val target: String,
)
}
@Serializable
sealed class RuleProvider {
@Serializable