import plugin from '../../lib/plugins/plugin.js' import fs from 'node:fs' import lodash from 'lodash' import moment from 'moment' export class sendLog extends plugin { constructor () { super({ name: '发送日志', dsc: '发送最近100条运行日志', event: 'message', rule: [ { reg: '^#(运行|错误)*日志[0-9]*(.*)', fnc: 'sendLog', permission: 'master' } ] }) this.lineNum = 50 this.maxNum = 800 this.logFile = `./logs/command.${moment().format('YYYY-MM-DD')}.log` this.errFile = './logs/error.log' } 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 let log = this.getLog(logFile) if (lodash.isEmpty(log)) { this.reply(`暂无相关日志:${type}`) return } let forwardMsg = await this.makeForwardMsg(`最近${log.length}条${type}日志`, log) await this.reply(forwardMsg) } getLog (logFile) { let log = fs.readFileSync(logFile, { encoding: 'utf-8' }) log = log.split('\n') if (this.keyWord) { for (let 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() let tmp = [] log.forEach(v => { if (!v) return if (this.keyWord && tmp.length >= this.maxNum) return /* eslint-disable no-control-regex */ v = v.replace(/\x1b[[0-9;]*m/g, '') v = v.replace(/\r|\n/, '') + '\n\n' tmp.push(v) }) return tmp } async makeForwardMsg (title, msg) { let nickname = this.e.bot.nickname if (this.e.isGroup) { let info = await this.e.bot.getGroupMemberInfo(this.e.group_id, this.e.bot.uin) nickname = info.card ?? info.nickname } let userInfo = { user_id: this.e.bot.uin, nickname } let forwardMsg = [ { ...userInfo, message: title }, { ...userInfo, message: msg } ] /** 制作转发内容 */ if (this.e.isGroup) { forwardMsg = await this.e.group.makeForwardMsg(forwardMsg) } else { forwardMsg = await this.e.friend.makeForwardMsg(forwardMsg) } /** 处理描述 */ forwardMsg.data = forwardMsg.data .replace(/\n/g, '') .replace(/(.+?)<\/title>/g, '___') .replace(/___+/, `<title color="#777777" size="26">${title}`) return forwardMsg } }