From 982ec97361776418596ca6c4b6f4dada5dda6553 Mon Sep 17 00:00:00 2001 From: He-Peter-Huang Date: Thu, 29 Aug 2024 23:53:53 +0800 Subject: [PATCH] Insert Matched Proxies While Preserving Array Order The matched proxies are now inserted in place of the search parameters, while maintaining the original order of the entire array. This ensures that the structure of the proxy list remains consistent and predictable. --- .../Controllers/Client/Protocols/Clash.php | 24 +++++++++-------- .../Client/Protocols/ClashMeta.php | 24 +++++++++-------- .../Controllers/Client/Protocols/Stash.php | 26 ++++++++++--------- 3 files changed, 40 insertions(+), 34 deletions(-) mode change 100644 => 100755 app/Http/Controllers/Client/Protocols/Clash.php mode change 100644 => 100755 app/Http/Controllers/Client/Protocols/ClashMeta.php mode change 100644 => 100755 app/Http/Controllers/Client/Protocols/Stash.php diff --git a/app/Http/Controllers/Client/Protocols/Clash.php b/app/Http/Controllers/Client/Protocols/Clash.php old mode 100644 new mode 100755 index 32fd4ca2..2c4b3e0d --- a/app/Http/Controllers/Client/Protocols/Clash.php +++ b/app/Http/Controllers/Client/Protocols/Clash.php @@ -62,20 +62,22 @@ class Clash $config['proxies'] = array_merge($config['proxies'] ? $config['proxies'] : [], $proxy); foreach ($config['proxy-groups'] as $k => $v) { if (!is_array($config['proxy-groups'][$k]['proxies'])) $config['proxy-groups'][$k]['proxies'] = []; - $isFilter = false; - foreach ($config['proxy-groups'][$k]['proxies'] as $src) { - foreach ($proxies as $dst) { - if (!$this->isRegex($src)) continue; - $isFilter = true; - $config['proxy-groups'][$k]['proxies'] = array_values(array_diff($config['proxy-groups'][$k]['proxies'], [$src])); - if ($this->isMatch($src, $dst)) { - array_push($config['proxy-groups'][$k]['proxies'], $dst); + $updatedProxies = []; + foreach ($config['proxy-groups'][$k]['proxies'] as $index => $src) { + if ($this->isRegex($src)) { + foreach ($proxies as $dst) { + if ($this->isMatch($src, $dst)) { + $updatedProxies[] = $dst; + } } + } else { + $updatedProxies[] = $src; } - if ($isFilter) continue; } - if ($isFilter) continue; - $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies); + if (empty($updatedProxies) && !empty($config['proxy-groups'][$k]['proxies'])) { + $updatedProxies = array_merge($updatedProxies, $proxies); + } + $config['proxy-groups'][$k]['proxies'] = $updatedProxies; } $config['proxy-groups'] = array_filter($config['proxy-groups'], function($group) { diff --git a/app/Http/Controllers/Client/Protocols/ClashMeta.php b/app/Http/Controllers/Client/Protocols/ClashMeta.php old mode 100644 new mode 100755 index 65989de6..a677ed5d --- a/app/Http/Controllers/Client/Protocols/ClashMeta.php +++ b/app/Http/Controllers/Client/Protocols/ClashMeta.php @@ -53,20 +53,22 @@ class ClashMeta $config['proxies'] = array_merge($config['proxies'] ? $config['proxies'] : [], $proxy); foreach ($config['proxy-groups'] as $k => $v) { if (!is_array($config['proxy-groups'][$k]['proxies'])) $config['proxy-groups'][$k]['proxies'] = []; - $isFilter = false; - foreach ($config['proxy-groups'][$k]['proxies'] as $src) { - foreach ($proxies as $dst) { - if (!$this->isRegex($src)) continue; - $isFilter = true; - $config['proxy-groups'][$k]['proxies'] = array_values(array_diff($config['proxy-groups'][$k]['proxies'], [$src])); - if ($this->isMatch($src, $dst)) { - array_push($config['proxy-groups'][$k]['proxies'], $dst); + $updatedProxies = []; + foreach ($config['proxy-groups'][$k]['proxies'] as $index => $src) { + if ($this->isRegex($src)) { + foreach ($proxies as $dst) { + if ($this->isMatch($src, $dst)) { + $updatedProxies[] = $dst; + } } + } else { + $updatedProxies[] = $src; } - if ($isFilter) continue; } - if ($isFilter) continue; - $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies); + if (empty($updatedProxies) && !empty($config['proxy-groups'][$k]['proxies'])) { + $updatedProxies = array_merge($updatedProxies, $proxies); + } + $config['proxy-groups'][$k]['proxies'] = $updatedProxies; } $config['proxy-groups'] = array_filter($config['proxy-groups'], function($group) { return $group['proxies']; diff --git a/app/Http/Controllers/Client/Protocols/Stash.php b/app/Http/Controllers/Client/Protocols/Stash.php old mode 100644 new mode 100755 index b7073215..c6beea58 --- a/app/Http/Controllers/Client/Protocols/Stash.php +++ b/app/Http/Controllers/Client/Protocols/Stash.php @@ -59,21 +59,23 @@ class Stash $config['proxies'] = array_merge($config['proxies'] ? $config['proxies'] : [], $proxy); foreach ($config['proxy-groups'] as $k => $v) { - if (!is_array($config['proxy-groups'][$k]['proxies'])) continue; - $isFilter = false; - foreach ($config['proxy-groups'][$k]['proxies'] as $src) { - foreach ($proxies as $dst) { - if (!$this->isRegex($src)) continue; - $isFilter = true; - $config['proxy-groups'][$k]['proxies'] = array_values(array_diff($config['proxy-groups'][$k]['proxies'], [$src])); - if ($this->isMatch($src, $dst)) { - array_push($config['proxy-groups'][$k]['proxies'], $dst); + if (!is_array($config['proxy-groups'][$k]['proxies'])) $config['proxy-groups'][$k]['proxies'] = []; + $updatedProxies = []; + foreach ($config['proxy-groups'][$k]['proxies'] as $index => $src) { + if ($this->isRegex($src)) { + foreach ($proxies as $dst) { + if ($this->isMatch($src, $dst)) { + $updatedProxies[] = $dst; + } } + } else { + $updatedProxies[] = $src; } - if ($isFilter) continue; } - if ($isFilter) continue; - $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies); + if (empty($updatedProxies) && !empty($config['proxy-groups'][$k]['proxies'])) { + $updatedProxies = array_merge($updatedProxies, $proxies); + } + $config['proxy-groups'][$k]['proxies'] = $updatedProxies; } $config['proxy-groups'] = array_filter($config['proxy-groups'], function($group) { return $group['proxies'];