rc-plugin/apps/update.js
2022-12-29 13:07:37 +08:00

143 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 主库
import Version from '../model/version.js'
import config from '../model/index.js'
import puppeteer from '../../../lib/puppeteer/puppeteer.js'
import { exec, execSync } from 'node:child_process'
const _path = process.cwd();
/**
* 处理插件更新
*/
export class update extends plugin {
constructor () {
super({
name: '更新插件',
dsc: '更新插件代码',
event: 'message',
priority: 4000,
rule: [
{
reg: '^#*R(插件)?版本$',
fnc: 'version'
},
{
/** 命令正则匹配 */
reg: '^#(R更新|R强制更新)$',
/** 执行方法 */
fnc: 'rconsoleUpdate'
},
]
})
this.versionData = config.getConfig('version')
}
/**
* rule - 插件版本信息
*/
async version () {
const data = await new Version(this.e).getData(
this.versionData.slice(0, 3)
)
let img = await puppeteer.screenshot('version', data)
this.e.reply(img)
}
/**
*
* @param e oicq传递的事件参数e
*/
async rconsoleUpdate(e) {
if (!this.e.isMaster) {
await this.e.reply("您无权操作");
return true;
}
let isForce = !!this.e.msg.includes("强制");
let command = "git pull";
if (isForce) {
command = "git checkout . && git pull";
await this.e.reply("正在执行强制更新操作,请稍等");
} else {
await this.e.reply("正在执行更新操作,请稍等");
}
const th = this
exec(command, { cwd: `${ _path }/plugins/rconsole-plugin/` }, async function (error, stdout, stderr) {
if (error) {
let isChanges = error.toString().includes("Your local changes to the following files would be overwritten by merge");
let isNetwork = error.toString().includes("fatal: unable to access");
if (isChanges) {
//git stash && git pull && git stash pop stash@{0}
//需要设置email和username暂不做处理
await me.e.reply(
"失败!\nError code: " +
error.code +
"\n" +
error.stack +
"\n\n本地代码与远程代码存在冲突,上面报错信息中包含冲突文件名称及路径,请尝试处理冲突\n如果不想保存本地修改请使用【#强制更新】\n(注意强制更新命令会忽略所有本地对R插件本身文件的修改本地修改均不会保存请注意备份)"
);
} else if (isNetwork) {
await e.reply(
"失败!\nError code: " + error.code + "\n" + error.stack + "\n\n可能是网络问题请关闭加速器之类的网络工具或请过一会尝试。"
);
} else {
await e.reply("失败!\nError code: " + error.code + "\n" + error.stack + "\n\n出错了。请尝试处理错误");
}
} else {
if (/Already up to date/.test(stdout)) {
e.reply("目前已经是最新了~");
return true;
}
await th.restartApp();
}
});
}
async restartApp() {
if (!this.e.isMaster) {
await this.e.reply("您无权操作");
return true;
}
await this.e.reply("开始执行重启,请稍等...");
Bot.logger.mark("开始执行重启,请稍等...");
let data = JSON.stringify({
isGroup: !!this.e.isGroup,
id: this.e.isGroup ? this.e.group_id : this.e.user_id,
});
try {
await redis.set("Yunzai:rconsole:restart", data, { EX: 120 });
let cm = `npm run start`;
if (process.argv[1].includes("pm2")) {
cm = `npm run restart`;
}
exec(cm, async (error, stdout, stderr) => {
if (error) {
await redis.del(`Yunzai:rconsole:restart`);
await this.e.reply(`操作失败!\n${error.stack}`);
Bot.logger.error(`重启失败\n${error.stack}`);
} else if (stdout) {
Bot.logger.mark("重启成功运行已转为后台查看日志请用命令npm run log");
Bot.logger.mark("停止后台运行命令npm stop");
process.exit();
}
});
} catch (error) {
redis.del(`Yunzai:rconsole:restart`);
await this.e.reply(`操作失败!\n${error.stack}`);
}
return true;
}
}