From 716c23b44be06753c8c70e22414f611753895e32 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sat, 14 Dec 2024 21:20:32 +0800 Subject: [PATCH] Fix AdGuardHome & Clash Output --- Build/lib/rules/base.ts | 10 +++++--- Build/lib/rules/domainset.ts | 46 ++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/Build/lib/rules/base.ts b/Build/lib/rules/base.ts index 6bafa3e81..49155a991 100644 --- a/Build/lib/rules/base.ts +++ b/Build/lib/rules/base.ts @@ -242,7 +242,7 @@ export abstract class RuleOutput { return this; } - protected abstract preprocess(): NonNullable; + protected abstract preprocess(): TPreprocessed extends null ? null : NonNullable; async done() { await this.pendingPromise; @@ -258,13 +258,17 @@ export abstract class RuleOutput { } private $$preprocessed: TPreprocessed | null = null; - get $preprocessed() { + protected runPreprocess() { if (this.$$preprocessed === null) { this.guardPendingPromise(); this.$$preprocessed = this.span.traceChildSync('preprocess', () => this.preprocess()); } - return this.$$preprocessed; + } + + get $preprocessed(): TPreprocessed extends null ? null : NonNullable { + this.runPreprocess(); + return this.$$preprocessed as any; } async writeClash(outputDir?: null | string) { diff --git a/Build/lib/rules/domainset.ts b/Build/lib/rules/domainset.ts index f681225a4..0b1e385c1 100644 --- a/Build/lib/rules/domainset.ts +++ b/Build/lib/rules/domainset.ts @@ -15,10 +15,9 @@ export class DomainsetOutput extends RuleOutput { private $clash: string[] = ['this_ruleset_is_made_by_sukkaw.ruleset.skk.moe']; private $singbox_domains: string[] = ['this_ruleset_is_made_by_sukkaw.ruleset.skk.moe']; private $singbox_domains_suffixes: string[] = ['this_ruleset_is_made_by_sukkaw.ruleset.skk.moe']; - + private $adguardhome: string[] = []; preprocess() { const kwfilter = createKeywordFilter(this.domainKeywords); - const results: string[] = []; this.domainTrie.dumpWithoutDot((domain, subdomain) => { if (kwfilter(domain)) { @@ -27,23 +26,31 @@ export class DomainsetOutput extends RuleOutput { this.$surge.push(subdomain ? '.' + domain : domain); this.$clash.push(subdomain ? `+.${domain}` : domain); - (subdomain ? this.$singbox_domains : this.$singbox_domains_suffixes).push(domain); + (subdomain ? this.$singbox_domains_suffixes : this.$singbox_domains).push(domain); - results.push(domain); + if (subdomain) { + this.$adguardhome.push(`||${domain}^`); + } else { + this.$adguardhome.push(`|${domain}^`); + } }, true); - return results; + return this.$surge; } surge(): string[] { + this.runPreprocess(); return this.$surge; } clash(): string[] { + this.runPreprocess(); return this.$clash; } singbox(): string[] { + this.runPreprocess(); + return RuleOutput.jsonToLines({ version: 2, rules: [{ @@ -55,6 +62,8 @@ export class DomainsetOutput extends RuleOutput { protected apexDomainMap: Map | null = null; getStatMap() { + this.runPreprocess(); + invariant(this.$preprocessed, 'Non dumped yet'); if (!this.apexDomainMap) { @@ -90,7 +99,7 @@ export class DomainsetOutput extends RuleOutput { mitmSgmodule = undefined; adguardhome(): string[] { - const results: string[] = []; + this.runPreprocess(); // const whitelistArray = sortDomains(Array.from(whitelist)); // for (let i = 0, len = whitelistArray.length; i < len; i++) { @@ -102,51 +111,42 @@ export class DomainsetOutput extends RuleOutput { // } // } - for (let i = 0, len = this.$preprocessed.length; i < len; i++) { - const domain = this.$preprocessed[i]; - if (domain[0] === '.') { - results.push(`||${domain.slice(1)}^`); - } else { - results.push(`|${domain}^`); - } - } - for (const wildcard of this.domainWildcard) { const processed = wildcard.replaceAll('?', '*'); if (processed.startsWith('*.')) { - results.push(`||${processed.slice(2)}^`); + this.$adguardhome.push(`||${processed.slice(2)}^`); } else { - results.push(`|${processed}^`); + this.$adguardhome.push(`|${processed}^`); } } for (const keyword of this.domainKeywords) { // Use regex to match keyword - results.push(`/${escapeStringRegexp(keyword)}/`); + this.$adguardhome.push(`/${escapeStringRegexp(keyword)}/`); } for (const ipGroup of [this.ipcidr, this.ipcidrNoResolve]) { for (const ipcidr of ipGroup) { if (ipcidr.endsWith('/32')) { - results.push(`||${ipcidr.slice(0, -3)}`); + this.$adguardhome.push(`||${ipcidr.slice(0, -3)}`); /* else if (ipcidr.endsWith('.0/24')) { results.push(`||${ipcidr.slice(0, -6)}.*`); } */ } else { - results.push(`||${ipcidr}^`); + this.$adguardhome.push(`||${ipcidr}^`); } } } for (const ipGroup of [this.ipcidr6, this.ipcidr6NoResolve]) { for (const ipcidr of ipGroup) { if (ipcidr.endsWith('/128')) { - results.push(`||${ipcidr.slice(0, -4)}`); + this.$adguardhome.push(`||${ipcidr.slice(0, -4)}`); } else { - results.push(`||${ipcidr}`); + this.$adguardhome.push(`||${ipcidr}`); } } } - return results; + return this.$adguardhome; } }