import { Plugin } from 'yunzai/core' import {makeForwardMsg} from 'yunzai/core' import fs from "node:fs" import lodash from "lodash" import moment from "moment" /** * tudo */ /** * */ export class sendLog extends Plugin { lineNum = 100 maxNum = 1000 errFile = "logs/error.log" logFile = `logs/command.${moment().format("YYYY-MM-DD")}.log` constructor() { /** name: "发送日志", dsc: "发送最近100条运行日志", */ super() this.rule = [ { reg: /^#(运行|错误)*日志[0-9]*(.*)/, fnc: this.sendLog.name, permission: "master" } ] } /** * * @returns */ async sendLog() { let lineNum = this.e.msg.match(/\d+/g) if (lineNum) { this.lineNum = lineNum[0] } else { this.keyWord = this.e.msg.replace(/#|运行|错误|日志|\d/g, "") } let logFile = this.logFile let type = "运行" if (this.e.msg.includes("错误")) { logFile = this.errFile type = "错误" } if (this.keyWord) type = this.keyWord const log = this.getLog(logFile) if (lodash.isEmpty(log)) return this.reply(`暂无相关日志:${type}`) return this.reply(await makeForwardMsg(this.e, [log.join("\n")], `最近${log.length}条${type}日志`)) } /** * * @param logFile * @returns */ getLog(logFile) { let log = fs.readFileSync(logFile, { encoding: "utf-8" }) log = log.split("\n") if (this.keyWord) { for (const i in log) if (!log[i].includes(this.keyWord)) delete log[i] } else { log = lodash.slice(log, (Number(this.lineNum) + 1) * -1) } log = log.reverse() const tmp = [] for (let i of log) { if (!i) continue if (this.keyWord && tmp.length >= this.maxNum) return /* eslint-disable no-control-regex */ i = i.replace(/\x1b[[0-9;]*m/g, "") i = i.replace(/\r|\n/, "") tmp.push(i) } return tmp } }