diff --git a/app/Utils/Client/Protocols/Clash.php b/app/Utils/Client/Protocols/Clash.php index 07c0c68..fcae622 100644 --- a/app/Utils/Client/Protocols/Clash.php +++ b/app/Utils/Client/Protocols/Clash.php @@ -34,33 +34,47 @@ class Clash extends Protocol } $proxy = []; $proxies = []; - $proxiesOther = array(); + $proxiesOther = []; + foreach ($servers as $item) { - if ($item['type'] === 'shadowsocks') { - array_push($proxy, self::buildShadowsocks($user['uuid'], $item)); - array_push($proxies, $item['name']); - } - if ($item['type'] === 'v2ray') { - array_push($proxy, self::buildVmess($user['uuid'], $item)); - array_push($proxies, $item['name']); - } - if ($item['type'] === 'trojan') { - array_push($proxy, self::buildTrojan($user['uuid'], $item)); - array_push($proxies, $item['name']); - } - if(!is_null($item['tags'])){ + $isGroups = false; + if (!empty($item['tags'])) { foreach ($item['tags'] as $tag) { - if(strpos($tag, "node:") === 0){ - $nodearr = explode(":", $tag); - if(array_key_exists($nodearr[1], $proxiesOther)){ - array_push($proxiesOther[$nodearr[1]], $item['name']); - }else{ - $proxiesOther[$nodearr[1]] = [$item['name']]; + if (strpos($tag, 'node:') === 0) { + $group = substr($tag, 5); + if ($group !== '') { + $proxiesOther[$group][] = $item['name']; + if (strpos($item['name'], $group) !== false) { + $isGroups = true; + } } } } } + + switch ($item['type']) { + case 'shadowsocks': + $proxy[] = self::buildShadowsocks($user['uuid'], $item); + break; + + case 'v2ray': + $proxy[] = self::buildVmess($user['uuid'], $item); + break; + + case 'trojan': + $proxy[] = self::buildTrojan($user['uuid'], $item); + break; + + default: + continue 2; + } + + if (!$isGroups) { + $proxies[] = $item['name']; + } } + $proxiesOther0 = $config['proxy-groups'][0]['proxies']; + $config['proxy-groups'][0]['proxies']=array(); $config['proxies'] = array_merge($config['proxies'] ?: [], $proxy); foreach ($config['proxy-groups'] as $k => $v) { if (!is_array($config['proxy-groups'][$k]['proxies'])) { @@ -73,12 +87,18 @@ class Clash extends Protocol $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies); } } - + + foreach ($proxiesOther as $k => $v) { $vo = ['name' => $k, 'type' => 'fallback','proxies' => $v,'url' => "http://www.gstatic.com/generate_204",'interval' => 600]; array_push($config['proxy-groups'], $vo); - array_push($config['proxy-groups'][0]['proxies'],$k); + array_push($proxiesOther0,$k); } + $config['proxy-groups'][0]['proxies'] = array_merge($proxiesOther0,$config['proxy-groups'][0]['proxies']); + // Force the current subscription domain to be a direct rule + $subsDomain = $_SERVER['SERVER_NAME']; + $subsDomainRule = "DOMAIN,{$subsDomain},DIRECT"; + array_unshift($config['rules'], $subsDomainRule); // Force the current subscription domain to be a direct rule $subsDomain = $_SERVER['SERVER_NAME']; $subsDomainRule = "DOMAIN,{$subsDomain},DIRECT"; diff --git a/app/Utils/Client/Protocols/Mozilla.php b/app/Utils/Client/Protocols/Mozilla.php index 973768e..96f348f 100644 --- a/app/Utils/Client/Protocols/Mozilla.php +++ b/app/Utils/Client/Protocols/Mozilla.php @@ -24,33 +24,47 @@ class Mozilla extends Protocol $config = Yaml::parseFile($defaultConfig); $proxy = []; $proxies = []; - $proxiesOther = array(); + $proxiesOther = []; + foreach ($servers as $item) { - if ($item['type'] === 'shadowsocks') { - array_push($proxy, self::buildShadowsocks($user['uuid'], $item)); - array_push($proxies, $item['name']); - } - if ($item['type'] === 'v2ray') { - array_push($proxy, self::buildVmess($user['uuid'], $item)); - array_push($proxies, $item['name']); - } - if ($item['type'] === 'trojan') { - array_push($proxy, self::buildTrojan($user['uuid'], $item)); - array_push($proxies, $item['name']); - } - if(!is_null($item['tags'])){ + $isGroups = false; + if (!empty($item['tags'])) { foreach ($item['tags'] as $tag) { - if(strpos($tag, "node:") === 0){ - $nodearr = explode(":", $tag); - if(array_key_exists($nodearr[1], $proxiesOther)){ - array_push($proxiesOther[$nodearr[1]], $item['name']); - }else{ - $proxiesOther[$nodearr[1]] = [$item['name']]; + if (strpos($tag, 'node:') === 0) { + $group = substr($tag, 5); + if ($group !== '') { + $proxiesOther[$group][] = $item['name']; + if (strpos($item['name'], $group) !== false) { + $isGroups = true; + } } } } } + + switch ($item['type']) { + case 'shadowsocks': + $proxy[] = self::buildShadowsocks($user['uuid'], $item); + break; + + case 'v2ray': + $proxy[] = self::buildVmess($user['uuid'], $item); + break; + + case 'trojan': + $proxy[] = self::buildTrojan($user['uuid'], $item); + break; + + default: + continue 2; + } + + if (!$isGroups) { + $proxies[] = $item['name']; + } } + $proxiesOther0 = $config['proxy-groups'][0]['proxies']; + $config['proxy-groups'][0]['proxies']=array(); $config['proxies'] = array_merge($config['proxies'] ?: [], $proxy); foreach ($config['proxy-groups'] as $k => $v) { if (!is_array($config['proxy-groups'][$k]['proxies'])) { @@ -63,12 +77,14 @@ class Mozilla extends Protocol $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies); } } - + + foreach ($proxiesOther as $k => $v) { $vo = ['name' => $k, 'type' => 'fallback','proxies' => $v,'url' => "http://www.gstatic.com/generate_204",'interval' => 600]; array_push($config['proxy-groups'], $vo); - array_push($config['proxy-groups'][0]['proxies'],$k); + array_push($proxiesOther0,$k); } + $config['proxy-groups'][0]['proxies'] = array_merge($proxiesOther0,$config['proxy-groups'][0]['proxies']); // Force the current subscription domain to be a direct rule $subsDomain = $_SERVER['SERVER_NAME']; $subsDomainRule = "DOMAIN,{$subsDomain},DIRECT";