From 4402fc2d0a9e3d9bab0949495e033c9f5a828f9e Mon Sep 17 00:00:00 2001 From: linyuchen Date: Sat, 27 Apr 2024 00:50:08 +0800 Subject: [PATCH] refactor: core --- src/common/utils/helper.ts | 17 ++++ src/common/utils/log.ts | 85 ++++++++++++++++++- src/index.ts | 30 ++++--- src/onebot11/action/BaseAction.ts | 14 +-- src/onebot11/action/extends/Debug.ts | 6 +- src/onebot11/action/file/GetFile.ts | 4 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 3 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 3 +- .../action/go-cqhttp/GetStrangerInfo.ts | 4 +- .../action/group/GetGroupMemberInfo.ts | 8 +- src/onebot11/action/group/SetGroupLeave.ts | 4 +- src/onebot11/action/msg/SendMsg.ts | 36 ++++---- src/onebot11/action/user/SendLike.ts | 6 +- src/onebot11/config.ts | 9 +- src/onebot11/constructor.ts | 18 ++-- src/onebot11/main.ts | 44 +++++----- src/onebot11/server/postOB11Event.ts | 10 +-- src/onebot11/server/ws/ReverseWebsocket.ts | 14 +-- src/onebot11/server/ws/WebsocketServer.ts | 8 +- src/onebot11/server/ws/reply.ts | 6 +- vite.config.ts | 2 +- 21 files changed, 217 insertions(+), 114 deletions(-) diff --git a/src/common/utils/helper.ts b/src/common/utils/helper.ts index b0084a9a..5730b51e 100644 --- a/src/common/utils/helper.ts +++ b/src/common/utils/helper.ts @@ -18,3 +18,20 @@ export function isNull(value: any) { export function isNumeric(str: string) { return /^\d+$/.test(str); } + +export function truncateString(obj: any, maxLength = 500) { + if (obj !== null && typeof obj === 'object') { + Object.keys(obj).forEach(key => { + if (typeof obj[key] === 'string') { + // 如果是字符串且超过指定长度,则截断 + if (obj[key].length > maxLength) { + obj[key] = obj[key].substring(0, maxLength) + '...'; + } + } else if (typeof obj[key] === 'object') { + // 如果是对象或数组,则递归调用 + truncateString(obj[key], maxLength); + } + }); + } + return obj; +} diff --git a/src/common/utils/log.ts b/src/common/utils/log.ts index 6e7ad391..52e8a802 100644 --- a/src/common/utils/log.ts +++ b/src/common/utils/log.ts @@ -1,4 +1,85 @@ +import log4js from 'log4js'; +import { truncateString } from '@/common/utils/helper'; +import path from 'node:path'; + +export enum LogLevel { + DEBUG = 'debug', + INFO = 'info', + WARN = 'warn', + ERROR = 'error', + FATAL = 'fatal', +} + +const logPath = path.join(path.resolve(__dirname), 'logs', 'napcat.log'); + +function genLogConfig(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) { + return { + appenders: { + fileAppender: { // 输出到文件的appender + type: 'file', + filename: logPath, // 指定日志文件的位置和文件名 + maxLogSize: 10485760, // 日志文件的最大大小(单位:字节),这里设置为10MB + }, + consoleAppender: { // 输出到控制台的appender + type: 'console' + } + }, + categories: { + default: { appenders: ['fileAppender', 'consoleAppender'], level: 'info' }, // 默认情况下同时输出到文件和控制台 + file: { appenders: ['fileAppender'], level: fileLogLevel }, + console: { appenders: ['consoleAppender'], level: fileLogLevel } + } + }; +} + + +export function setLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) { + log4js.configure(genLogConfig(fileLogLevel, consoleLogLevel)); +} + +setLogLevel(LogLevel.DEBUG, LogLevel.INFO); + +let fileLogEnabled = true; +let consoleLogEnabled = true; +export function enableFileLog(enable: boolean) { + fileLogEnabled = enable; +} +export function enableConsoleLog(enable: boolean) { + consoleLogEnabled = enable; +} + +function formatMsg(msg: any[]){ + let logMsg = ''; + for (const msgItem of msg) { + // 判断是否是对象 + if (typeof msgItem === 'object') { + const obj = JSON.parse(JSON.stringify(msgItem, null, 2)); + logMsg += JSON.stringify(truncateString(obj)) + ' '; + continue; + } + logMsg += msgItem + ' '; + } + return logMsg; +} + +function _log(level: LogLevel, ...args: any[]){ + if (consoleLogEnabled){ + log4js.getLogger('console')[level](formatMsg(args)); + } + if (fileLogEnabled){ + log4js.getLogger('file')[level](formatMsg(args)); + } +} export function log(...args: any[]) { - console.log(...args); -} \ No newline at end of file + // info 等级 + _log(LogLevel.INFO, ...args); +} + +export function logDebug(...args: any[]) { + _log(LogLevel.DEBUG, ...args); +} + +export function logError(...args: any[]) { + _log(LogLevel.ERROR, ...args); +} diff --git a/src/index.ts b/src/index.ts index fb40028d..15ffd8cb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,26 +1,26 @@ import { napCatCore } from '@/core'; -import { MsgListener } from '@/core/listeners'; -import { NapCatOnebot11 } from '@/onebot11/main'; import { program } from 'commander'; import qrcode from 'qrcode-terminal'; -import * as readline from 'node:readline'; import fs from 'fs/promises'; import path from 'node:path'; import { postLoginStatus } from '@/common/utils/umami'; import { checkVersion } from '@/common/utils/version'; +import { log, logError, LogLevel, setLogLevel } from '@/common/utils/log'; +import { NapCatOnebot11 } from '@/onebot11/main'; program .option('-q, --qq ', 'QQ号') .parse(process.argv); const cmdOptions = program.opts(); -console.log(process.argv); +// console.log(process.argv); +setLogLevel(LogLevel.DEBUG, LogLevel.DEBUG); checkVersion().then((remoteVersion: string) => { const localVersion = require('./package.json').version; const localVersionList = localVersion.split('.'); const remoteVersionList = remoteVersion.split('.'); - console.log('[NapCat] 当前版本:', localVersion); + log('[NapCat] 当前版本:', localVersion); for (const k of [0, 1, 2]) { if (parseInt(remoteVersionList[k]) > parseInt(localVersionList[k])) { console.log('[NapCat] 检测到更新,请前往 https://github.com/NapNeko/NapCatQQ 下载 NapCatQQ V', remoteVersion); @@ -29,25 +29,25 @@ checkVersion().then((remoteVersion: string) => { break; } } - console.log('[NapCat] 当前已是最新版本'); + log('[NapCat] 当前已是最新版本'); return; }).catch((e) => { - console.error('[NapCat] 检测更新失败'); + logError('[NapCat] 检测更新失败'); }); new NapCatOnebot11(); napCatCore.onLoginSuccess(() => { - console.log('login success'); + log('登录成功!'); postLoginStatus(); }); const showQRCode = (qrCodeData: { url: string, base64: string, buffer: Buffer }) => { - console.log('请扫描下面的二维码,然后在手Q上授权登录:'); - console.log('二维码解码URL:', qrCodeData.url); + log('请扫描下面的二维码,然后在手Q上授权登录:'); + log('二维码解码URL:', qrCodeData.url); const qrcodePath = path.join(__dirname, 'qrcode.png'); fs.writeFile(qrcodePath, qrCodeData.buffer).then(() => { - console.log('二维码已保存到', qrcodePath); + log('二维码已保存到', qrcodePath); }); qrcode.generate(qrCodeData.url, { small: true }, (res) => { - console.log(res); + log('\n' + res); }); }; const quickLoginQQ = cmdOptions.qq; @@ -57,12 +57,14 @@ const quickLoginQQ = cmdOptions.qq; // }); if (quickLoginQQ) { console.log('quick login', quickLoginQQ); - napCatCore.quickLogin(quickLoginQQ).then().catch((e) => { + napCatCore.quickLogin(quickLoginQQ).then(res=>{ + // log('快速登录结果:', res); + }).catch((e) => { console.error(e); napCatCore.qrLogin().then(showQRCode); }); } else { - console.info('没有 -q 参数指定快速登录的QQ,将使用二维码登录方式'); + log('没有 -q 参数指定快速登录的QQ,将使用二维码登录方式'); napCatCore.qrLogin().then(showQRCode); } diff --git a/src/onebot11/action/BaseAction.ts b/src/onebot11/action/BaseAction.ts index eacc9b39..2fad8ea6 100644 --- a/src/onebot11/action/BaseAction.ts +++ b/src/onebot11/action/BaseAction.ts @@ -2,10 +2,10 @@ import { ActionName, BaseCheckResult } from './types'; import { OB11Response } from './OB11Response'; import { OB11Return } from '../types'; -import { log } from '../../common/utils/log'; +import { log, logError } from '../../common/utils/log'; class BaseAction { - actionName: ActionName; + actionName!: ActionName; protected async check(payload: PayloadType): Promise { return { @@ -21,8 +21,8 @@ class BaseAction { try { const resData = await this._handle(payload); return OB11Response.ok(resData); - } catch (e) { - log('发生错误', e); + } catch (e: any) { + logError('发生错误', e); return OB11Response.error(e?.toString() || e?.stack?.toString() || '未知错误,可能操作超时', 200); } } @@ -35,8 +35,8 @@ class BaseAction { try { const resData = await this._handle(payload); return OB11Response.ok(resData, echo); - } catch (e) { - log('发生错误', e); + } catch (e: any) { + logError('发生错误', e); return OB11Response.error(e.stack?.toString() || e.toString(), 1200, echo); } } @@ -46,4 +46,4 @@ class BaseAction { } } -export default BaseAction; \ No newline at end of file +export default BaseAction; diff --git a/src/onebot11/action/extends/Debug.ts b/src/onebot11/action/extends/Debug.ts index 7bf1a225..53598551 100644 --- a/src/onebot11/action/extends/Debug.ts +++ b/src/onebot11/action/extends/Debug.ts @@ -10,7 +10,7 @@ import { NTQQWindowApi, } from '@/core'; import { ActionName } from '../types'; -import { log } from '@/common/utils/log'; +import { log, logDebug } from '@/common/utils/log'; interface Payload { method: string, @@ -21,12 +21,12 @@ export default class Debug extends BaseAction { actionName = ActionName.Debug; protected async _handle(payload: Payload): Promise { - log('debug call ntqq api', payload); + logDebug('debug call ntqq api', payload); const ntqqApi = [NTQQMsgApi, NTQQFriendApi, NTQQGroupApi, NTQQUserApi, NTQQFileApi, // NTQQFileCacheApi, NTQQWindowApi]; for (const ntqqApiClass of ntqqApi) { - log('ntqqApiClass', ntqqApiClass); + logDebug('ntqqApiClass', ntqqApiClass); const method = (ntqqApiClass)[payload.method]; if (method) { const result = method(...payload.args); diff --git a/src/onebot11/action/file/GetFile.ts b/src/onebot11/action/file/GetFile.ts index 9283c1dd..c7fcc207 100644 --- a/src/onebot11/action/file/GetFile.ts +++ b/src/onebot11/action/file/GetFile.ts @@ -2,7 +2,7 @@ import BaseAction from '../BaseAction'; import fs from 'fs/promises'; import { dbUtil } from '@/common/utils/db'; import { ob11Config } from '@/onebot11/config'; -import { log } from '@/common/utils/log'; +import { log, logDebug } from '@/common/utils/log'; import { sleep } from '@/common/utils/helper'; import { uri2local } from '@/common/utils/file'; import { ActionName } from '../types'; @@ -47,7 +47,7 @@ export class GetFileBase extends BaseAction { try { await fs.access(cache.path, fs.constants.F_OK); } catch (e) { - log('local file not found, start download...'); + logDebug('local file not found, start download...'); // if (cache.url) { // const downloadResult = await uri2local(cache.url); // if (downloadResult.success) { diff --git a/src/onebot11/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot11/action/go-cqhttp/GetFriendMsgHistory.ts index e54656ee..34d3f93a 100644 --- a/src/onebot11/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot11/action/go-cqhttp/GetFriendMsgHistory.ts @@ -6,6 +6,7 @@ import { ChatType } from '@/core/entities'; import { dbUtil } from '@/common/utils/db'; import { NTQQMsgApi } from '@/core/apis/msg'; import { OB11Constructor } from '../../constructor'; +import { logDebug } from '@/common/utils/log'; interface Payload { @@ -32,7 +33,7 @@ export default class GetFriendMsgHistory extends BaseAction { chatType: friend ? ChatType.friend : ChatType.temp, peerUid: uid }, startMsgId, parseInt(payload.count?.toString()) || 20)); - console.log(historyResult); + logDebug(historyResult); const msgList = historyResult.msgList; await Promise.all(msgList.map(async msg => { msg.id = await dbUtil.addMsg(msg); diff --git a/src/onebot11/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot11/action/go-cqhttp/GetGroupMsgHistory.ts index 81bca255..1bab3700 100644 --- a/src/onebot11/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot11/action/go-cqhttp/GetGroupMsgHistory.ts @@ -6,6 +6,7 @@ import { ChatType } from '@/core/entities'; import { dbUtil } from '@/common/utils/db'; import { NTQQMsgApi } from '@/core/apis/msg'; import { OB11Constructor } from '../../constructor'; +import { logDebug } from '@/common/utils/log'; interface Payload { @@ -32,7 +33,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends BaseAction { msg.id = await dbUtil.addMsg(msg); diff --git a/src/onebot11/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot11/action/go-cqhttp/GetStrangerInfo.ts index 583cc50a..bcf907d0 100644 --- a/src/onebot11/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot11/action/go-cqhttp/GetStrangerInfo.ts @@ -4,7 +4,7 @@ import { getUidByUin, uid2UinMap } from '@/common/data'; import { OB11Constructor } from '../../constructor'; import { ActionName } from '../types'; import { NTQQUserApi } from '@/core/apis/user'; -import { log } from '@/common/utils/log'; +import { log, logDebug } from '@/common/utils/log'; export default class GoCQHTTPGetStrangerInfo extends BaseAction<{ user_id: number }, OB11User> { @@ -12,7 +12,7 @@ export default class GoCQHTTPGetStrangerInfo extends BaseAction<{ user_id: numbe protected async _handle(payload: { user_id: number }): Promise { const user_id = payload.user_id.toString(); - log('uidMaps', uid2UinMap); + logDebug('uidMaps', uid2UinMap); const uid = getUidByUin(user_id); if (!uid) { throw new Error('查无此人'); diff --git a/src/onebot11/action/group/GetGroupMemberInfo.ts b/src/onebot11/action/group/GetGroupMemberInfo.ts index b115183e..bda42159 100644 --- a/src/onebot11/action/group/GetGroupMemberInfo.ts +++ b/src/onebot11/action/group/GetGroupMemberInfo.ts @@ -4,7 +4,7 @@ import { OB11Constructor } from '../../constructor'; import BaseAction from '../BaseAction'; import { ActionName } from '../types'; import { NTQQUserApi } from '@/core/apis/user'; -import { log } from '@/common/utils/log'; +import { log, logDebug } from '@/common/utils/log'; import { isNull } from '../../../common/utils/helper'; @@ -20,13 +20,13 @@ class GetGroupMemberInfo extends BaseAction { const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString()); // log(member); if (member) { - log('获取群成员详细信息'); + logDebug('获取群成员详细信息'); try { const info = (await NTQQUserApi.getUserDetailInfo(member.uid)); - log('群成员详细信息结果', info); + logDebug('群成员详细信息结果', info); Object.assign(member, info); } catch (e) { - log('获取群成员详细信息失败, 只能返回基础信息', e); + logDebug('获取群成员详细信息失败, 只能返回基础信息', e); } return OB11Constructor.groupMember(payload.group_id.toString(), member); } else { diff --git a/src/onebot11/action/group/SetGroupLeave.ts b/src/onebot11/action/group/SetGroupLeave.ts index ee455d0a..e5378bb4 100644 --- a/src/onebot11/action/group/SetGroupLeave.ts +++ b/src/onebot11/action/group/SetGroupLeave.ts @@ -1,7 +1,7 @@ import BaseAction from '../BaseAction'; import { ActionName } from '../types'; import { NTQQGroupApi } from '@/core/apis/group'; -import { log } from '@/common/utils/log'; +import { log, logError } from '@/common/utils/log'; interface Payload { group_id: number, @@ -15,7 +15,7 @@ export default class SetGroupLeave extends BaseAction { try { await NTQQGroupApi.quitGroup(payload.group_id.toString()); } catch (e) { - log('退群失败', e); + logError('退群失败', e); throw e; } } diff --git a/src/onebot11/action/msg/SendMsg.ts b/src/onebot11/action/msg/SendMsg.ts index 72a22e20..dd7f1dad 100644 --- a/src/onebot11/action/msg/SendMsg.ts +++ b/src/onebot11/action/msg/SendMsg.ts @@ -23,7 +23,7 @@ import { ActionName, BaseCheckResult } from '../types'; import * as fs from 'node:fs'; import { decodeCQCode } from '../../cqcode'; import { dbUtil } from '@/common/utils/db'; -import { log } from '@/common/utils/log'; +import { log, logDebug, logError } from '@/common/utils/log'; import { sleep } from '@/common/utils/helper'; import { uri2local } from '@/common/utils/file'; import { getFriend, getGroup, getGroupMember, getUidByUin, selfInfo } from '@/common/data'; @@ -168,11 +168,11 @@ export async function createSendElements(messageData: OB11MessageData[], group: // log('download result', downloadPath); // log('下载完成后的msg', msg); } - log('找到文件缓存', file); + logDebug('找到文件缓存', file); } const { path, isLocal, fileName, errMsg } = (await uri2local(file)); if (errMsg) { - log('文件下载失败', errMsg); + logError('文件下载失败', errMsg); throw Error('文件下载失败' + errMsg); // throw (errMsg); // continue @@ -182,10 +182,10 @@ export async function createSendElements(messageData: OB11MessageData[], group: deleteAfterSentFiles.push(path); } if (sendMsg.type === OB11MessageDataType.file) { - log('发送文件', path, payloadFileName || fileName); + logDebug('发送文件', path, payloadFileName || fileName); sendElements.push(await SendMsgElementConstructor.file(path, payloadFileName || fileName)); } else if (sendMsg.type === OB11MessageDataType.video) { - log('发送视频', path, payloadFileName || fileName); + logDebug('发送视频', path, payloadFileName || fileName); let thumb = sendMsg.data?.thumb; if (thumb) { const uri2LocalRes = await uri2local(thumb); @@ -239,7 +239,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de try { returnMsg.id = await dbUtil.addMsg(returnMsg, false); } catch (e: any) { - log('发送消息id获取失败', e); + logDebug('发送消息id获取失败', e); returnMsg.id = 0; } // log('消息发送结果', returnMsg); @@ -380,7 +380,7 @@ export class SendMsg extends BaseAction { } private async cloneMsg(msg: RawMessage): Promise { - log('克隆的目标消息', msg); + logDebug('克隆的目标消息', msg); const sendElements: SendMessageElement[] = []; for (const ele of msg.elements) { sendElements.push(ele as SendMessageElement); @@ -390,9 +390,9 @@ export class SendMsg extends BaseAction { } if (sendElements.length === 0) { - log('需要clone的消息无法解析,将会忽略掉', msg); + logDebug('需要clone的消息无法解析,将会忽略掉', msg); } - log('克隆消息', sendElements); + logDebug('克隆消息', sendElements); try { const nodeMsg = await NTQQMsgApi.sendMsg({ chatType: ChatType.friend, @@ -401,7 +401,7 @@ export class SendMsg extends BaseAction { await sleep(500); return nodeMsg; } catch (e) { - log(e, '克隆转发消息失败,将忽略本条消息', msg); + logError(e, '克隆转发消息失败,将忽略本条消息', msg); } } @@ -440,7 +440,7 @@ export class SendMsg extends BaseAction { sendElements, deleteAfterSentFiles } = await createSendElements(convertMessage2List(messageNode.data.content), group); - log('开始生成转发节点', sendElements); + logDebug('开始生成转发节点', sendElements); const sendElementsSplit: SendMessageElement[][] = []; let splitIndex = 0; for (const ele of sendElements) { @@ -457,20 +457,20 @@ export class SendMsg extends BaseAction { } else { sendElementsSplit[splitIndex].push(ele); } - log(sendElementsSplit); + logDebug(sendElementsSplit); } // log("分割后的转发节点", sendElementsSplit) for (const eles of sendElementsSplit) { const nodeMsg = await sendMsg(selfPeer, eles, [], true); nodeMsgIds.push(nodeMsg.msgId); await sleep(500); - log('转发节点生成成功', nodeMsg.msgId); + logDebug('转发节点生成成功', nodeMsg.msgId); } deleteAfterSentFiles.map(f => fs.unlink(f, () => { })); } catch (e) { - log('生成转发消息节点失败', e); + logDebug('生成转发消息节点失败', e); } } } @@ -491,10 +491,10 @@ export class SendMsg extends BaseAction { } } } - log('nodeMsgArray', nodeMsgArray); + logDebug('nodeMsgArray', nodeMsgArray); nodeMsgIds = nodeMsgArray.map(msg => msg.msgId); if (needSendSelf) { - log('需要克隆转发消息'); + logDebug('需要克隆转发消息'); for (const [index, msg] of nodeMsgArray.entries()) { if (msg.peerUid !== selfInfo.uid) { const cloneMsg = await this.cloneMsg(msg); @@ -518,10 +518,10 @@ export class SendMsg extends BaseAction { throw Error('转发消息失败,生成节点为空'); } try { - log('开发转发', srcPeer, destPeer, nodeMsgIds); + logDebug('开发转发', srcPeer, destPeer, nodeMsgIds); return await NTQQMsgApi.multiForwardMsg(srcPeer!, destPeer, nodeMsgIds); } catch (e) { - log('forward failed', e); + logError('forward failed', e); return null; } } diff --git a/src/onebot11/action/user/SendLike.ts b/src/onebot11/action/user/SendLike.ts index fd1bf3af..f623a7b9 100644 --- a/src/onebot11/action/user/SendLike.ts +++ b/src/onebot11/action/user/SendLike.ts @@ -2,7 +2,7 @@ import { NTQQUserApi } from '../../../core/src/apis'; import BaseAction from '../BaseAction'; import { getFriend, getUidByUin, uid2UinMap } from '../../../common/data'; import { ActionName } from '../types'; -import { log } from '../../../common/utils/log'; +import { log, logDebug } from '../../../common/utils/log'; interface Payload { user_id: number, @@ -13,7 +13,7 @@ export default class SendLike extends BaseAction { actionName = ActionName.SendLike; protected async _handle(payload: Payload): Promise { - log('点赞参数', payload); + logDebug('点赞参数', payload); try { const qq = payload.user_id.toString(); const friend = await getFriend(qq); @@ -24,7 +24,7 @@ export default class SendLike extends BaseAction { uid = friend.uid; } const result = await NTQQUserApi.like(uid, parseInt(payload.times?.toString()) || 1); - console.log('点赞结果', result); + logDebug('点赞结果', result); if (result.result !== 0) { throw Error(result.errMsg); } diff --git a/src/onebot11/config.ts b/src/onebot11/config.ts index 301405ae..701e9f66 100644 --- a/src/onebot11/config.ts +++ b/src/onebot11/config.ts @@ -1,6 +1,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { selfInfo } from '@/common/data'; +import { logDebug, logError } from '@/common/utils/log'; export interface OB11Config { httpPort: number; @@ -56,21 +57,21 @@ class Config implements OB11Config { read() { const ob11ConfigPath = this.getConfigPath(); if (!fs.existsSync(ob11ConfigPath)) { - console.log(`onebot11配置文件 ${ob11ConfigPath} 不存在, 现已创建,请修改配置文件后重启NapCat`); + logError(`onebot11配置文件 ${ob11ConfigPath} 不存在, 现已创建,请修改配置文件后重启NapCat`); this.save(); return this; } const data = fs.readFileSync(ob11ConfigPath, 'utf-8'); try { const jsonData = JSON.parse(data); - console.log('get config', jsonData); + logDebug('Onebot 11配置文件已加载', jsonData); Object.assign(this, jsonData); // eslint-disable-next-line } catch (e: any) { if (e instanceof SyntaxError) { - console.error(`配置文件 ${ob11ConfigPath} 格式错误,请检查配置文件:`, e.message); + logError(`配置文件 ${ob11ConfigPath} 格式错误,请检查配置文件:`, e.message); }else{ - console.error(`读取配置文件 ${ob11ConfigPath} 时发生错误:`, e.message); + logError(`读取配置文件 ${ob11ConfigPath} 时发生错误:`, e.message); } } return this; diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts index 34fa3ced..f3e23b2e 100644 --- a/src/onebot11/constructor.ts +++ b/src/onebot11/constructor.ts @@ -33,7 +33,7 @@ import { OB11GroupNoticeEvent } from './event/notice/OB11GroupNoticeEvent'; import { OB11FriendAddNoticeEvent } from './event/notice/OB11FriendAddNoticeEvent'; import { calcQQLevel } from '../common/utils/qqlevel'; -import { log } from '../common/utils/log'; +import { log, logDebug, logError } from '../common/utils/log'; import { sleep } from '../common/utils/helper'; import { OB11GroupTitleEvent } from './event/notice/OB11GroupTitleEvent'; import { OB11GroupCardEvent } from './event/notice/OB11GroupCardEvent'; @@ -132,7 +132,7 @@ export class OB11Constructor { continue; } } catch (e: any) { - log('获取不到引用的消息', e.stack, element.replyElement.replayMsgSeq); + logError('获取不到引用的消息', e.stack, element.replyElement.replayMsgSeq); } } else if (element.picElement) { @@ -259,7 +259,7 @@ export class OB11Constructor { if (groupElement) { // log("收到群提示消息", groupElement) if (groupElement.type == TipGroupElementType.memberIncrease) { - log('收到群成员增加消息', groupElement); + logDebug('收到群成员增加消息', groupElement); await sleep(1000); const member = await getGroupMember(msg.peerUid, groupElement.memberUid); const memberUin = member?.uin; @@ -276,7 +276,7 @@ export class OB11Constructor { return event; } } else if (groupElement.type === TipGroupElementType.ban) { - log('收到群群员禁言提示', groupElement); + logDebug('收到群群员禁言提示', groupElement); const memberUid = groupElement.shutUp!.member.uid; const adminUid = groupElement.shutUp!.admin.uid; let memberUin: string = ''; @@ -298,7 +298,7 @@ export class OB11Constructor { return event; } } else if (groupElement.type == TipGroupElementType.kicked) { - log(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement); + logDebug(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement); deleteGroup(msg.peerUid); NTQQGroupApi.quitGroup(msg.peerUid).then(); try { @@ -321,7 +321,7 @@ export class OB11Constructor { if (grayTipElement) { if (grayTipElement.subElementType == GrayTipElementSubType.INVITE_NEW_MEMBER) { - log('收到新人被邀请进群消息', grayTipElement); + logDebug('收到新人被邀请进群消息', grayTipElement); const xmlElement = grayTipElement.xmlElement; if (xmlElement?.content) { const regex = /jp="(\d+)"/g; @@ -366,7 +366,7 @@ export class OB11Constructor { * */ const memberUin = json.items[1].param[0]; const title = json.items[3].txt; - log('收到群成员新头衔消息', json); + logDebug('收到群成员新头衔消息', json); return new OB11GroupTitleEvent(parseInt(msg.peerUid), parseInt(memberUin), title); } } @@ -451,7 +451,7 @@ export class OB11Constructor { } static stranger(user: User): OB11User { - log('construct ob11 stranger', user); + logDebug('construct ob11 stranger', user); return { ...user, user_id: parseInt(user.uin), @@ -465,7 +465,7 @@ export class OB11Constructor { } static groupMembers(group: Group): OB11GroupMember[] { - log('construct ob11 group members', group); + logDebug('construct ob11 group members', group); return Array.from(groupMembers.get(group.groupCode)?.values() || []).map(m => OB11Constructor.groupMember(group.groupCode, m)); } diff --git a/src/onebot11/main.ts b/src/onebot11/main.ts index 311dd839..1d4a5593 100644 --- a/src/onebot11/main.ts +++ b/src/onebot11/main.ts @@ -20,7 +20,7 @@ import { dbUtil } from '@/common/utils/db'; import { BuddyListener, GroupListener, NodeIKernelBuddyListener } from '../core/src/listeners'; import { OB11FriendRequestEvent } from '@/onebot11/event/request/OB11FriendRequest'; import { NTQQGroupApi, NTQQUserApi } from '../core/src/apis'; -import { log } from '@/common/utils/log'; +import { log, logDebug, logError } from '@/common/utils/log'; import { OB11GroupRequestEvent } from '@/onebot11/event/request/OB11GroupRequest'; import { OB11GroupAdminNoticeEvent } from '@/onebot11/event/notice/OB11GroupAdminNoticeEvent'; import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot11/event/notice/OB11GroupDecreaseEvent'; @@ -38,7 +38,7 @@ export class NapCatOnebot11 { } public onReady() { - console.log('ob11 ready'); + logDebug('ob11 ready'); ob11Config.read(); if (ob11Config.enableHttp) { ob11HTTPServer.start(ob11Config.httpPort); @@ -95,7 +95,7 @@ export class NapCatOnebot11 { } }; napCatCore.addListener(msgListener); - console.log('ob11 msg listener added'); + logDebug('ob11 msg listener added'); // BuddyListener const buddyListener = new BuddyListener(); @@ -103,13 +103,13 @@ export class NapCatOnebot11 { this.postFriendRequest(req.buddyReqs).then().catch(log); }); napCatCore.addListener(buddyListener); - console.log('ob11 buddy listener added'); + logDebug('ob11 buddy listener added'); // GroupListener const groupListener = new GroupListener(); groupListener.onGroupNotifiesUpdated = (doubt, notifies) => { // console.log('ob11 onGroupNotifiesUpdated', notifies); - this.postGroupNotifies(notifies).then().catch(e => log('postGroupNotifies error: ', e)); + this.postGroupNotifies(notifies).then().catch(e => logError('postGroupNotifies error: ', e)); }; groupListener.onJoinGroupNotify = (...notify) => { // console.log('ob11 onJoinGroupNotify', notify); @@ -120,13 +120,13 @@ export class NapCatOnebot11 { }; napCatCore.addListener(groupListener); - console.log('ob11 group listener added'); + logDebug('ob11 group listener added'); } async postReceiveMsg(msgList: RawMessage[]) { const { debug, reportSelfMessage } = ob11Config; for (const message of msgList) { - // console.log("ob11 收到新消息", message) + log('收到新消息', message); // if (message.senderUin !== selfInfo.uin){ // message.msgShortId = await dbUtil.addMsg(message); // } @@ -147,18 +147,18 @@ export class NapCatOnebot11 { } postOB11Event(msg); // log("post msg", msg) - }).catch(e => log('constructMessage error: ', e)); + }).catch(e => logError('constructMessage error: ', e)); OB11Constructor.GroupEvent(message).then(groupEvent => { if (groupEvent) { // log("post group event", groupEvent); postOB11Event(groupEvent); } - }).catch(e => log('constructGroupEvent error: ', e)); + }).catch(e => logError('constructGroupEvent error: ', e)); OB11Constructor.FriendAddEvent(message).then(friendAddEvent=>{ if(friendAddEvent){ postOB11Event(friendAddEvent); } - }).catch(e => log('constructFriendAddEvent error: ', e)); + }).catch(e => logError('constructFriendAddEvent error: ', e)); } } @@ -176,7 +176,7 @@ export class NapCatOnebot11 { if (existNotify) { continue; } - log('收到群通知', notify); + logDebug('收到群通知', notify); groupNotifies[flag] = notify; // let member2: GroupMember; // if (notify.user2.uid) { @@ -184,22 +184,22 @@ export class NapCatOnebot11 { // } if ([GroupNotifyTypes.ADMIN_SET, GroupNotifyTypes.ADMIN_UNSET].includes(notify.type)) { const member1 = await getGroupMember(notify.group.groupCode, notify.user1.uid); - log('有管理员变动通知'); + logDebug('有管理员变动通知'); // refreshGroupMembers(notify.group.groupCode).then(); const groupAdminNoticeEvent = new OB11GroupAdminNoticeEvent(); groupAdminNoticeEvent.group_id = parseInt(notify.group.groupCode); - log('开始获取变动的管理员'); + logDebug('开始获取变动的管理员'); if (member1) { - log('变动管理员获取成功'); + logDebug('变动管理员获取成功'); groupAdminNoticeEvent.user_id = parseInt(member1.uin); groupAdminNoticeEvent.sub_type = notify.type == GroupNotifyTypes.ADMIN_UNSET ? 'unset' : 'set'; // member1.role = notify.type == GroupNotifyTypes.ADMIN_SET ? GroupMemberRole.admin : GroupMemberRole.normal; postOB11Event(groupAdminNoticeEvent, true); } else { - log('获取群通知的成员信息失败', notify, getGroup(notify.group.groupCode)); + logDebug('获取群通知的成员信息失败', notify, getGroup(notify.group.groupCode)); } } else if (notify.type == GroupNotifyTypes.MEMBER_EXIT || notify.type == GroupNotifyTypes.KICK_MEMBER) { - log('有成员退出通知', notify); + logDebug('有成员退出通知', notify); try { const member1 = await NTQQUserApi.getUserDetailInfo(notify.user1.uid); let operatorId = member1.uin; @@ -215,17 +215,17 @@ export class NapCatOnebot11 { const groupDecreaseEvent = new OB11GroupDecreaseEvent(parseInt(notify.group.groupCode), parseInt(member1.uin), parseInt(operatorId), subType); postOB11Event(groupDecreaseEvent, true); } catch (e: any) { - log('获取群通知的成员信息失败', notify, e.stack.toString()); + logError('获取群通知的成员信息失败', notify, e.stack.toString()); } } else if ([GroupNotifyTypes.JOIN_REQUEST].includes(notify.type)) { - log('有加群请求'); + logDebug('有加群请求'); const groupRequestEvent = new OB11GroupRequestEvent(); groupRequestEvent.group_id = parseInt(notify.group.groupCode); let requestQQ = ''; try { requestQQ = (await NTQQUserApi.getUserDetailInfo(notify.user1.uid)).uin; } catch (e) { - log('获取加群人QQ号失败', e); + logError('获取加群人QQ号失败', e); } groupRequestEvent.user_id = parseInt(requestQQ) || 0; groupRequestEvent.sub_type = 'add'; @@ -233,7 +233,7 @@ export class NapCatOnebot11 { groupRequestEvent.flag = flag; postOB11Event(groupRequestEvent); } else if (notify.type == GroupNotifyTypes.INVITE_ME) { - log('收到邀请我加群通知'); + logDebug('收到邀请我加群通知'); const groupInviteEvent = new OB11GroupRequestEvent(); groupInviteEvent.group_id = parseInt(notify.group.groupCode); let user_id = (await getFriend(notify.user2.uid))?.uin; @@ -246,7 +246,7 @@ export class NapCatOnebot11 { postOB11Event(groupInviteEvent); } } catch (e: any) { - log('解析群通知失败', e.stack.toString()); + logDebug('解析群通知失败', e.stack.toString()); } } @@ -298,7 +298,7 @@ export class NapCatOnebot11 { const requester = await NTQQUserApi.getUserDetailInfo(req.friendUid); friendRequestEvent.user_id = parseInt(requester.uin); } catch (e) { - log('获取加好友者QQ号失败', e); + logDebug('获取加好友者QQ号失败', e); } friendRequestEvent.flag = flag; friendRequestEvent.comment = req.extWords; diff --git a/src/onebot11/server/postOB11Event.ts b/src/onebot11/server/postOB11Event.ts index f7170cfd..7311a948 100644 --- a/src/onebot11/server/postOB11Event.ts +++ b/src/onebot11/server/postOB11Event.ts @@ -3,7 +3,7 @@ import { OB11BaseMetaEvent } from '../event/meta/OB11BaseMetaEvent'; import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent'; import { WebSocket as WebSocketClass } from 'ws'; import { wsReply } from './ws/reply'; -import { log } from '@/common/utils/log'; +import { log, logDebug, logError } from '@/common/utils/log'; import { ob11Config } from '@/onebot11/config'; import crypto from 'crypto'; import { ChatType, Group, GroupRequestOperateTypes, Peer } from '../../core/src/entities'; @@ -95,14 +95,14 @@ export function postOB11Event(msg: PostEventType, reportSelf = false, postWs= tr headers, body: msgStr }).then(async (res) => { - log(`新消息事件HTTP上报成功: ${host} `, msgStr); + logDebug(`新消息事件HTTP上报成功: ${host} `, msgStr); // todo: 处理不够优雅,应该使用高级泛型进行QuickAction类型识别 let resJson: QuickAction; try { resJson = await res.json(); - log('新消息事件HTTP上报返回快速操作: ', JSON.stringify(resJson)); + logDebug('新消息事件HTTP上报返回快速操作: ', JSON.stringify(resJson)); } catch (e) { - log('新消息事件HTTP上报没有返回快速操作,不需要处理'); + logDebug('新消息事件HTTP上报没有返回快速操作,不需要处理'); return; } if (msg.post_type === 'message') { @@ -177,7 +177,7 @@ export function postOB11Event(msg: PostEventType, reportSelf = false, postWs= tr } } }, (err: any) => { - log(`新消息事件HTTP上报失败: ${host} `, err, msg); + logError(`新消息事件HTTP上报失败: ${host} `, err, msg); }); } } diff --git a/src/onebot11/server/ws/ReverseWebsocket.ts b/src/onebot11/server/ws/ReverseWebsocket.ts index 7a3b1538..a65d0241 100644 --- a/src/onebot11/server/ws/ReverseWebsocket.ts +++ b/src/onebot11/server/ws/ReverseWebsocket.ts @@ -7,7 +7,7 @@ import { postWsEvent, registerWsEventSender, unregisterWsEventSender } from '../ import { wsReply } from './reply'; import { WebSocket as WebSocketClass } from 'ws'; import { OB11HeartbeatEvent } from '../../event/meta/OB11HeartbeatEvent'; -import { log } from '../../../common/utils/log'; +import { log, logDebug, logError } from '../../../common/utils/log'; import { ob11Config } from '@/onebot11/config'; import { napCatCore } from '@/core'; import { selfInfo } from '@/common/data'; @@ -40,7 +40,7 @@ export class ReverseWebsocket { try { receiveData = JSON.parse(msg.toString()); echo = receiveData.echo; - log('收到反向Websocket消息', receiveData); + logDebug('收到反向Websocket消息', receiveData); } catch (e) { return wsReply(this.websocket!, OB11Response.error('json解析失败,请检查数据格式', 1400, echo)); } @@ -57,7 +57,7 @@ export class ReverseWebsocket { } public onclose = () => { - log('反向ws断开', this.url); + logDebug('反向ws断开', this.url); unregisterWsEventSender(this.websocket!); if (this.running) { this.reconnect(); @@ -89,11 +89,11 @@ export class ReverseWebsocket { } }); registerWsEventSender(this.websocket); - log('Trying to connect to the websocket server: ' + this.url); + logDebug('Trying to connect to the websocket server: ' + this.url); this.websocket.on('open', () => { - log('Connected to the websocket server: ' + this.url); + logDebug('Connected to the websocket server: ' + this.url); this.onopen(); }); @@ -108,7 +108,7 @@ export class ReverseWebsocket { }, heartInterval); // 心跳包 this.websocket.on('close', () => { clearInterval(wsClientInterval); - log('The websocket connection: ' + this.url + ' closed, trying reconnecting...'); + logDebug('The websocket connection: ' + this.url + ' closed, trying reconnecting...'); this.onclose(); }); } @@ -122,7 +122,7 @@ class OB11ReverseWebsockets { try { rwsList.push(new ReverseWebsocket(url)); } catch (e: any) { - log(e.stack); + logError(e.stack); } }).then(); } diff --git a/src/onebot11/server/ws/WebsocketServer.ts b/src/onebot11/server/ws/WebsocketServer.ts index 83d59977..9eb6a16e 100644 --- a/src/onebot11/server/ws/WebsocketServer.ts +++ b/src/onebot11/server/ws/WebsocketServer.ts @@ -10,7 +10,7 @@ import { WebsocketServerBase } from '@/common/server/websocket'; import { IncomingMessage } from 'node:http'; import { wsReply } from './reply'; import { napCatCore } from '@/core'; -import { log } from '../../../common/utils/log'; +import { log, logDebug, logError } from '../../../common/utils/log'; import { ob11Config } from '@/onebot11/config'; import { selfInfo } from '@/common/data'; @@ -58,19 +58,19 @@ class OB11WebsocketServer extends WebsocketServerBase { if (url == '/event' || url == '/event/' || url == '/') { registerWsEventSender(wsClient); - log('event上报ws客户端已连接'); + logDebug('event上报ws客户端已连接'); try { wsReply(wsClient, new OB11LifeCycleEvent(LifeCycleSubType.CONNECT)); } catch (e) { - log('发送生命周期失败', e); + logError('发送生命周期失败', e); } const { heartInterval } = ob11Config; const wsClientInterval = setInterval(() => { postWsEvent(new OB11HeartbeatEvent(!!selfInfo.online, true, heartInterval)); }, heartInterval); // 心跳包 wsClient.on('close', () => { - log('event上报ws客户端已断开'); + logError('event上报ws客户端已断开'); clearInterval(wsClientInterval); unregisterWsEventSender(wsClient); }); diff --git a/src/onebot11/server/ws/reply.ts b/src/onebot11/server/ws/reply.ts index 0e470140..641d2842 100644 --- a/src/onebot11/server/ws/reply.ts +++ b/src/onebot11/server/ws/reply.ts @@ -1,7 +1,7 @@ import { WebSocket as WebSocketClass } from 'ws'; import { OB11Response } from '../../action/OB11Response'; import { PostEventType } from '../postOB11Event'; -import { log } from '../../../common/utils/log'; +import { log, logDebug, logError } from '../../../common/utils/log'; import { isNull } from '../../../common/utils/helper'; @@ -12,8 +12,8 @@ export function wsReply(wsClient: WebSocketClass, data: OB11Response | PostEvent delete packet['echo']; } wsClient.send(JSON.stringify(packet)); - log('ws 消息上报', wsClient.url || '', data); + logDebug('ws 消息上报', wsClient.url || '', data); } catch (e: any) { - log('websocket 回复失败', e.stack, data); + logError('websocket 回复失败', e.stack, data); } } diff --git a/vite.config.ts b/vite.config.ts index 932181bd..057837c5 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -64,7 +64,7 @@ const baseConfig = (mode: string = 'development') => defineConfig({ target: 'esnext', minify: mode === 'production' ? 'esbuild' : false, lib: { - entry: 'src/onebot11/index.ts', + entry: 'src/index.ts', formats: ['cjs'], fileName: () => 'napcat.cjs', },