fix: 打通登录门禁死锁,失败信息区分未连接/登录被拒/未通过验证

继续修复部署时暴露的门禁设计问题:

- 登录门禁死锁:/login、/register、简幻通的 /auth 本身就是登录流程的一部分,
  原先门禁把它们一并拦下,形成「要先登录才能发登录指令」,账号永远卡在未验证状态。
  新增 server.preLoginCommands 白名单(默认 login,l,register,reg,auth),
  这些前缀在未验证时也放行,其余指令仍要求已完成验证。

- 离线时指令被静默丢弃却回报「已发送」:bot.chat() 在未连接时无处可发。
  canSendCommand() 现在要求已连接并进入世界,失败信息区分
  「未连接」「登录被服务器拒绝」「未通过登录验证」三种情况并给出对应建议。

- 前端配置表单支持 list 类型字段(逗号分隔的字符串数组)。

测试从 252 增至 263,全部通过。
这个提交包含在:
lyizai
2026-09-27 22:11:52 +08:00
父节点 d6b1339867
当前提交 2671da95d5
共修改 10 个文件,包含 279 行新增和 18 行删除
+11 -2
查看文件
@@ -812,8 +812,17 @@ class SingleBotPool {
/** @param {string} id @param {string} command */
sendCommand(id, command) {
const entry = this.require(id);
const ok = entry.manager.sendCommand(String(command).replace(/^\//, ''));
return { ok, message: ok ? '已发送:' + command : '发送失败(未完成登录验证)' };
const text = String(command || '').replace(/^\//, '').trim();
if (!text) return { ok: false, message: '指令为空' };
if (!entry.manager.canSendCommand(text)) {
const manager = entry.manager;
if (manager.state !== 'online' || !manager.bot) {
return { ok: false, message: `当前未连接(状态:${manager.state}),指令未发送` };
}
return { ok: false, message: `未完成登录验证,已拒绝发送 /${text}` };
}
const ok = entry.manager.sendCommand(text);
return { ok, message: ok ? '已发送:' + command : '发送失败' };
}
/** @param {string} id @param {string} message */