Optimize desktop view

Optimize logs, requests, connection pages

Optimize windows tray auto hide

Optimize some details

Update core
This commit is contained in:
chen08209
2025-06-07 01:48:34 +08:00
parent adb890d763
commit 1154e7b245
169 changed files with 6484 additions and 5230 deletions

View File

@@ -19,88 +19,88 @@ const defaultMixedPort = 7890;
const defaultKeepAliveInterval = 30;
const defaultBypassPrivateRouteAddress = [
"1.0.0.0/8",
"2.0.0.0/7",
"4.0.0.0/6",
"8.0.0.0/7",
"11.0.0.0/8",
"12.0.0.0/6",
"16.0.0.0/4",
"32.0.0.0/3",
"64.0.0.0/3",
"96.0.0.0/4",
"112.0.0.0/5",
"120.0.0.0/6",
"124.0.0.0/7",
"126.0.0.0/8",
"128.0.0.0/3",
"160.0.0.0/5",
"168.0.0.0/8",
"169.0.0.0/9",
"169.128.0.0/10",
"169.192.0.0/11",
"169.224.0.0/12",
"169.240.0.0/13",
"169.248.0.0/14",
"169.252.0.0/15",
"169.255.0.0/16",
"170.0.0.0/7",
"172.0.0.0/12",
"172.32.0.0/11",
"172.64.0.0/10",
"172.128.0.0/9",
"173.0.0.0/8",
"174.0.0.0/7",
"176.0.0.0/4",
"192.0.0.0/9",
"192.128.0.0/11",
"192.160.0.0/13",
"192.169.0.0/16",
"192.170.0.0/15",
"192.172.0.0/14",
"192.176.0.0/12",
"192.192.0.0/10",
"193.0.0.0/8",
"194.0.0.0/7",
"196.0.0.0/6",
"200.0.0.0/5",
"208.0.0.0/4",
"240.0.0.0/5",
"248.0.0.0/6",
"252.0.0.0/7",
"254.0.0.0/8",
"255.0.0.0/9",
"255.128.0.0/10",
"255.192.0.0/11",
"255.224.0.0/12",
"255.240.0.0/13",
"255.248.0.0/14",
"255.252.0.0/15",
"255.254.0.0/16",
"255.255.0.0/17",
"255.255.128.0/18",
"255.255.192.0/19",
"255.255.224.0/20",
"255.255.240.0/21",
"255.255.248.0/22",
"255.255.252.0/23",
"255.255.254.0/24",
"255.255.255.0/25",
"255.255.255.128/26",
"255.255.255.192/27",
"255.255.255.224/28",
"255.255.255.240/29",
"255.255.255.248/30",
"255.255.255.252/31",
"255.255.255.254/32",
"::/1",
"8000::/2",
"c000::/3",
"e000::/4",
"f000::/5",
"f800::/6",
"fe00::/9",
"fec0::/10"
'1.0.0.0/8',
'2.0.0.0/7',
'4.0.0.0/6',
'8.0.0.0/7',
'11.0.0.0/8',
'12.0.0.0/6',
'16.0.0.0/4',
'32.0.0.0/3',
'64.0.0.0/3',
'96.0.0.0/4',
'112.0.0.0/5',
'120.0.0.0/6',
'124.0.0.0/7',
'126.0.0.0/8',
'128.0.0.0/3',
'160.0.0.0/5',
'168.0.0.0/8',
'169.0.0.0/9',
'169.128.0.0/10',
'169.192.0.0/11',
'169.224.0.0/12',
'169.240.0.0/13',
'169.248.0.0/14',
'169.252.0.0/15',
'169.255.0.0/16',
'170.0.0.0/7',
'172.0.0.0/12',
'172.32.0.0/11',
'172.64.0.0/10',
'172.128.0.0/9',
'173.0.0.0/8',
'174.0.0.0/7',
'176.0.0.0/4',
'192.0.0.0/9',
'192.128.0.0/11',
'192.160.0.0/13',
'192.169.0.0/16',
'192.170.0.0/15',
'192.172.0.0/14',
'192.176.0.0/12',
'192.192.0.0/10',
'193.0.0.0/8',
'194.0.0.0/7',
'196.0.0.0/6',
'200.0.0.0/5',
'208.0.0.0/4',
'240.0.0.0/5',
'248.0.0.0/6',
'252.0.0.0/7',
'254.0.0.0/8',
'255.0.0.0/9',
'255.128.0.0/10',
'255.192.0.0/11',
'255.224.0.0/12',
'255.240.0.0/13',
'255.248.0.0/14',
'255.252.0.0/15',
'255.254.0.0/16',
'255.255.0.0/17',
'255.255.128.0/18',
'255.255.192.0/19',
'255.255.224.0/20',
'255.255.240.0/21',
'255.255.248.0/22',
'255.255.252.0/23',
'255.255.254.0/24',
'255.255.255.0/25',
'255.255.255.128/26',
'255.255.255.192/27',
'255.255.255.224/28',
'255.255.255.240/29',
'255.255.255.248/30',
'255.255.255.252/31',
'255.255.255.254/32',
'::/1',
'8000::/2',
'c000::/3',
'e000::/4',
'f000::/5',
'f800::/6',
'fe00::/9',
'fec0::/10'
];
@freezed
@@ -117,11 +117,11 @@ class ProxyGroup with _$ProxyGroup {
bool? lazy,
String? url,
int? timeout,
@JsonKey(name: "max-failed-times") int? maxFailedTimes,
@JsonKey(name: 'max-failed-times') int? maxFailedTimes,
String? filter,
@JsonKey(name: "expected-filter") String? excludeFilter,
@JsonKey(name: "exclude-type") String? excludeType,
@JsonKey(name: "expected-status") dynamic expectedStatus,
@JsonKey(name: 'expected-filter') String? excludeFilter,
@JsonKey(name: 'exclude-type') String? excludeType,
@JsonKey(name: 'expected-status') dynamic expectedStatus,
bool? hidden,
String? icon,
}) = _ProxyGroup;
@@ -144,15 +144,15 @@ class RuleProvider with _$RuleProvider {
class Sniffer with _$Sniffer {
const factory Sniffer({
@Default(false) bool enable,
@Default(true) @JsonKey(name: "override-destination") bool overrideDest,
@Default(true) @JsonKey(name: 'override-destination') bool overrideDest,
@Default([]) List<String> sniffing,
@Default([]) @JsonKey(name: "force-domain") List<String> forceDomain,
@Default([]) @JsonKey(name: "skip-src-address") List<String> skipSrcAddress,
@Default([]) @JsonKey(name: "skip-dst-address") List<String> skipDstAddress,
@Default([]) @JsonKey(name: "skip-domain") List<String> skipDomain,
@Default([]) @JsonKey(name: "port-whitelist") List<String> port,
@Default(true) @JsonKey(name: "force-dns-mapping") bool forceDnsMapping,
@Default(true) @JsonKey(name: "parse-pure-ip") bool parsePureIp,
@Default([]) @JsonKey(name: 'force-domain') List<String> forceDomain,
@Default([]) @JsonKey(name: 'skip-src-address') List<String> skipSrcAddress,
@Default([]) @JsonKey(name: 'skip-dst-address') List<String> skipDstAddress,
@Default([]) @JsonKey(name: 'skip-domain') List<String> skipDomain,
@Default([]) @JsonKey(name: 'port-whitelist') List<String> port,
@Default(true) @JsonKey(name: 'force-dns-mapping') bool forceDnsMapping,
@Default(true) @JsonKey(name: 'parse-pure-ip') bool parsePureIp,
@Default({}) Map<String, SnifferConfig> sniff,
}) = _Sniffer;
@@ -168,7 +168,7 @@ List<String> _formJsonPorts(List? ports) {
class SnifferConfig with _$SnifferConfig {
const factory SnifferConfig({
@Default([]) @JsonKey(fromJson: _formJsonPorts) List<String> ports,
@JsonKey(name: "override-destination") bool? overrideDest,
@JsonKey(name: 'override-destination') bool? overrideDest,
}) = _SnifferConfig;
factory SnifferConfig.fromJson(Map<String, Object?> json) =>
@@ -180,10 +180,10 @@ class Tun with _$Tun {
const factory Tun({
@Default(false) bool enable,
@Default(appName) String device,
@JsonKey(name: "auto-route") @Default(false) bool autoRoute,
@JsonKey(name: 'auto-route') @Default(false) bool autoRoute,
@Default(TunStack.mixed) TunStack stack,
@JsonKey(name: "dns-hijack") @Default(["any:53"]) List<String> dnsHijack,
@JsonKey(name: "route-address") @Default([]) List<String> routeAddress,
@JsonKey(name: 'dns-hijack') @Default(['any:53']) List<String> dnsHijack,
@JsonKey(name: 'route-address') @Default([]) List<String> routeAddress,
}) = _Tun;
factory Tun.fromJson(Map<String, Object?> json) => _$TunFromJson(json);
@@ -222,13 +222,13 @@ extension TunExt on Tun {
class FallbackFilter with _$FallbackFilter {
const factory FallbackFilter({
@Default(true) bool geoip,
@Default("CN") @JsonKey(name: "geoip-code") String geoipCode,
@Default(["gfw"]) List<String> geosite,
@Default(["240.0.0.0/4"]) List<String> ipcidr,
@Default('CN') @JsonKey(name: 'geoip-code') String geoipCode,
@Default(['gfw']) List<String> geosite,
@Default(['240.0.0.0/4']) List<String> ipcidr,
@Default([
"+.google.com",
"+.facebook.com",
"+.youtube.com",
'+.google.com',
'+.facebook.com',
'+.youtube.com',
])
List<String> domain,
}) = _FallbackFilter;
@@ -241,51 +241,51 @@ class FallbackFilter with _$FallbackFilter {
class Dns with _$Dns {
const factory Dns({
@Default(true) bool enable,
@Default("0.0.0.0:1053") String listen,
@Default(false) @JsonKey(name: "prefer-h3") bool preferH3,
@Default(true) @JsonKey(name: "use-hosts") bool useHosts,
@Default(true) @JsonKey(name: "use-system-hosts") bool useSystemHosts,
@Default(false) @JsonKey(name: "respect-rules") bool respectRules,
@Default('0.0.0.0:1053') String listen,
@Default(false) @JsonKey(name: 'prefer-h3') bool preferH3,
@Default(true) @JsonKey(name: 'use-hosts') bool useHosts,
@Default(true) @JsonKey(name: 'use-system-hosts') bool useSystemHosts,
@Default(false) @JsonKey(name: 'respect-rules') bool respectRules,
@Default(false) bool ipv6,
@Default(["223.5.5.5"])
@JsonKey(name: "default-nameserver")
@Default(['223.5.5.5'])
@JsonKey(name: 'default-nameserver')
List<String> defaultNameserver,
@Default(DnsMode.fakeIp)
@JsonKey(name: "enhanced-mode")
@JsonKey(name: 'enhanced-mode')
DnsMode enhancedMode,
@Default("198.18.0.1/16")
@JsonKey(name: "fake-ip-range")
@Default('198.18.0.1/16')
@JsonKey(name: 'fake-ip-range')
String fakeIpRange,
@Default([
"*.lan",
"localhost.ptlogin2.qq.com",
'*.lan',
'localhost.ptlogin2.qq.com',
])
@JsonKey(name: "fake-ip-filter")
@JsonKey(name: 'fake-ip-filter')
List<String> fakeIpFilter,
@Default({
"www.baidu.com": "114.114.114.114",
"+.internal.crop.com": "10.0.0.1",
"geosite:cn": "https://doh.pub/dns-query"
'www.baidu.com': '114.114.114.114',
'+.internal.crop.com': '10.0.0.1',
'geosite:cn': 'https://doh.pub/dns-query'
})
@JsonKey(name: "nameserver-policy")
@JsonKey(name: 'nameserver-policy')
Map<String, String> nameserverPolicy,
@Default([
"https://doh.pub/dns-query",
"https://dns.alidns.com/dns-query",
'https://doh.pub/dns-query',
'https://dns.alidns.com/dns-query',
])
List<String> nameserver,
@Default([
"tls://8.8.4.4",
"tls://1.1.1.1",
'tls://8.8.4.4',
'tls://1.1.1.1',
])
List<String> fallback,
@Default([
"https://doh.pub/dns-query",
'https://doh.pub/dns-query',
])
@JsonKey(name: "proxy-server-nameserver")
@JsonKey(name: 'proxy-server-nameserver')
List<String> proxyServerNameserver,
@Default(FallbackFilter())
@JsonKey(name: "fallback-filter")
@JsonKey(name: 'fallback-filter')
FallbackFilter fallbackFilter,
}) = _Dns;
@@ -304,19 +304,19 @@ class Dns with _$Dns {
class GeoXUrl with _$GeoXUrl {
const factory GeoXUrl({
@Default(
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb',
)
String mmdb,
@Default(
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb",
'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb',
)
String asn,
@Default(
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat",
'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat',
)
String geoip,
@Default(
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat",
'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat',
)
String geosite,
}) = _GeoXUrl;
@@ -349,10 +349,10 @@ class ParsedRule with _$ParsedRule {
}) = _ParsedRule;
factory ParsedRule.parseString(String value) {
final splits = value.split(",");
final splits = value.split(',');
final shortSplits = splits
.where(
(item) => !item.contains("src") && !item.contains("no-resolve"),
(item) => !item.contains('src') && !item.contains('no-resolve'),
)
.toList();
final ruleAction = RuleAction.values.firstWhere(
@@ -372,17 +372,17 @@ class ParsedRule with _$ParsedRule {
String? ruleProvider;
if (ruleAction == RuleAction.RULE_SET) {
ruleProvider = shortSplits.sublist(1, shortSplits.length - 1).join(",");
ruleProvider = shortSplits.sublist(1, shortSplits.length - 1).join(',');
} else {
content = shortSplits.sublist(1, shortSplits.length - 1).join(",");
content = shortSplits.sublist(1, shortSplits.length - 1).join(',');
}
return ParsedRule(
ruleAction: ruleAction,
content: content,
src: splits.contains("src"),
src: splits.contains('src'),
ruleProvider: ruleProvider,
noResolve: splits.contains("no-resolve"),
noResolve: splits.contains('no-resolve'),
subRule: subRule,
ruleTarget: ruleTarget,
);
@@ -396,10 +396,10 @@ extension ParsedRuleExt on ParsedRule {
ruleAction == RuleAction.RULE_SET ? ruleProvider : content,
ruleAction == RuleAction.SUB_RULE ? subRule : ruleTarget,
if (ruleAction.hasParams) ...[
if (src) "src",
if (noResolve) "no-resolve",
if (src) 'src',
if (noResolve) 'no-resolve',
]
].join(",");
].join(',');
}
}
@@ -430,7 +430,7 @@ class SubRule with _$SubRule {
_$SubRuleFromJson(json);
}
_genRule(List<dynamic>? rules) {
List<Rule> _genRule(List<dynamic>? rules) {
if (rules == null) {
return [];
}
@@ -458,12 +458,12 @@ List<SubRule> _genSubRules(Map<String, dynamic> json) {
@freezed
class ClashConfigSnippet with _$ClashConfigSnippet {
const factory ClashConfigSnippet({
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
@JsonKey(fromJson: _genRule, name: "rules") @Default([]) List<Rule> rule,
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
@Default([]) @JsonKey(name: 'proxy-groups') List<ProxyGroup> proxyGroups,
@JsonKey(fromJson: _genRule, name: 'rules') @Default([]) List<Rule> rule,
@JsonKey(name: 'rule-providers', fromJson: _genRuleProviders)
@Default([])
List<RuleProvider> ruleProvider,
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
@JsonKey(name: 'sub-rules', fromJson: _genSubRules)
@Default([])
List<SubRule> subRules,
}) = _ClashConfigSnippet;
@@ -475,39 +475,39 @@ class ClashConfigSnippet with _$ClashConfigSnippet {
@freezed
class ClashConfig with _$ClashConfig {
const factory ClashConfig({
@Default(defaultMixedPort) @JsonKey(name: "mixed-port") int mixedPort,
@Default(0) @JsonKey(name: "socks-port") int socksPort,
@Default(0) @JsonKey(name: "port") int port,
@Default(0) @JsonKey(name: "redir-port") int redirPort,
@Default(0) @JsonKey(name: "tproxy-port") int tproxyPort,
@Default(defaultMixedPort) @JsonKey(name: 'mixed-port') int mixedPort,
@Default(0) @JsonKey(name: 'socks-port') int socksPort,
@Default(0) @JsonKey(name: 'port') int port,
@Default(0) @JsonKey(name: 'redir-port') int redirPort,
@Default(0) @JsonKey(name: 'tproxy-port') int tproxyPort,
@Default(Mode.rule) Mode mode,
@Default(false) @JsonKey(name: "allow-lan") bool allowLan,
@Default(LogLevel.error) @JsonKey(name: "log-level") LogLevel logLevel,
@Default(false) @JsonKey(name: 'allow-lan') bool allowLan,
@Default(LogLevel.error) @JsonKey(name: 'log-level') LogLevel logLevel,
@Default(false) bool ipv6,
@Default(FindProcessMode.off)
@JsonKey(
name: "find-process-mode",
name: 'find-process-mode',
unknownEnumValue: FindProcessMode.always,
)
FindProcessMode findProcessMode,
@Default(defaultKeepAliveInterval)
@JsonKey(name: "keep-alive-interval")
@JsonKey(name: 'keep-alive-interval')
int keepAliveInterval,
@Default(true) @JsonKey(name: "unified-delay") bool unifiedDelay,
@Default(true) @JsonKey(name: "tcp-concurrent") bool tcpConcurrent,
@Default(true) @JsonKey(name: 'unified-delay') bool unifiedDelay,
@Default(true) @JsonKey(name: 'tcp-concurrent') bool tcpConcurrent,
@Default(defaultTun) @JsonKey(fromJson: Tun.safeFormJson) Tun tun,
@Default(defaultDns) @JsonKey(fromJson: Dns.safeDnsFromJson) Dns dns,
@Default(defaultGeoXUrl)
@JsonKey(name: "geox-url", fromJson: GeoXUrl.safeFormJson)
@JsonKey(name: 'geox-url', fromJson: GeoXUrl.safeFormJson)
GeoXUrl geoXUrl,
@Default(GeodataLoader.memconservative)
@JsonKey(name: "geodata-loader")
@JsonKey(name: 'geodata-loader')
GeodataLoader geodataLoader,
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
@Default([]) @JsonKey(name: 'proxy-groups') List<ProxyGroup> proxyGroups,
@Default([]) List<String> rule,
@JsonKey(name: "global-ua") String? globalUa,
@JsonKey(name: 'global-ua') String? globalUa,
@Default(ExternalControllerStatus.close)
@JsonKey(name: "external-controller")
@JsonKey(name: 'external-controller')
ExternalControllerStatus externalController,
@Default({}) HostsMap hosts,
}) = _ClashConfig;