From 1e5eb1647d729e35547a10d47d6ab28ea11a3325 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sat, 16 May 2026 14:13:35 +0800 Subject: [PATCH] fix: remove blank-enter dependency from simadmin menu --- plugins/simadmin/README.md | 28 +++++++++++++++++--------- plugins/simadmin/simadmin_multi.py | 32 ++++++++++++++++++++---------- py/simadmin_multi.py | 32 ++++++++++++++++++++---------- 3 files changed, 63 insertions(+), 29 deletions(-) diff --git a/plugins/simadmin/README.md b/plugins/simadmin/README.md index 509cfe9..2dc6619 100644 --- a/plugins/simadmin/README.md +++ b/plugins/simadmin/README.md @@ -136,7 +136,11 @@ q. 退出配置管理 ### 添加实例流程 -可从主菜单选择 `2. 添加实例`,也可在列表页输入 `a`: +可从主菜单选择 `2. 添加实例`,也可在列表页输入 `a`。 + +交互优化说明:很多聊天端/Autman `sender.listen()` 不能捕获“空回车”,所以插件不再要求直接回车。需要默认值时输入 `d` / `default` / `默认` / `跳过`;需要留空或清空 token 时输入 `clear` / `清空`。 + +示例: ```text sim配置 @@ -146,19 +150,25 @@ a 主卡 请输入 SimAdmin 地址,例如:http://192.168.68.1:3000 http://192.168.68.1:3000 -请输入超时时间秒数,直接回车默认 10 -10 -请输入 token,可直接回车留空 - -是否启用?输入 1/是 启用,0/否 禁用;直接回车默认启用 -1 -确认添加? +请输入超时时间秒数 +输入 d/default/默认 使用默认值:10 +d +请输入 token +输入 d/default/默认 使用默认值:留空 +输入 clear/清空 表示留空 +clear +是否启用?输入 1/是 启用,0/否 禁用 +输入 d/default/默认 使用默认值:启用 +d +确认添加?输入 yes/y/确认,输入 n/no/取消 放弃 yes ``` ### 编辑实例流程 -可从主菜单选择 `3. 编辑实例`,也可在列表页输入 `e 1`,或输入实例编号后选择 `2. 编辑实例`。编辑二级菜单: +可从主菜单选择 `3. 编辑实例`,也可在列表页输入 `e 1`,或输入实例编号后选择 `2. 编辑实例`。编辑 token 时:输入 `d` 保持当前 token,输入 `clear` 清空 token。 + +编辑二级菜单: ```text 编辑【主卡】 diff --git a/plugins/simadmin/simadmin_multi.py b/plugins/simadmin/simadmin_multi.py index db3c353..3fb50a4 100644 --- a/plugins/simadmin/simadmin_multi.py +++ b/plugins/simadmin/simadmin_multi.py @@ -11,7 +11,7 @@ #[priority: 999] #[platform: qq,qb,wx,wb,tg,tb,fs,we,web,wxmp] #[open_source: true] -#[version: 1.2.3] +#[version: 1.2.4] #[public: false] #[price: 0] #[description: 管理员专用:兼容多个 SimAdmin 实例,支持多级菜单配置管理、状态查询和短信发送。配置桶 otto/simadmin_instances。] @@ -65,9 +65,6 @@ def listen_text(sender, prompt, allow_empty=False, default=None): # Autman listen 超时/无效输入在不少实机环境返回字符串 error,而不是 None。 if value.lower() == "error": raise SimAdminError("等待输入超时或监听失败,已退出") - # allow_empty=True 的场景允许直接回车/空消息走默认值。 - if value == "" and default is not None: - return default if value == "" and not allow_empty: raise SimAdminError("输入不能为空,已退出") if value.lower() in ("q", "quit", "exit", "退出", "取消"): @@ -75,8 +72,23 @@ def listen_text(sender, prompt, allow_empty=False, default=None): return value -def confirm(sender, prompt="确认执行?输入 yes 确认,其他取消"): - value = listen_text(sender, prompt, allow_empty=True) +def listen_with_default(sender, prompt, default_value, default_label=None, allow_clear=False): + """Autman/聊天端不能发送空回车,用显式指令代替默认/跳过/清空。""" + label = default_label if default_label is not None else str(default_value) + tips = [prompt, "输入 d/default/默认 使用默认值:%s" % label] + if allow_clear: + tips.append("输入 clear/清空 表示留空") + value = listen_text(sender, "\n".join(tips), allow_empty=False) + lower = value.lower() + if lower in ("d", "default", "默认", "跳过", "skip", "s"): + return default_value + if allow_clear and lower in ("clear", "清空", "空", "none", "null", "无"): + return "" + return value + + +def confirm(sender, prompt="确认执行?输入 yes/y/确认,输入 n/no/取消 放弃"): + value = listen_text(sender, prompt, allow_empty=False) return value.lower() in ("yes", "y", "确认", "是") @@ -438,9 +450,9 @@ def menu_add(sender): if any(x["name"] == name for x in instances): raise SimAdminError("实例名称已存在: " + name) base_url = listen_text(sender, "请输入 SimAdmin 地址,例如:http://192.168.68.1:3000") - timeout = listen_text(sender, "请输入超时时间秒数,直接回车默认 10", allow_empty=True, default=str(DEFAULT_TIMEOUT)) - token = listen_text(sender, "请输入 token,可直接回车留空", allow_empty=True, default="") - enabled_text = listen_text(sender, "是否启用?输入 1/是 启用,0/否 禁用;直接回车默认启用", allow_empty=True, default="1") + timeout = listen_with_default(sender, "请输入超时时间秒数", str(DEFAULT_TIMEOUT), str(DEFAULT_TIMEOUT)) + token = listen_with_default(sender, "请输入 token", "", "留空", allow_clear=True) + enabled_text = listen_with_default(sender, "是否启用?输入 1/是 启用,0/否 禁用", "1", "启用") item = normalize_instance({ "name": name, "base_url": base_url, @@ -498,7 +510,7 @@ def menu_edit(sender, idx=None): elif choice == "3": item["timeout"] = normalize_instance({**item, "timeout": listen_text(sender, "请输入 timeout 秒数 3-60")})["timeout"] elif choice == "4": - item["token"] = listen_text(sender, "请输入新 token;直接回车清空", allow_empty=True, default="") + item["token"] = listen_with_default(sender, "请输入新 token", item.get("token", ""), "保持当前(%s)" % (mask_secret(item.get("token")) or "未设置"), allow_clear=True) elif choice == "5": item["enabled"] = not item.get("enabled") reply(sender, "已切换为:" + ("启用" if item["enabled"] else "禁用")) diff --git a/py/simadmin_multi.py b/py/simadmin_multi.py index db3c353..3fb50a4 100644 --- a/py/simadmin_multi.py +++ b/py/simadmin_multi.py @@ -11,7 +11,7 @@ #[priority: 999] #[platform: qq,qb,wx,wb,tg,tb,fs,we,web,wxmp] #[open_source: true] -#[version: 1.2.3] +#[version: 1.2.4] #[public: false] #[price: 0] #[description: 管理员专用:兼容多个 SimAdmin 实例,支持多级菜单配置管理、状态查询和短信发送。配置桶 otto/simadmin_instances。] @@ -65,9 +65,6 @@ def listen_text(sender, prompt, allow_empty=False, default=None): # Autman listen 超时/无效输入在不少实机环境返回字符串 error,而不是 None。 if value.lower() == "error": raise SimAdminError("等待输入超时或监听失败,已退出") - # allow_empty=True 的场景允许直接回车/空消息走默认值。 - if value == "" and default is not None: - return default if value == "" and not allow_empty: raise SimAdminError("输入不能为空,已退出") if value.lower() in ("q", "quit", "exit", "退出", "取消"): @@ -75,8 +72,23 @@ def listen_text(sender, prompt, allow_empty=False, default=None): return value -def confirm(sender, prompt="确认执行?输入 yes 确认,其他取消"): - value = listen_text(sender, prompt, allow_empty=True) +def listen_with_default(sender, prompt, default_value, default_label=None, allow_clear=False): + """Autman/聊天端不能发送空回车,用显式指令代替默认/跳过/清空。""" + label = default_label if default_label is not None else str(default_value) + tips = [prompt, "输入 d/default/默认 使用默认值:%s" % label] + if allow_clear: + tips.append("输入 clear/清空 表示留空") + value = listen_text(sender, "\n".join(tips), allow_empty=False) + lower = value.lower() + if lower in ("d", "default", "默认", "跳过", "skip", "s"): + return default_value + if allow_clear and lower in ("clear", "清空", "空", "none", "null", "无"): + return "" + return value + + +def confirm(sender, prompt="确认执行?输入 yes/y/确认,输入 n/no/取消 放弃"): + value = listen_text(sender, prompt, allow_empty=False) return value.lower() in ("yes", "y", "确认", "是") @@ -438,9 +450,9 @@ def menu_add(sender): if any(x["name"] == name for x in instances): raise SimAdminError("实例名称已存在: " + name) base_url = listen_text(sender, "请输入 SimAdmin 地址,例如:http://192.168.68.1:3000") - timeout = listen_text(sender, "请输入超时时间秒数,直接回车默认 10", allow_empty=True, default=str(DEFAULT_TIMEOUT)) - token = listen_text(sender, "请输入 token,可直接回车留空", allow_empty=True, default="") - enabled_text = listen_text(sender, "是否启用?输入 1/是 启用,0/否 禁用;直接回车默认启用", allow_empty=True, default="1") + timeout = listen_with_default(sender, "请输入超时时间秒数", str(DEFAULT_TIMEOUT), str(DEFAULT_TIMEOUT)) + token = listen_with_default(sender, "请输入 token", "", "留空", allow_clear=True) + enabled_text = listen_with_default(sender, "是否启用?输入 1/是 启用,0/否 禁用", "1", "启用") item = normalize_instance({ "name": name, "base_url": base_url, @@ -498,7 +510,7 @@ def menu_edit(sender, idx=None): elif choice == "3": item["timeout"] = normalize_instance({**item, "timeout": listen_text(sender, "请输入 timeout 秒数 3-60")})["timeout"] elif choice == "4": - item["token"] = listen_text(sender, "请输入新 token;直接回车清空", allow_empty=True, default="") + item["token"] = listen_with_default(sender, "请输入新 token", item.get("token", ""), "保持当前(%s)" % (mask_secret(item.get("token")) or "未设置"), allow_clear=True) elif choice == "5": item["enabled"] = not item.get("enabled") reply(sender, "已切换为:" + ("启用" if item["enabled"] else "禁用"))