import { Plugin } from 'yunzai/core' import { makeForwardMsg } from 'yunzai/core' import { readFileSync } 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` keyWord = null 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 = Number(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}`) } const data = await makeForwardMsg( this.e, [log.join('\n')], `最近${log.length}条${type}日志` ) return this.reply(data) } /** * * @param logFile * @returns */ getLog(logFile) { const data = readFileSync(logFile, { encoding: 'utf-8' }) let log = data.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 } }