Node.js Discord SSH服务器管理机器人代码精简优化问题
实现方案
三数组匹配方案(符合你的需求)
核心逻辑为通过用户输入的命令匹配命令数组的索引,再通过同一索引直接获取对应SSH指令和回复内容,无需多分支判断。
步骤1:定义三个一一对应的数组
三个数组相同位置的元素严格对应,第N个命令对应第N个SSH指令和第N个回复模板:
// 按索引顺序一一对应 const massage = ['重启MC服务', '查看服务器负载', '清理磁盘缓存', /* 剩余12条命令依次补充 */]; const sshcoms = ['systemctl restart mc.service', 'uptime && free -h', 'sync && echo 3 > /proc/sys/vm/drop_caches', /* 对应命令的SSH执行指令依次补充 */]; const rply = ['已发起MC服务重启请求,10秒左右即可完成', '当前服务器运行状态如下:\n${result}', '磁盘缓存清理完成', /* 对应回复模板依次补充,支持插入执行结果变量 */];
步骤2:单次匹配逻辑替换原有多if分支
假设用户输入的命令存放在userInput变量中,原有15条if判断直接替换为以下逻辑:
// 匹配命令对应的索引 const cmdIndex = massage.findIndex(cmd => cmd === userInput.trim()); // 无匹配命令的兜底处理 if (cmdIndex === -1) { message.reply('无效指令,请输入正确的操作命令'); return; } // 直接获取对应SSH指令和回复模板 const execSshCmd = sshcoms[cmdIndex]; const replyTemplate = rply[cmdIndex]; // 后续执行SSH逻辑示例(以ssh2库为例) ssh.exec(execSshCmd, (err, stream) => { if (err) throw err; let execResult = ''; stream.on('data', data => execResult += data.toString()) .on('close', () => { // 替换回复模板中的执行结果变量 const finalReply = replyTemplate.replace('${result}', execResult); message.reply(finalReply); }); });
注意事项
- 新增/删除/调整命令时,三个数组必须同步操作相同索引的内容,避免出现错配
- 如需支持模糊匹配,可将
findIndex内的全等判断改为cmd.includes(userInput.trim())或正则匹配 - 变量名
massage大概率是message的拼写笔误,可根据实际需求调整
优化方案(推荐,避免数组错配问题)
三数组配置容易出现顺序错配的维护问题,推荐用单对象数组存储所有命令配置,每个命令的触发词、SSH指令、回复内容绑定存储,不会出现匹配错误:
// 所有命令配置统一存储,新增命令直接追加对象即可 const cmdConfigs = [ { trigger: '重启MC服务', sshCmd: 'systemctl restart mc.service', reply: '已发起MC服务重启请求,10秒左右即可完成' }, { trigger: '查看服务器负载', sshCmd: 'uptime && free -h', reply: '当前服务器运行状态如下:\n${result}' } // 剩余13条命令依次追加对象即可 ]; // 匹配逻辑 const targetCmd = cmdConfigs.find(item => item.trigger === userInput.trim()); if (!targetCmd) { message.reply('无效指令,请输入正确的操作命令'); return; } // 直接取出对应配置执行即可 const { sshCmd, reply } = targetCmd; // 后续SSH执行逻辑和上述方案一致
内容的提问来源于stack exchange,提问作者no_sleep
相关产品推荐
相关产品推荐

