mirror of
https://github.com/chaos-zhu/easynode.git
synced 2026-10-07 16:37:58 +08:00
✨ 增强脚本输入功能&优化与修复若干项
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
const prompt = 'You are an expert at using shell commands.\nI need you to provide a response in the format \n`[{"command": "your_shell_command_here", "desc": "命令描述(永远使用中文描述命令的用途,不要超过20个字)"}]`\nOnly provide a single executable line of shell code as the value for the "command" and "desc" key.\nNever output any text outside the JSON structure.\nThe command will be directly executed in a shell.\nFor example, if I ask to display the message abc, you should respond with ```json\\n{"command": "echo abc", "desc": "打印 abc 到终端"}\\n```.\nif I ask to Debian sets swap memory to 2GB, you should respond with: ```json\\n[ {"command": "sudo fallocate -l 2G /swapfile", "desc": "创建2GB大小的交换文件"}, {"command": "sudo chmod 600 /swapfile", "desc": "设置交换文件权限为600"}, {"command": "sudo mkswap /swapfile", "desc": "将文件设置为交换分区"}, {"command": "sudo swapon /swapfile", "desc": "启用交换分区"}, {"command": "echo \'/swapfile none swap sw 0 0\' | sudo tee -a /etc/fstab", "desc": "开机自动挂载交换分区"} ]```\nMake sure the output is valid JSON.'
|
||||
|
||||
// const response = await openai.chat.completions.create({
|
||||
// model: "gpt-4o-mini",
|
||||
// messages: [{ role: "user", content: prompt }],
|
||||
// response_format: { type: "json_object" },
|
||||
// });
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -0,0 +1,45 @@
|
||||
const path = require('path')
|
||||
const { ScriptGroupDB } = require('../utils/db-class')
|
||||
const decryptAndExecuteAsync = require('../utils/decrypt-file')
|
||||
const scriptGroupDB = new ScriptGroupDB().getInstance()
|
||||
|
||||
async function getScriptGroupList({ res }) {
|
||||
let data = await scriptGroupDB.findAsync({})
|
||||
data = data.map(item => ({ ...item, id: item._id }))
|
||||
data?.sort((a, b) => Number(b.index || 0) - Number(a.index || 0))
|
||||
res.success({ data })
|
||||
}
|
||||
|
||||
const addScriptGroup = async ({ res, request }) => {
|
||||
let { addScriptGroup } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {}
|
||||
if (addScriptGroup) {
|
||||
await addScriptGroup({ res, request })
|
||||
} else {
|
||||
return res.fail({ data: false, msg: 'Plus专属功能!' })
|
||||
}
|
||||
}
|
||||
|
||||
const updateScriptGroup = async ({ res, request }) => {
|
||||
let { updateScriptGroup } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {}
|
||||
if (updateScriptGroup) {
|
||||
await updateScriptGroup({ res, request })
|
||||
} else {
|
||||
return res.fail({ data: false, msg: 'Plus专属功能!' })
|
||||
}
|
||||
}
|
||||
|
||||
const removeScriptGroup = async ({ res, request }) => {
|
||||
let { removeScriptGroup } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {}
|
||||
if (removeScriptGroup) {
|
||||
await removeScriptGroup({ res, request })
|
||||
} else {
|
||||
return res.fail({ data: false, msg: 'Plus专属功能!' })
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
addScriptGroup,
|
||||
getScriptGroupList,
|
||||
updateScriptGroup,
|
||||
removeScriptGroup
|
||||
}
|
||||
@@ -6,13 +6,13 @@ const localShellJson = require('../config/shell.json')
|
||||
const scriptsDB = new ScriptsDB().getInstance()
|
||||
|
||||
let localShell = JSON.parse(JSON.stringify(localShellJson)).map((item) => {
|
||||
return { ...item, id: randomStr(10), index: '--', description: item.description + '|内置脚本' }
|
||||
return { ...item, id: randomStr(10), index: '--', description: item.description, group: 'builtin' }
|
||||
})
|
||||
|
||||
async function getScriptList({ res }) {
|
||||
let data = await scriptsDB.findAsync({})
|
||||
data = data.map(item => {
|
||||
return { ...item, id: item._id }
|
||||
return { ...item, id: item._id, group: item.group || 'default' }
|
||||
})
|
||||
data?.sort((a, b) => Number(b.index || 0) - Number(a.index || 0))
|
||||
data.push(...localShell)
|
||||
@@ -24,19 +24,19 @@ async function getLocalScriptList({ res }) {
|
||||
}
|
||||
|
||||
const addScript = async ({ res, request }) => {
|
||||
let { body: { name, description, command, index } } = request
|
||||
let { body: { name, description, command, index, group } } = request
|
||||
if (!name || !command) return res.fail({ data: false, msg: '参数错误' })
|
||||
index = Number(index) || 0
|
||||
let record = { name, description, command, index }
|
||||
let record = { name, description, command, index, group }
|
||||
await scriptsDB.insertAsync(record)
|
||||
res.success({ data: '添加成功' })
|
||||
}
|
||||
|
||||
const updateScriptList = async ({ res, request }) => {
|
||||
let { params: { id } } = request
|
||||
let { body: { name, description, command, index } } = request
|
||||
let { body: { name, description, command, index, group } } = request
|
||||
if (!name || !command) return res.fail({ data: false, msg: '参数错误' })
|
||||
await scriptsDB.updateAsync({ _id: id }, { name, description, command, index })
|
||||
await scriptsDB.updateAsync({ _id: id }, { name, description, command, index, group })
|
||||
res.success({ data: '修改成功' })
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user