feat: 支持主分组隐藏节点并保留排序

This commit is contained in:
2026-10-05 10:00:06 +08:00
parent b6aa2bf30d
commit 6ed0307ea9
8 changed files with 124 additions and 14 deletions
+23 -3
View File
@@ -77,6 +77,7 @@ export type SubscriptionSettings = {
extraProxyGroups: string;
profileName: string;
mainProxyGroupMemberSlugs: string[];
mainProxyGroupHiddenSlugs: string[];
proxyGroups: ProxyGroupConfig[];
};
@@ -1193,6 +1194,9 @@ export async function getSubscriptionSettings() {
mainProxyGroupMemberSlugs: JSON.parse(
map.get("main_proxy_group_member_slugs_json") ?? "[]",
) as string[],
mainProxyGroupHiddenSlugs: JSON.parse(
map.get("main_proxy_group_hidden_slugs_json") ?? "[]",
) as string[],
proxyGroups: JSON.parse(
map.get("proxy_groups_json") ?? "[]",
) as ProxyGroupConfig[],
@@ -1234,10 +1238,13 @@ export async function saveProxyGroups(proxyGroups: ProxyGroupConfig[]) {
).run("proxy_groups_json", JSON.stringify(proxyGroups), now);
}
export async function saveMainProxyGroupMemberSlugs(memberSlugs: string[]) {
export async function saveMainProxyGroupMemberSlugs(
memberSlugs: string[],
hiddenSlugs?: string[],
) {
const db = await ensureDb();
const now = dbNow();
db.prepare(
const upsert = db.prepare(
`
INSERT INTO app_settings (key, value, updated_at)
VALUES (?, ?, ?)
@@ -1245,7 +1252,20 @@ export async function saveMainProxyGroupMemberSlugs(memberSlugs: string[]) {
value = excluded.value,
updated_at = excluded.updated_at
`,
).run("main_proxy_group_member_slugs_json", JSON.stringify(memberSlugs), now);
);
db.transaction(() => {
upsert.run(
"main_proxy_group_member_slugs_json",
JSON.stringify(memberSlugs),
now,
);
if (hiddenSlugs !== undefined)
upsert.run(
"main_proxy_group_hidden_slugs_json",
JSON.stringify([...new Set(hiddenSlugs)]),
now,
);
})();
}
export async function listSubscriptionNodes() {
+9 -2
View File
@@ -13,6 +13,7 @@ type ClashSettings = {
extraProxyGroups: string;
profileName: string;
mainProxyGroupMemberSlugs: string[];
mainProxyGroupHiddenSlugs?: string[];
proxyGroups: ProxyGroupConfig[];
};
@@ -225,14 +226,20 @@ export function buildSubscriptionConfig(input: {
const nodeNameBySlug = new Map(
eligibleNodes.map((node) => [node.slug, getNodeProxyName(node)]),
);
const proxyNames = orderedEligibleNodes.map((node) => getNodeProxyName(node));
const hidden = new Set(input.settings.mainProxyGroupHiddenSlugs ?? []);
const proxyNames = orderedEligibleNodes
.filter((node) => !hidden.has(node.slug))
.map((node) => getNodeProxyName(node));
const proxiesBlock = orderedEligibleNodes
.map((node) => renderSubscriptionProxy(node, authString, input.user))
.join("\n");
const defaultTemplate =
input.settings.template.trimEnd() || readDefaultTemplate();
const renderedGroups = [
renderGroupEntry(input.settings.profileName || "FeieProxy", proxyNames),
renderGroupEntry(
input.settings.profileName || "FeieProxy",
proxyNames.length ? proxyNames : ["DIRECT"],
),
...input.settings.proxyGroups
.map((group) => {
const members = group.memberSlugs