125 lines
3.5 KiB
JavaScript
125 lines
3.5 KiB
JavaScript
import { exec, execSync } from 'child_process'
|
|
import plugin from '../../lib/plugins/plugin.js'
|
|
import fs from 'node:fs'
|
|
import { Restart } from './restart.js'
|
|
|
|
let insing = false
|
|
const list = {
|
|
'Atlas' :'https://gitee.com/Nwflower/atlas',
|
|
'TRSS-Plugin' :'https://Yunzai.TRSS.me',
|
|
'yenai-plugin' :'https://gitee.com/yeyang52/yenai-plugin',
|
|
'expand-plugin' :'https://gitee.com/SmallK111407/expand-plugin',
|
|
'flower-plugin' :'https://gitee.com/Nwflower/flower-plugin',
|
|
'earth-k-plugin' :'https://gitee.com/SmallK111407/earth-k-plugin',
|
|
'xiaofei-plugin' :'https://gitee.com/xfdown/xiaofei-plugin',
|
|
'xiaoyao-cvs-plugin':'https://gitee.com/Ctrlcvs/xiaoyao-cvs-plugin',
|
|
'Telegram-Plugin' :'https://gitee.com/TimeRainStarSky/Yunzai-Telegram-Plugin',
|
|
'Discord-Plugin' :'https://gitee.com/TimeRainStarSky/Yunzai-Discord-Plugin',
|
|
'QQGuild-Plugin' :'https://gitee.com/TimeRainStarSky/Yunzai-QQGuild-Plugin',
|
|
'ICQQ-Plugin' :'https://gitee.com/TimeRainStarSky/Yunzai-ICQQ-Plugin',
|
|
'KOOK-Plugin' :'https://gitee.com/TimeRainStarSky/Yunzai-KOOK-Plugin',
|
|
}
|
|
|
|
export class install extends plugin {
|
|
constructor () {
|
|
super({
|
|
name: '安装插件',
|
|
dsc: '#安装插件 #安装TRSS-Plugin',
|
|
event: 'message',
|
|
rule: [
|
|
{
|
|
reg: `^#安装(插件|${Object.keys(list).join('|')})$`,
|
|
fnc: 'install',
|
|
permission: 'master'
|
|
}
|
|
]
|
|
})
|
|
}
|
|
|
|
async install () {
|
|
if (insing) {
|
|
await this.reply('已有命令安装中..请勿重复操作')
|
|
return false
|
|
}
|
|
|
|
const name = this.e.msg.replace(/^#安装/, '').trim()
|
|
if (name == '插件') {
|
|
let msg = '\n'
|
|
for (const name in list)
|
|
if (!fs.existsSync(`plugins/${name}`))
|
|
msg += `${name}\n`
|
|
|
|
if (msg == '\n')
|
|
msg = '暂无可安装插件'
|
|
else
|
|
msg = `可安装插件列表:${msg}发送 #安装+插件名 进行安装`
|
|
|
|
await this.reply(msg)
|
|
return true
|
|
}
|
|
|
|
const path = `plugins/${name}`
|
|
if (fs.existsSync(path)) {
|
|
await this.reply(`${name} 插件已安装`)
|
|
return false
|
|
}
|
|
await this.runInstall(name, list[name], path)
|
|
this.restart()
|
|
}
|
|
|
|
async execSync (cmd) {
|
|
return new Promise(resolve => {
|
|
exec(cmd, (error, stdout, stderr) => {
|
|
resolve({ error, stdout, stderr })
|
|
})
|
|
})
|
|
}
|
|
|
|
async runInstall (name, url, path) {
|
|
this.isNowUp = false
|
|
|
|
let cm = `git clone --depth 1 --single-branch '${url}' '${path}'`
|
|
|
|
logger.mark(`${this.e.logFnc} 开始安装:${name} 插件`)
|
|
|
|
await this.reply(`开始安装:${name} 插件`)
|
|
insing = true
|
|
let ret = await this.execSync(cm)
|
|
if (fs.existsSync(`${path}/package.json`))
|
|
await this.execSync('pnpm install')
|
|
insing = false
|
|
|
|
if (ret.error) {
|
|
logger.mark(`${this.e.logFnc} 插件安装失败:${name}`)
|
|
this.gitErr(ret.error, ret.stdout)
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
async gitErr (err, stdout) {
|
|
let msg = '安装失败!'
|
|
let errMsg = err.toString()
|
|
stdout = stdout.toString()
|
|
|
|
if (errMsg.includes('Timed out')) {
|
|
let remote = errMsg.match(/'(.+?)'/g)[0].replace(/'/g, '')
|
|
await this.reply(msg + `\n连接超时:${remote}`)
|
|
return
|
|
}
|
|
|
|
if (/Failed to connect|unable to access/g.test(errMsg)) {
|
|
let remote = errMsg.match(/'(.+?)'/g)[0].replace(/'/g, '')
|
|
await this.reply(msg + `\n连接失败:${remote}`)
|
|
return
|
|
}
|
|
|
|
await this.reply([errMsg, stdout])
|
|
}
|
|
|
|
restart () {
|
|
new Restart(this.e).restart()
|
|
}
|
|
}
|