Skip to content

Commit cfffdbf

Browse files
authored
Merge pull request #215 from wnlen/codex/fix-clashctl-select-interaction-logic
fix(select): restrict clashctl select to manually selectable strategy groups
2 parents 751fe8a + 33d4e79 commit cfffdbf

2 files changed

Lines changed: 49 additions & 5 deletions

File tree

scripts/core/clashctl.sh

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6260,12 +6260,13 @@ proxy_pick_index() {
62606260

62616261
proxy_pick_group_interactive() {
62626262
local idx count group current
6263-
local -a groups ordered_groups
6263+
local -a groups=()
6264+
local -a ordered_groups=()
62646265

62656266
while IFS= read -r group; do
62666267
[ -n "${group:-}" ] || continue
62676268
groups+=("$group")
6268-
done < <(proxy_group_list)
6269+
done < <(proxy_group_manual_list)
62696270

62706271
for group in "节点选择" "自动选择"; do
62716272
if printf '%s\n' "${groups[@]}" | grep -Fxq "$group"; then
@@ -6409,7 +6410,7 @@ cmd_sub() {
64096410
proxy_select_interactive() {
64106411
local group="${1:-}"
64116412
local current idx count total_count node selected_node
6412-
local -a nodes
6413+
local -a nodes=()
64136414

64146415
prepare
64156416

@@ -6424,6 +6425,8 @@ proxy_select_interactive() {
64246425
if [ -z "${group:-}" ]; then
64256426
ui_title "🚀 节点切换"
64266427
group="$(proxy_pick_group_interactive)" || return 0
6428+
elif ! proxy_group_supports_manual_pick "$group"; then
6429+
die "该策略组不支持手动挑节点:$group"
64276430
fi
64286431

64296432
current="$(proxy_group_current "$group" 2>/dev/null || true)"

scripts/core/proxy.sh

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,21 @@ proxy_group_is_selector() {
293293
esac
294294
}
295295

296+
proxy_group_is_manual_selector() {
297+
local type
298+
299+
type="$(proxy_group_type "$1")"
300+
301+
case "$type" in
302+
Selector)
303+
return 0
304+
;;
305+
*)
306+
return 1
307+
;;
308+
esac
309+
}
310+
296311
proxy_group_list() {
297312
proxy_groups_json \
298313
| "$(yq_bin)" -p=json eval '
@@ -360,6 +375,32 @@ proxy_group_selectable_nodes() {
360375
done < <(proxy_group_nodes "$group")
361376
}
362377

378+
proxy_group_supports_manual_pick() {
379+
local group="$1"
380+
local node
381+
382+
[ -n "${group:-}" ] || return 1
383+
proxy_group_exists "$group" || return 1
384+
proxy_group_is_manual_selector "$group" || return 1
385+
386+
while IFS= read -r node; do
387+
[ -n "${node:-}" ] || continue
388+
return 0
389+
done < <(proxy_group_selectable_nodes "$group")
390+
391+
return 1
392+
}
393+
394+
proxy_group_manual_list() {
395+
local group
396+
397+
while IFS= read -r group; do
398+
[ -n "${group:-}" ] || continue
399+
proxy_group_supports_manual_pick "$group" || continue
400+
echo "$group"
401+
done < <(proxy_group_list)
402+
}
403+
363404
proxy_group_select() {
364405
local group="$1"
365406
local node="$2"
@@ -371,7 +412,7 @@ proxy_group_select() {
371412
[ -n "${node:-}" ] || die "节点名称不能为空"
372413

373414
proxy_group_exists "$group" || die "策略组不存在:$group"
374-
proxy_group_is_selector "$group" || die "该策略组不支持手动切换:$group"
415+
proxy_group_supports_manual_pick "$group" || die "该策略组不支持手动切换:$group"
375416

376417
found=false
377418
while IFS= read -r available_node; do
@@ -510,7 +551,7 @@ ensure_default_proxy_group_relay_selected() {
510551
else
511552
switched="${group}|${current}|${relay}"
512553
fi
513-
done < <(proxy_group_list)
554+
done < <(proxy_group_manual_list)
514555

515556
[ -n "${switched:-}" ] && echo "$switched"
516557
}

0 commit comments

Comments
 (0)