fix: 打通登录门禁死锁,失败信息区分未连接/登录被拒/未通过验证
继续修复部署时暴露的门禁设计问题: - 登录门禁死锁:/login、/register、简幻通的 /auth 本身就是登录流程的一部分, 原先门禁把它们一并拦下,形成「要先登录才能发登录指令」,账号永远卡在未验证状态。 新增 server.preLoginCommands 白名单(默认 login,l,register,reg,auth), 这些前缀在未验证时也放行,其余指令仍要求已完成验证。 - 离线时指令被静默丢弃却回报「已发送」:bot.chat() 在未连接时无处可发。 canSendCommand() 现在要求已连接并进入世界,失败信息区分 「未连接」「登录被服务器拒绝」「未通过登录验证」三种情况并给出对应建议。 - 前端配置表单支持 list 类型字段(逗号分隔的字符串数组)。 测试从 252 增至 263,全部通过。
这个提交包含在:
@@ -207,6 +207,15 @@ function defaultConfig() {
|
||||
* 若该服务器提供固定验证码,把 `auth {password}` 之类填进来就能自动过。
|
||||
*/
|
||||
authCommand: '',
|
||||
/**
|
||||
* 允许在「登录验证通过之前」发送的指令前缀。
|
||||
*
|
||||
* 存在先有鸡还是先有蛋的问题:有些服务器的登录流程本身就是一条指令
|
||||
* (`/login`、`/register`,简幻通体系还要先 `/auth`),
|
||||
* 若把登录门禁一刀切,这些指令就永远发不出去,账号会卡在未验证状态被反复踢出。
|
||||
* 因此这里列出的前缀可以绕过门禁,其余指令仍要求已完成验证。
|
||||
*/
|
||||
preLoginCommands: ['login', 'l', 'register', 'reg', 'auth'],
|
||||
/**
|
||||
* 登录结果确认超时(毫秒)。
|
||||
* 部分离线服登录成功后不回明确提示,超时后按「已登录」放行,
|
||||
@@ -329,6 +338,13 @@ function validateConfig(config) {
|
||||
config.server.reconnectMaxDelayMs = clampInt(config.server.reconnectMaxDelayMs, config.server.reconnectDelayMs, 3600000, 120000);
|
||||
config.server.loginConfirmTimeoutMs = clampInt(config.server.loginConfirmTimeoutMs, 0, 300000, 10000);
|
||||
if (typeof config.server.authCommand !== 'string') config.server.authCommand = '';
|
||||
if (!Array.isArray(config.server.preLoginCommands)) {
|
||||
config.server.preLoginCommands = defaultConfig().server.preLoginCommands;
|
||||
} else {
|
||||
config.server.preLoginCommands = config.server.preLoginCommands
|
||||
.filter((item) => typeof item === 'string' && item.trim())
|
||||
.map((item) => item.trim().toLowerCase().replace(/^\//, ''));
|
||||
}
|
||||
|
||||
if (config.waterMode !== WATER_MODE.SWIM && config.waterMode !== WATER_MODE.BOAT) {
|
||||
config.waterMode = WATER_MODE.AVOID;
|
||||
|
||||
在新工单中引用
屏蔽一个用户