-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgroups.js
118 lines (109 loc) · 4.54 KB
/
groups.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
const region_groups = {
'🇭🇰 香港': { fallback: true, urltest: true, filter: '香港', },
'🇸🇬 新加坡': { fallback: true, urltest: true, filter: '新加坡', },
'🇹🇼 台湾': { fallback: true, urltest: false, filter: '台湾', },
'🇯🇵 日本': { fallback: true, urltest: false, filter: '日本', },
'🇺🇸 美国': { fallback: true, urltest: false, filter: '美国', },
'🇺🇳 其它': { fallback: false, urltest: false, filter: '其它', },
}
const getSmartGroup = (region='', filter=[]) => {
filter = Array.isArray(filter) ? filter : [filter]
const groups = ['🚀 默认代理', ...Object.keys(region_groups), '📦 全部节点', '🎯 直连']
.filter(g => !filter.includes(g))
if (region) {
return [region, ...groups.filter(g => g !== region)]
}
return groups
}
const direct = ['🎯 直连', '🚀 默认代理']
const base_groups = [
{name: '🚀 默认代理', type: 'select', proxies: [...getSmartGroup('', '🚀 默认代理'), '🏠 回家穿透']},
{name: '🏠 回家穿透', type: 'select', proxies:['直连'], use:['GoHome']},
{name: '🛑 广告', type: 'select', proxies: ['REJECT', ...direct]},
{name: '🐟 漏网之鱼', type: 'select', proxies: getSmartGroup()},
]
const rule_groups = [
{name: '📹 YouTube', type: 'select', proxies: getSmartGroup()},
{name: '🍀 Google', type: 'select', proxies: getSmartGroup()},
{name: '🤖 AI', type: 'select', proxies: [...getSmartGroup('🇸🇬 新加坡')]},
{name: '🍎 Apple', type: 'select', proxies: getSmartGroup()},
{name: '🍎 Apple 中国', type: 'select', proxies: direct},
{name: '🐬 OneDrive', type: 'select', proxies: getSmartGroup()},
{name: '🪟 Microsoft', type: 'select', proxies: getSmartGroup()},
{name: '🪟 Microsoft 中国', type: 'select', proxies: direct},
{name: '🎵 TikTok', type: 'select', proxies: [...getSmartGroup('🇯🇵 日本')]},
{name: '📲 Telegram', type: 'select', proxies: [...getSmartGroup('🇸🇬 新加坡')]},
{name: '🎥 NETFLIX', type: 'select', proxies: [...getSmartGroup('🇸🇬 新加坡')]},
{name: '👨🏿💻 GitHub', type: 'select', proxies: getSmartGroup()},
{name: '🎮 游戏平台', type: 'select', proxies: getSmartGroup()},
{name: '🎮 游戏下载', type: 'select', proxies: direct},
{name: '✈️ Speedtest', type: 'select', proxies: direct},
]
const final_groups = [
{name: '🎯 直连', type: 'select', proxies: ['直连']},
{name: '📦 全部节点', type: 'select', 'include-all': true},
]
const testOptions = {
tolerance: 20, interval: 300,
}
function getProxyGroup(proxies) {
const groups = []
groups.push(...base_groups, ...rule_groups)
const regin = []
const reginAppend = []
for (const [name, options] of Object.entries(region_groups)) {
// 指定节点列表
if (proxies) {
regin.push({
name, type: 'select',
proxies: proxies.filter(p => p.includes(options.filter))
})
if (options.urltest) {
reginAppend.push({
name:`⚡${name}测速`, type: 'url-test', ...testOptions,
proxies: proxies.filter(p => p.includes(options.filter))
})
regin.at(-1).proxies.unshift(`⚡${name}测速`)
}
if (options.fallback) {
reginAppend.push({
name:`🔁${name}故转`, type: 'fallback', ...testOptions,
proxies: proxies.filter(p => p.includes(options.filter))
})
regin.at(-1).proxies.unshift(`🔁${name}故转`)
}
// 使用 include-all & filter
} else {
regin.push({name, type: 'select', proxies: [`📦${name}节点`]})
const opt = {
...testOptions, 'include-all': true, filter: '(?i)' + options.filter
}
if (options.urltest) {
reginAppend.push({
name:`⚡${name}测速`, type: 'url-test', ...opt,
})
regin.at(-1).proxies.unshift(`⚡${name}测速`)
}
if (options.fallback) {
reginAppend.push({
name:`🔁${name}故转`, type: 'fallback', ...opt,
})
regin.at(-1).proxies.unshift(`🔁${name}故转`)
}
if (options.urltest || options.fallback) {
reginAppend.push({
name:`📦${name}节点`, type: 'select',
'include-all': true, filter: '(?i)' + options.filter
})
} else {
delete regin.at(-1).proxies
regin.at(-1)['include-all'] = true
regin.at(-1).filter = '(?i)' + options.filter
}
}
}
groups.push(...regin, ...reginAppend)
groups.push(...final_groups)
return {'proxy-groups': groups}
}
module.exports = getProxyGroup