refactor: core

This commit is contained in:
linyuchen 2024-04-27 00:50:08 +08:00
parent dc029a318b
commit 4402fc2d0a
21 changed files with 217 additions and 114 deletions

View File

@ -18,3 +18,20 @@ export function isNull(value: any) {
export function isNumeric(str: string) { export function isNumeric(str: string) {
return /^\d+$/.test(str); 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;
}

View File

@ -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[]) { export function log(...args: any[]) {
console.log(...args); // info 等级
_log(LogLevel.INFO, ...args);
}
export function logDebug(...args: any[]) {
_log(LogLevel.DEBUG, ...args);
}
export function logError(...args: any[]) {
_log(LogLevel.ERROR, ...args);
} }

View File

@ -1,26 +1,26 @@
import { napCatCore } from '@/core'; import { napCatCore } from '@/core';
import { MsgListener } from '@/core/listeners';
import { NapCatOnebot11 } from '@/onebot11/main';
import { program } from 'commander'; import { program } from 'commander';
import qrcode from 'qrcode-terminal'; import qrcode from 'qrcode-terminal';
import * as readline from 'node:readline';
import fs from 'fs/promises'; import fs from 'fs/promises';
import path from 'node:path'; import path from 'node:path';
import { postLoginStatus } from '@/common/utils/umami'; import { postLoginStatus } from '@/common/utils/umami';
import { checkVersion } from '@/common/utils/version'; import { checkVersion } from '@/common/utils/version';
import { log, logError, LogLevel, setLogLevel } from '@/common/utils/log';
import { NapCatOnebot11 } from '@/onebot11/main';
program program
.option('-q, --qq <type>', 'QQ号') .option('-q, --qq <type>', 'QQ号')
.parse(process.argv); .parse(process.argv);
const cmdOptions = program.opts(); const cmdOptions = program.opts();
console.log(process.argv); // console.log(process.argv);
setLogLevel(LogLevel.DEBUG, LogLevel.DEBUG);
checkVersion().then((remoteVersion: string) => { checkVersion().then((remoteVersion: string) => {
const localVersion = require('./package.json').version; const localVersion = require('./package.json').version;
const localVersionList = localVersion.split('.'); const localVersionList = localVersion.split('.');
const remoteVersionList = remoteVersion.split('.'); const remoteVersionList = remoteVersion.split('.');
console.log('[NapCat] 当前版本:', localVersion); log('[NapCat] 当前版本:', localVersion);
for (const k of [0, 1, 2]) { for (const k of [0, 1, 2]) {
if (parseInt(remoteVersionList[k]) > parseInt(localVersionList[k])) { if (parseInt(remoteVersionList[k]) > parseInt(localVersionList[k])) {
console.log('[NapCat] 检测到更新,请前往 https://github.com/NapNeko/NapCatQQ 下载 NapCatQQ V', remoteVersion); console.log('[NapCat] 检测到更新,请前往 https://github.com/NapNeko/NapCatQQ 下载 NapCatQQ V', remoteVersion);
@ -29,25 +29,25 @@ checkVersion().then((remoteVersion: string) => {
break; break;
} }
} }
console.log('[NapCat] 当前已是最新版本'); log('[NapCat] 当前已是最新版本');
return; return;
}).catch((e) => { }).catch((e) => {
console.error('[NapCat] 检测更新失败'); logError('[NapCat] 检测更新失败');
}); });
new NapCatOnebot11(); new NapCatOnebot11();
napCatCore.onLoginSuccess(() => { napCatCore.onLoginSuccess(() => {
console.log('login success'); log('登录成功!');
postLoginStatus(); postLoginStatus();
}); });
const showQRCode = (qrCodeData: { url: string, base64: string, buffer: Buffer }) => { const showQRCode = (qrCodeData: { url: string, base64: string, buffer: Buffer }) => {
console.log('请扫描下面的二维码然后在手Q上授权登录'); log('请扫描下面的二维码然后在手Q上授权登录');
console.log('二维码解码URL:', qrCodeData.url); log('二维码解码URL:', qrCodeData.url);
const qrcodePath = path.join(__dirname, 'qrcode.png'); const qrcodePath = path.join(__dirname, 'qrcode.png');
fs.writeFile(qrcodePath, qrCodeData.buffer).then(() => { fs.writeFile(qrcodePath, qrCodeData.buffer).then(() => {
console.log('二维码已保存到', qrcodePath); log('二维码已保存到', qrcodePath);
}); });
qrcode.generate(qrCodeData.url, { small: true }, (res) => { qrcode.generate(qrCodeData.url, { small: true }, (res) => {
console.log(res); log('\n' + res);
}); });
}; };
const quickLoginQQ = cmdOptions.qq; const quickLoginQQ = cmdOptions.qq;
@ -57,12 +57,14 @@ const quickLoginQQ = cmdOptions.qq;
// }); // });
if (quickLoginQQ) { if (quickLoginQQ) {
console.log('quick login', quickLoginQQ); console.log('quick login', quickLoginQQ);
napCatCore.quickLogin(quickLoginQQ).then().catch((e) => { napCatCore.quickLogin(quickLoginQQ).then(res=>{
// log('快速登录结果:', res);
}).catch((e) => {
console.error(e); console.error(e);
napCatCore.qrLogin().then(showQRCode); napCatCore.qrLogin().then(showQRCode);
}); });
} else { } else {
console.info('没有 -q 参数指定快速登录的QQ将使用二维码登录方式'); log('没有 -q 参数指定快速登录的QQ将使用二维码登录方式');
napCatCore.qrLogin().then(showQRCode); napCatCore.qrLogin().then(showQRCode);
} }

View File

@ -2,10 +2,10 @@ import { ActionName, BaseCheckResult } from './types';
import { OB11Response } from './OB11Response'; import { OB11Response } from './OB11Response';
import { OB11Return } from '../types'; import { OB11Return } from '../types';
import { log } from '../../common/utils/log'; import { log, logError } from '../../common/utils/log';
class BaseAction<PayloadType, ReturnDataType> { class BaseAction<PayloadType, ReturnDataType> {
actionName: ActionName; actionName!: ActionName;
protected async check(payload: PayloadType): Promise<BaseCheckResult> { protected async check(payload: PayloadType): Promise<BaseCheckResult> {
return { return {
@ -21,8 +21,8 @@ class BaseAction<PayloadType, ReturnDataType> {
try { try {
const resData = await this._handle(payload); const resData = await this._handle(payload);
return OB11Response.ok(resData); return OB11Response.ok(resData);
} catch (e) { } catch (e: any) {
log('发生错误', e); logError('发生错误', e);
return OB11Response.error(e?.toString() || e?.stack?.toString() || '未知错误,可能操作超时', 200); return OB11Response.error(e?.toString() || e?.stack?.toString() || '未知错误,可能操作超时', 200);
} }
} }
@ -35,8 +35,8 @@ class BaseAction<PayloadType, ReturnDataType> {
try { try {
const resData = await this._handle(payload); const resData = await this._handle(payload);
return OB11Response.ok(resData, echo); return OB11Response.ok(resData, echo);
} catch (e) { } catch (e: any) {
log('发生错误', e); logError('发生错误', e);
return OB11Response.error(e.stack?.toString() || e.toString(), 1200, echo); return OB11Response.error(e.stack?.toString() || e.toString(), 1200, echo);
} }
} }

View File

@ -10,7 +10,7 @@ import {
NTQQWindowApi, NTQQWindowApi,
} from '@/core'; } from '@/core';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { log } from '@/common/utils/log'; import { log, logDebug } from '@/common/utils/log';
interface Payload { interface Payload {
method: string, method: string,
@ -21,12 +21,12 @@ export default class Debug extends BaseAction<Payload, any> {
actionName = ActionName.Debug; actionName = ActionName.Debug;
protected async _handle(payload: Payload): Promise<any> { protected async _handle(payload: Payload): Promise<any> {
log('debug call ntqq api', payload); logDebug('debug call ntqq api', payload);
const ntqqApi = [NTQQMsgApi, NTQQFriendApi, NTQQGroupApi, NTQQUserApi, NTQQFileApi, const ntqqApi = [NTQQMsgApi, NTQQFriendApi, NTQQGroupApi, NTQQUserApi, NTQQFileApi,
// NTQQFileCacheApi, // NTQQFileCacheApi,
NTQQWindowApi]; NTQQWindowApi];
for (const ntqqApiClass of ntqqApi) { for (const ntqqApiClass of ntqqApi) {
log('ntqqApiClass', ntqqApiClass); logDebug('ntqqApiClass', ntqqApiClass);
const method = (<any>ntqqApiClass)[payload.method]; const method = (<any>ntqqApiClass)[payload.method];
if (method) { if (method) {
const result = method(...payload.args); const result = method(...payload.args);

View File

@ -2,7 +2,7 @@ import BaseAction from '../BaseAction';
import fs from 'fs/promises'; import fs from 'fs/promises';
import { dbUtil } from '@/common/utils/db'; import { dbUtil } from '@/common/utils/db';
import { ob11Config } from '@/onebot11/config'; 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 { sleep } from '@/common/utils/helper';
import { uri2local } from '@/common/utils/file'; import { uri2local } from '@/common/utils/file';
import { ActionName } from '../types'; import { ActionName } from '../types';
@ -47,7 +47,7 @@ export class GetFileBase extends BaseAction<GetFilePayload, GetFileResponse> {
try { try {
await fs.access(cache.path, fs.constants.F_OK); await fs.access(cache.path, fs.constants.F_OK);
} catch (e) { } catch (e) {
log('local file not found, start download...'); logDebug('local file not found, start download...');
// if (cache.url) { // if (cache.url) {
// const downloadResult = await uri2local(cache.url); // const downloadResult = await uri2local(cache.url);
// if (downloadResult.success) { // if (downloadResult.success) {

View File

@ -6,6 +6,7 @@ import { ChatType } from '@/core/entities';
import { dbUtil } from '@/common/utils/db'; import { dbUtil } from '@/common/utils/db';
import { NTQQMsgApi } from '@/core/apis/msg'; import { NTQQMsgApi } from '@/core/apis/msg';
import { OB11Constructor } from '../../constructor'; import { OB11Constructor } from '../../constructor';
import { logDebug } from '@/common/utils/log';
interface Payload { interface Payload {
@ -32,7 +33,7 @@ export default class GetFriendMsgHistory extends BaseAction<Payload, Response> {
chatType: friend ? ChatType.friend : ChatType.temp, chatType: friend ? ChatType.friend : ChatType.temp,
peerUid: uid peerUid: uid
}, startMsgId, parseInt(payload.count?.toString()) || 20)); }, startMsgId, parseInt(payload.count?.toString()) || 20));
console.log(historyResult); logDebug(historyResult);
const msgList = historyResult.msgList; const msgList = historyResult.msgList;
await Promise.all(msgList.map(async msg => { await Promise.all(msgList.map(async msg => {
msg.id = await dbUtil.addMsg(msg); msg.id = await dbUtil.addMsg(msg);

View File

@ -6,6 +6,7 @@ import { ChatType } from '@/core/entities';
import { dbUtil } from '@/common/utils/db'; import { dbUtil } from '@/common/utils/db';
import { NTQQMsgApi } from '@/core/apis/msg'; import { NTQQMsgApi } from '@/core/apis/msg';
import { OB11Constructor } from '../../constructor'; import { OB11Constructor } from '../../constructor';
import { logDebug } from '@/common/utils/log';
interface Payload { interface Payload {
@ -32,7 +33,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends BaseAction<Payload, Resp
chatType: ChatType.group, chatType: ChatType.group,
peerUid: group.groupCode peerUid: group.groupCode
}, startMsgId, parseInt(payload.count?.toString()) || 20)); }, startMsgId, parseInt(payload.count?.toString()) || 20));
console.log(historyResult); logDebug(historyResult);
const msgList = historyResult.msgList; const msgList = historyResult.msgList;
await Promise.all(msgList.map(async msg => { await Promise.all(msgList.map(async msg => {
msg.id = await dbUtil.addMsg(msg); msg.id = await dbUtil.addMsg(msg);

View File

@ -4,7 +4,7 @@ import { getUidByUin, uid2UinMap } from '@/common/data';
import { OB11Constructor } from '../../constructor'; import { OB11Constructor } from '../../constructor';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { NTQQUserApi } from '@/core/apis/user'; 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> { 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<OB11User> { protected async _handle(payload: { user_id: number }): Promise<OB11User> {
const user_id = payload.user_id.toString(); const user_id = payload.user_id.toString();
log('uidMaps', uid2UinMap); logDebug('uidMaps', uid2UinMap);
const uid = getUidByUin(user_id); const uid = getUidByUin(user_id);
if (!uid) { if (!uid) {
throw new Error('查无此人'); throw new Error('查无此人');

View File

@ -4,7 +4,7 @@ import { OB11Constructor } from '../../constructor';
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { NTQQUserApi } from '@/core/apis/user'; 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'; import { isNull } from '../../../common/utils/helper';
@ -20,13 +20,13 @@ class GetGroupMemberInfo extends BaseAction<PayloadType, OB11GroupMember> {
const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString()); const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString());
// log(member); // log(member);
if (member) { if (member) {
log('获取群成员详细信息'); logDebug('获取群成员详细信息');
try { try {
const info = (await NTQQUserApi.getUserDetailInfo(member.uid)); const info = (await NTQQUserApi.getUserDetailInfo(member.uid));
log('群成员详细信息结果', info); logDebug('群成员详细信息结果', info);
Object.assign(member, info); Object.assign(member, info);
} catch (e) { } catch (e) {
log('获取群成员详细信息失败, 只能返回基础信息', e); logDebug('获取群成员详细信息失败, 只能返回基础信息', e);
} }
return OB11Constructor.groupMember(payload.group_id.toString(), member); return OB11Constructor.groupMember(payload.group_id.toString(), member);
} else { } else {

View File

@ -1,7 +1,7 @@
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { NTQQGroupApi } from '@/core/apis/group'; import { NTQQGroupApi } from '@/core/apis/group';
import { log } from '@/common/utils/log'; import { log, logError } from '@/common/utils/log';
interface Payload { interface Payload {
group_id: number, group_id: number,
@ -15,7 +15,7 @@ export default class SetGroupLeave extends BaseAction<Payload, any> {
try { try {
await NTQQGroupApi.quitGroup(payload.group_id.toString()); await NTQQGroupApi.quitGroup(payload.group_id.toString());
} catch (e) { } catch (e) {
log('退群失败', e); logError('退群失败', e);
throw e; throw e;
} }
} }

View File

@ -23,7 +23,7 @@ import { ActionName, BaseCheckResult } from '../types';
import * as fs from 'node:fs'; import * as fs from 'node:fs';
import { decodeCQCode } from '../../cqcode'; import { decodeCQCode } from '../../cqcode';
import { dbUtil } from '@/common/utils/db'; 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 { sleep } from '@/common/utils/helper';
import { uri2local } from '@/common/utils/file'; import { uri2local } from '@/common/utils/file';
import { getFriend, getGroup, getGroupMember, getUidByUin, selfInfo } from '@/common/data'; 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('download result', downloadPath);
// log('下载完成后的msg', msg); // log('下载完成后的msg', msg);
} }
log('找到文件缓存', file); logDebug('找到文件缓存', file);
} }
const { path, isLocal, fileName, errMsg } = (await uri2local(file)); const { path, isLocal, fileName, errMsg } = (await uri2local(file));
if (errMsg) { if (errMsg) {
log('文件下载失败', errMsg); logError('文件下载失败', errMsg);
throw Error('文件下载失败' + errMsg); throw Error('文件下载失败' + errMsg);
// throw (errMsg); // throw (errMsg);
// continue // continue
@ -182,10 +182,10 @@ export async function createSendElements(messageData: OB11MessageData[], group:
deleteAfterSentFiles.push(path); deleteAfterSentFiles.push(path);
} }
if (sendMsg.type === OB11MessageDataType.file) { if (sendMsg.type === OB11MessageDataType.file) {
log('发送文件', path, payloadFileName || fileName); logDebug('发送文件', path, payloadFileName || fileName);
sendElements.push(await SendMsgElementConstructor.file(path, payloadFileName || fileName)); sendElements.push(await SendMsgElementConstructor.file(path, payloadFileName || fileName));
} else if (sendMsg.type === OB11MessageDataType.video) { } else if (sendMsg.type === OB11MessageDataType.video) {
log('发送视频', path, payloadFileName || fileName); logDebug('发送视频', path, payloadFileName || fileName);
let thumb = sendMsg.data?.thumb; let thumb = sendMsg.data?.thumb;
if (thumb) { if (thumb) {
const uri2LocalRes = await uri2local(thumb); const uri2LocalRes = await uri2local(thumb);
@ -239,7 +239,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de
try { try {
returnMsg.id = await dbUtil.addMsg(returnMsg, false); returnMsg.id = await dbUtil.addMsg(returnMsg, false);
} catch (e: any) { } catch (e: any) {
log('发送消息id获取失败', e); logDebug('发送消息id获取失败', e);
returnMsg.id = 0; returnMsg.id = 0;
} }
// log('消息发送结果', returnMsg); // log('消息发送结果', returnMsg);
@ -380,7 +380,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
} }
private async cloneMsg(msg: RawMessage): Promise<RawMessage | undefined> { private async cloneMsg(msg: RawMessage): Promise<RawMessage | undefined> {
log('克隆的目标消息', msg); logDebug('克隆的目标消息', msg);
const sendElements: SendMessageElement[] = []; const sendElements: SendMessageElement[] = [];
for (const ele of msg.elements) { for (const ele of msg.elements) {
sendElements.push(ele as SendMessageElement); sendElements.push(ele as SendMessageElement);
@ -390,9 +390,9 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
} }
if (sendElements.length === 0) { if (sendElements.length === 0) {
log('需要clone的消息无法解析将会忽略掉', msg); logDebug('需要clone的消息无法解析将会忽略掉', msg);
} }
log('克隆消息', sendElements); logDebug('克隆消息', sendElements);
try { try {
const nodeMsg = await NTQQMsgApi.sendMsg({ const nodeMsg = await NTQQMsgApi.sendMsg({
chatType: ChatType.friend, chatType: ChatType.friend,
@ -401,7 +401,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
await sleep(500); await sleep(500);
return nodeMsg; return nodeMsg;
} catch (e) { } catch (e) {
log(e, '克隆转发消息失败,将忽略本条消息', msg); logError(e, '克隆转发消息失败,将忽略本条消息', msg);
} }
} }
@ -440,7 +440,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
sendElements, sendElements,
deleteAfterSentFiles deleteAfterSentFiles
} = await createSendElements(convertMessage2List(messageNode.data.content), group); } = await createSendElements(convertMessage2List(messageNode.data.content), group);
log('开始生成转发节点', sendElements); logDebug('开始生成转发节点', sendElements);
const sendElementsSplit: SendMessageElement[][] = []; const sendElementsSplit: SendMessageElement[][] = [];
let splitIndex = 0; let splitIndex = 0;
for (const ele of sendElements) { for (const ele of sendElements) {
@ -457,20 +457,20 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
} else { } else {
sendElementsSplit[splitIndex].push(ele); sendElementsSplit[splitIndex].push(ele);
} }
log(sendElementsSplit); logDebug(sendElementsSplit);
} }
// log("分割后的转发节点", sendElementsSplit) // log("分割后的转发节点", sendElementsSplit)
for (const eles of sendElementsSplit) { for (const eles of sendElementsSplit) {
const nodeMsg = await sendMsg(selfPeer, eles, [], true); const nodeMsg = await sendMsg(selfPeer, eles, [], true);
nodeMsgIds.push(nodeMsg.msgId); nodeMsgIds.push(nodeMsg.msgId);
await sleep(500); await sleep(500);
log('转发节点生成成功', nodeMsg.msgId); logDebug('转发节点生成成功', nodeMsg.msgId);
} }
deleteAfterSentFiles.map(f => fs.unlink(f, () => { deleteAfterSentFiles.map(f => fs.unlink(f, () => {
})); }));
} catch (e) { } catch (e) {
log('生成转发消息节点失败', e); logDebug('生成转发消息节点失败', e);
} }
} }
} }
@ -491,10 +491,10 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
} }
} }
} }
log('nodeMsgArray', nodeMsgArray); logDebug('nodeMsgArray', nodeMsgArray);
nodeMsgIds = nodeMsgArray.map(msg => msg.msgId); nodeMsgIds = nodeMsgArray.map(msg => msg.msgId);
if (needSendSelf) { if (needSendSelf) {
log('需要克隆转发消息'); logDebug('需要克隆转发消息');
for (const [index, msg] of nodeMsgArray.entries()) { for (const [index, msg] of nodeMsgArray.entries()) {
if (msg.peerUid !== selfInfo.uid) { if (msg.peerUid !== selfInfo.uid) {
const cloneMsg = await this.cloneMsg(msg); const cloneMsg = await this.cloneMsg(msg);
@ -518,10 +518,10 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
throw Error('转发消息失败,生成节点为空'); throw Error('转发消息失败,生成节点为空');
} }
try { try {
log('开发转发', srcPeer, destPeer, nodeMsgIds); logDebug('开发转发', srcPeer, destPeer, nodeMsgIds);
return await NTQQMsgApi.multiForwardMsg(srcPeer!, destPeer, nodeMsgIds); return await NTQQMsgApi.multiForwardMsg(srcPeer!, destPeer, nodeMsgIds);
} catch (e) { } catch (e) {
log('forward failed', e); logError('forward failed', e);
return null; return null;
} }
} }

View File

@ -2,7 +2,7 @@ import { NTQQUserApi } from '../../../core/src/apis';
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { getFriend, getUidByUin, uid2UinMap } from '../../../common/data'; import { getFriend, getUidByUin, uid2UinMap } from '../../../common/data';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { log } from '../../../common/utils/log'; import { log, logDebug } from '../../../common/utils/log';
interface Payload { interface Payload {
user_id: number, user_id: number,
@ -13,7 +13,7 @@ export default class SendLike extends BaseAction<Payload, null> {
actionName = ActionName.SendLike; actionName = ActionName.SendLike;
protected async _handle(payload: Payload): Promise<null> { protected async _handle(payload: Payload): Promise<null> {
log('点赞参数', payload); logDebug('点赞参数', payload);
try { try {
const qq = payload.user_id.toString(); const qq = payload.user_id.toString();
const friend = await getFriend(qq); const friend = await getFriend(qq);
@ -24,7 +24,7 @@ export default class SendLike extends BaseAction<Payload, null> {
uid = friend.uid; uid = friend.uid;
} }
const result = await NTQQUserApi.like(uid, parseInt(payload.times?.toString()) || 1); const result = await NTQQUserApi.like(uid, parseInt(payload.times?.toString()) || 1);
console.log('点赞结果', result); logDebug('点赞结果', result);
if (result.result !== 0) { if (result.result !== 0) {
throw Error(result.errMsg); throw Error(result.errMsg);
} }

View File

@ -1,6 +1,7 @@
import fs from 'node:fs'; import fs from 'node:fs';
import path from 'node:path'; import path from 'node:path';
import { selfInfo } from '@/common/data'; import { selfInfo } from '@/common/data';
import { logDebug, logError } from '@/common/utils/log';
export interface OB11Config { export interface OB11Config {
httpPort: number; httpPort: number;
@ -56,21 +57,21 @@ class Config implements OB11Config {
read() { read() {
const ob11ConfigPath = this.getConfigPath(); const ob11ConfigPath = this.getConfigPath();
if (!fs.existsSync(ob11ConfigPath)) { if (!fs.existsSync(ob11ConfigPath)) {
console.log(`onebot11配置文件 ${ob11ConfigPath} 不存在, 现已创建请修改配置文件后重启NapCat`); logError(`onebot11配置文件 ${ob11ConfigPath} 不存在, 现已创建请修改配置文件后重启NapCat`);
this.save(); this.save();
return this; return this;
} }
const data = fs.readFileSync(ob11ConfigPath, 'utf-8'); const data = fs.readFileSync(ob11ConfigPath, 'utf-8');
try { try {
const jsonData = JSON.parse(data); const jsonData = JSON.parse(data);
console.log('get config', jsonData); logDebug('Onebot 11配置文件已加载', jsonData);
Object.assign(this, jsonData); Object.assign(this, jsonData);
// eslint-disable-next-line // eslint-disable-next-line
} catch (e: any) { } catch (e: any) {
if (e instanceof SyntaxError) { if (e instanceof SyntaxError) {
console.error(`配置文件 ${ob11ConfigPath} 格式错误,请检查配置文件:`, e.message); logError(`配置文件 ${ob11ConfigPath} 格式错误,请检查配置文件:`, e.message);
}else{ }else{
console.error(`读取配置文件 ${ob11ConfigPath} 时发生错误:`, e.message); logError(`读取配置文件 ${ob11ConfigPath} 时发生错误:`, e.message);
} }
} }
return this; return this;

View File

@ -33,7 +33,7 @@ import { OB11GroupNoticeEvent } from './event/notice/OB11GroupNoticeEvent';
import { OB11FriendAddNoticeEvent } from './event/notice/OB11FriendAddNoticeEvent'; import { OB11FriendAddNoticeEvent } from './event/notice/OB11FriendAddNoticeEvent';
import { calcQQLevel } from '../common/utils/qqlevel'; 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 { sleep } from '../common/utils/helper';
import { OB11GroupTitleEvent } from './event/notice/OB11GroupTitleEvent'; import { OB11GroupTitleEvent } from './event/notice/OB11GroupTitleEvent';
import { OB11GroupCardEvent } from './event/notice/OB11GroupCardEvent'; import { OB11GroupCardEvent } from './event/notice/OB11GroupCardEvent';
@ -132,7 +132,7 @@ export class OB11Constructor {
continue; continue;
} }
} catch (e: any) { } catch (e: any) {
log('获取不到引用的消息', e.stack, element.replyElement.replayMsgSeq); logError('获取不到引用的消息', e.stack, element.replyElement.replayMsgSeq);
} }
} else if (element.picElement) { } else if (element.picElement) {
@ -259,7 +259,7 @@ export class OB11Constructor {
if (groupElement) { if (groupElement) {
// log("收到群提示消息", groupElement) // log("收到群提示消息", groupElement)
if (groupElement.type == TipGroupElementType.memberIncrease) { if (groupElement.type == TipGroupElementType.memberIncrease) {
log('收到群成员增加消息', groupElement); logDebug('收到群成员增加消息', groupElement);
await sleep(1000); await sleep(1000);
const member = await getGroupMember(msg.peerUid, groupElement.memberUid); const member = await getGroupMember(msg.peerUid, groupElement.memberUid);
const memberUin = member?.uin; const memberUin = member?.uin;
@ -276,7 +276,7 @@ export class OB11Constructor {
return event; return event;
} }
} else if (groupElement.type === TipGroupElementType.ban) { } else if (groupElement.type === TipGroupElementType.ban) {
log('收到群群员禁言提示', groupElement); logDebug('收到群群员禁言提示', groupElement);
const memberUid = groupElement.shutUp!.member.uid; const memberUid = groupElement.shutUp!.member.uid;
const adminUid = groupElement.shutUp!.admin.uid; const adminUid = groupElement.shutUp!.admin.uid;
let memberUin: string = ''; let memberUin: string = '';
@ -298,7 +298,7 @@ export class OB11Constructor {
return event; return event;
} }
} else if (groupElement.type == TipGroupElementType.kicked) { } else if (groupElement.type == TipGroupElementType.kicked) {
log(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement); logDebug(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement);
deleteGroup(msg.peerUid); deleteGroup(msg.peerUid);
NTQQGroupApi.quitGroup(msg.peerUid).then(); NTQQGroupApi.quitGroup(msg.peerUid).then();
try { try {
@ -321,7 +321,7 @@ export class OB11Constructor {
if (grayTipElement) { if (grayTipElement) {
if (grayTipElement.subElementType == GrayTipElementSubType.INVITE_NEW_MEMBER) { if (grayTipElement.subElementType == GrayTipElementSubType.INVITE_NEW_MEMBER) {
log('收到新人被邀请进群消息', grayTipElement); logDebug('收到新人被邀请进群消息', grayTipElement);
const xmlElement = grayTipElement.xmlElement; const xmlElement = grayTipElement.xmlElement;
if (xmlElement?.content) { if (xmlElement?.content) {
const regex = /jp="(\d+)"/g; const regex = /jp="(\d+)"/g;
@ -366,7 +366,7 @@ export class OB11Constructor {
* */ * */
const memberUin = json.items[1].param[0]; const memberUin = json.items[1].param[0];
const title = json.items[3].txt; const title = json.items[3].txt;
log('收到群成员新头衔消息', json); logDebug('收到群成员新头衔消息', json);
return new OB11GroupTitleEvent(parseInt(msg.peerUid), parseInt(memberUin), title); return new OB11GroupTitleEvent(parseInt(msg.peerUid), parseInt(memberUin), title);
} }
} }
@ -451,7 +451,7 @@ export class OB11Constructor {
} }
static stranger(user: User): OB11User { static stranger(user: User): OB11User {
log('construct ob11 stranger', user); logDebug('construct ob11 stranger', user);
return { return {
...user, ...user,
user_id: parseInt(user.uin), user_id: parseInt(user.uin),
@ -465,7 +465,7 @@ export class OB11Constructor {
} }
static groupMembers(group: Group): OB11GroupMember[] { 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)); return Array.from(groupMembers.get(group.groupCode)?.values() || []).map(m => OB11Constructor.groupMember(group.groupCode, m));
} }

View File

@ -20,7 +20,7 @@ import { dbUtil } from '@/common/utils/db';
import { BuddyListener, GroupListener, NodeIKernelBuddyListener } from '../core/src/listeners'; import { BuddyListener, GroupListener, NodeIKernelBuddyListener } from '../core/src/listeners';
import { OB11FriendRequestEvent } from '@/onebot11/event/request/OB11FriendRequest'; import { OB11FriendRequestEvent } from '@/onebot11/event/request/OB11FriendRequest';
import { NTQQGroupApi, NTQQUserApi } from '../core/src/apis'; 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 { OB11GroupRequestEvent } from '@/onebot11/event/request/OB11GroupRequest';
import { OB11GroupAdminNoticeEvent } from '@/onebot11/event/notice/OB11GroupAdminNoticeEvent'; import { OB11GroupAdminNoticeEvent } from '@/onebot11/event/notice/OB11GroupAdminNoticeEvent';
import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot11/event/notice/OB11GroupDecreaseEvent'; import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot11/event/notice/OB11GroupDecreaseEvent';
@ -38,7 +38,7 @@ export class NapCatOnebot11 {
} }
public onReady() { public onReady() {
console.log('ob11 ready'); logDebug('ob11 ready');
ob11Config.read(); ob11Config.read();
if (ob11Config.enableHttp) { if (ob11Config.enableHttp) {
ob11HTTPServer.start(ob11Config.httpPort); ob11HTTPServer.start(ob11Config.httpPort);
@ -95,7 +95,7 @@ export class NapCatOnebot11 {
} }
}; };
napCatCore.addListener(msgListener); napCatCore.addListener(msgListener);
console.log('ob11 msg listener added'); logDebug('ob11 msg listener added');
// BuddyListener // BuddyListener
const buddyListener = new BuddyListener(); const buddyListener = new BuddyListener();
@ -103,13 +103,13 @@ export class NapCatOnebot11 {
this.postFriendRequest(req.buddyReqs).then().catch(log); this.postFriendRequest(req.buddyReqs).then().catch(log);
}); });
napCatCore.addListener(buddyListener); napCatCore.addListener(buddyListener);
console.log('ob11 buddy listener added'); logDebug('ob11 buddy listener added');
// GroupListener // GroupListener
const groupListener = new GroupListener(); const groupListener = new GroupListener();
groupListener.onGroupNotifiesUpdated = (doubt, notifies) => { groupListener.onGroupNotifiesUpdated = (doubt, notifies) => {
// console.log('ob11 onGroupNotifiesUpdated', 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) => { groupListener.onJoinGroupNotify = (...notify) => {
// console.log('ob11 onJoinGroupNotify', notify); // console.log('ob11 onJoinGroupNotify', notify);
@ -120,13 +120,13 @@ export class NapCatOnebot11 {
}; };
napCatCore.addListener(groupListener); napCatCore.addListener(groupListener);
console.log('ob11 group listener added'); logDebug('ob11 group listener added');
} }
async postReceiveMsg(msgList: RawMessage[]) { async postReceiveMsg(msgList: RawMessage[]) {
const { debug, reportSelfMessage } = ob11Config; const { debug, reportSelfMessage } = ob11Config;
for (const message of msgList) { for (const message of msgList) {
// console.log("ob11 收到新消息", message) log('收到新消息', message);
// if (message.senderUin !== selfInfo.uin){ // if (message.senderUin !== selfInfo.uin){
// message.msgShortId = await dbUtil.addMsg(message); // message.msgShortId = await dbUtil.addMsg(message);
// } // }
@ -147,18 +147,18 @@ export class NapCatOnebot11 {
} }
postOB11Event(msg); postOB11Event(msg);
// log("post msg", msg) // log("post msg", msg)
}).catch(e => log('constructMessage error: ', e)); }).catch(e => logError('constructMessage error: ', e));
OB11Constructor.GroupEvent(message).then(groupEvent => { OB11Constructor.GroupEvent(message).then(groupEvent => {
if (groupEvent) { if (groupEvent) {
// log("post group event", groupEvent); // log("post group event", groupEvent);
postOB11Event(groupEvent); postOB11Event(groupEvent);
} }
}).catch(e => log('constructGroupEvent error: ', e)); }).catch(e => logError('constructGroupEvent error: ', e));
OB11Constructor.FriendAddEvent(message).then(friendAddEvent=>{ OB11Constructor.FriendAddEvent(message).then(friendAddEvent=>{
if(friendAddEvent){ if(friendAddEvent){
postOB11Event(friendAddEvent); postOB11Event(friendAddEvent);
} }
}).catch(e => log('constructFriendAddEvent error: ', e)); }).catch(e => logError('constructFriendAddEvent error: ', e));
} }
} }
@ -176,7 +176,7 @@ export class NapCatOnebot11 {
if (existNotify) { if (existNotify) {
continue; continue;
} }
log('收到群通知', notify); logDebug('收到群通知', notify);
groupNotifies[flag] = notify; groupNotifies[flag] = notify;
// let member2: GroupMember; // let member2: GroupMember;
// if (notify.user2.uid) { // if (notify.user2.uid) {
@ -184,22 +184,22 @@ export class NapCatOnebot11 {
// } // }
if ([GroupNotifyTypes.ADMIN_SET, GroupNotifyTypes.ADMIN_UNSET].includes(notify.type)) { if ([GroupNotifyTypes.ADMIN_SET, GroupNotifyTypes.ADMIN_UNSET].includes(notify.type)) {
const member1 = await getGroupMember(notify.group.groupCode, notify.user1.uid); const member1 = await getGroupMember(notify.group.groupCode, notify.user1.uid);
log('有管理员变动通知'); logDebug('有管理员变动通知');
// refreshGroupMembers(notify.group.groupCode).then(); // refreshGroupMembers(notify.group.groupCode).then();
const groupAdminNoticeEvent = new OB11GroupAdminNoticeEvent(); const groupAdminNoticeEvent = new OB11GroupAdminNoticeEvent();
groupAdminNoticeEvent.group_id = parseInt(notify.group.groupCode); groupAdminNoticeEvent.group_id = parseInt(notify.group.groupCode);
log('开始获取变动的管理员'); logDebug('开始获取变动的管理员');
if (member1) { if (member1) {
log('变动管理员获取成功'); logDebug('变动管理员获取成功');
groupAdminNoticeEvent.user_id = parseInt(member1.uin); groupAdminNoticeEvent.user_id = parseInt(member1.uin);
groupAdminNoticeEvent.sub_type = notify.type == GroupNotifyTypes.ADMIN_UNSET ? 'unset' : 'set'; groupAdminNoticeEvent.sub_type = notify.type == GroupNotifyTypes.ADMIN_UNSET ? 'unset' : 'set';
// member1.role = notify.type == GroupNotifyTypes.ADMIN_SET ? GroupMemberRole.admin : GroupMemberRole.normal; // member1.role = notify.type == GroupNotifyTypes.ADMIN_SET ? GroupMemberRole.admin : GroupMemberRole.normal;
postOB11Event(groupAdminNoticeEvent, true); postOB11Event(groupAdminNoticeEvent, true);
} else { } 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) { } else if (notify.type == GroupNotifyTypes.MEMBER_EXIT || notify.type == GroupNotifyTypes.KICK_MEMBER) {
log('有成员退出通知', notify); logDebug('有成员退出通知', notify);
try { try {
const member1 = await NTQQUserApi.getUserDetailInfo(notify.user1.uid); const member1 = await NTQQUserApi.getUserDetailInfo(notify.user1.uid);
let operatorId = member1.uin; 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); const groupDecreaseEvent = new OB11GroupDecreaseEvent(parseInt(notify.group.groupCode), parseInt(member1.uin), parseInt(operatorId), subType);
postOB11Event(groupDecreaseEvent, true); postOB11Event(groupDecreaseEvent, true);
} catch (e: any) { } catch (e: any) {
log('获取群通知的成员信息失败', notify, e.stack.toString()); logError('获取群通知的成员信息失败', notify, e.stack.toString());
} }
} else if ([GroupNotifyTypes.JOIN_REQUEST].includes(notify.type)) { } else if ([GroupNotifyTypes.JOIN_REQUEST].includes(notify.type)) {
log('有加群请求'); logDebug('有加群请求');
const groupRequestEvent = new OB11GroupRequestEvent(); const groupRequestEvent = new OB11GroupRequestEvent();
groupRequestEvent.group_id = parseInt(notify.group.groupCode); groupRequestEvent.group_id = parseInt(notify.group.groupCode);
let requestQQ = ''; let requestQQ = '';
try { try {
requestQQ = (await NTQQUserApi.getUserDetailInfo(notify.user1.uid)).uin; requestQQ = (await NTQQUserApi.getUserDetailInfo(notify.user1.uid)).uin;
} catch (e) { } catch (e) {
log('获取加群人QQ号失败', e); logError('获取加群人QQ号失败', e);
} }
groupRequestEvent.user_id = parseInt(requestQQ) || 0; groupRequestEvent.user_id = parseInt(requestQQ) || 0;
groupRequestEvent.sub_type = 'add'; groupRequestEvent.sub_type = 'add';
@ -233,7 +233,7 @@ export class NapCatOnebot11 {
groupRequestEvent.flag = flag; groupRequestEvent.flag = flag;
postOB11Event(groupRequestEvent); postOB11Event(groupRequestEvent);
} else if (notify.type == GroupNotifyTypes.INVITE_ME) { } else if (notify.type == GroupNotifyTypes.INVITE_ME) {
log('收到邀请我加群通知'); logDebug('收到邀请我加群通知');
const groupInviteEvent = new OB11GroupRequestEvent(); const groupInviteEvent = new OB11GroupRequestEvent();
groupInviteEvent.group_id = parseInt(notify.group.groupCode); groupInviteEvent.group_id = parseInt(notify.group.groupCode);
let user_id = (await getFriend(notify.user2.uid))?.uin; let user_id = (await getFriend(notify.user2.uid))?.uin;
@ -246,7 +246,7 @@ export class NapCatOnebot11 {
postOB11Event(groupInviteEvent); postOB11Event(groupInviteEvent);
} }
} catch (e: any) { } 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); const requester = await NTQQUserApi.getUserDetailInfo(req.friendUid);
friendRequestEvent.user_id = parseInt(requester.uin); friendRequestEvent.user_id = parseInt(requester.uin);
} catch (e) { } catch (e) {
log('获取加好友者QQ号失败', e); logDebug('获取加好友者QQ号失败', e);
} }
friendRequestEvent.flag = flag; friendRequestEvent.flag = flag;
friendRequestEvent.comment = req.extWords; friendRequestEvent.comment = req.extWords;

View File

@ -3,7 +3,7 @@ import { OB11BaseMetaEvent } from '../event/meta/OB11BaseMetaEvent';
import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent'; import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent';
import { WebSocket as WebSocketClass } from 'ws'; import { WebSocket as WebSocketClass } from 'ws';
import { wsReply } from './ws/reply'; 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 { ob11Config } from '@/onebot11/config';
import crypto from 'crypto'; import crypto from 'crypto';
import { ChatType, Group, GroupRequestOperateTypes, Peer } from '../../core/src/entities'; import { ChatType, Group, GroupRequestOperateTypes, Peer } from '../../core/src/entities';
@ -95,14 +95,14 @@ export function postOB11Event(msg: PostEventType, reportSelf = false, postWs= tr
headers, headers,
body: msgStr body: msgStr
}).then(async (res) => { }).then(async (res) => {
log(`新消息事件HTTP上报成功: ${host} `, msgStr); logDebug(`新消息事件HTTP上报成功: ${host} `, msgStr);
// todo: 处理不够优雅应该使用高级泛型进行QuickAction类型识别 // todo: 处理不够优雅应该使用高级泛型进行QuickAction类型识别
let resJson: QuickAction; let resJson: QuickAction;
try { try {
resJson = await res.json(); resJson = await res.json();
log('新消息事件HTTP上报返回快速操作: ', JSON.stringify(resJson)); logDebug('新消息事件HTTP上报返回快速操作: ', JSON.stringify(resJson));
} catch (e) { } catch (e) {
log('新消息事件HTTP上报没有返回快速操作不需要处理'); logDebug('新消息事件HTTP上报没有返回快速操作不需要处理');
return; return;
} }
if (msg.post_type === 'message') { if (msg.post_type === 'message') {
@ -177,7 +177,7 @@ export function postOB11Event(msg: PostEventType, reportSelf = false, postWs= tr
} }
} }
}, (err: any) => { }, (err: any) => {
log(`新消息事件HTTP上报失败: ${host} `, err, msg); logError(`新消息事件HTTP上报失败: ${host} `, err, msg);
}); });
} }
} }

View File

@ -7,7 +7,7 @@ import { postWsEvent, registerWsEventSender, unregisterWsEventSender } from '../
import { wsReply } from './reply'; import { wsReply } from './reply';
import { WebSocket as WebSocketClass } from 'ws'; import { WebSocket as WebSocketClass } from 'ws';
import { OB11HeartbeatEvent } from '../../event/meta/OB11HeartbeatEvent'; 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 { ob11Config } from '@/onebot11/config';
import { napCatCore } from '@/core'; import { napCatCore } from '@/core';
import { selfInfo } from '@/common/data'; import { selfInfo } from '@/common/data';
@ -40,7 +40,7 @@ export class ReverseWebsocket {
try { try {
receiveData = JSON.parse(msg.toString()); receiveData = JSON.parse(msg.toString());
echo = receiveData.echo; echo = receiveData.echo;
log('收到反向Websocket消息', receiveData); logDebug('收到反向Websocket消息', receiveData);
} catch (e) { } catch (e) {
return wsReply(this.websocket!, OB11Response.error('json解析失败请检查数据格式', 1400, echo)); return wsReply(this.websocket!, OB11Response.error('json解析失败请检查数据格式', 1400, echo));
} }
@ -57,7 +57,7 @@ export class ReverseWebsocket {
} }
public onclose = () => { public onclose = () => {
log('反向ws断开', this.url); logDebug('反向ws断开', this.url);
unregisterWsEventSender(this.websocket!); unregisterWsEventSender(this.websocket!);
if (this.running) { if (this.running) {
this.reconnect(); this.reconnect();
@ -89,11 +89,11 @@ export class ReverseWebsocket {
} }
}); });
registerWsEventSender(this.websocket); 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', () => { this.websocket.on('open', () => {
log('Connected to the websocket server: ' + this.url); logDebug('Connected to the websocket server: ' + this.url);
this.onopen(); this.onopen();
}); });
@ -108,7 +108,7 @@ export class ReverseWebsocket {
}, heartInterval); // 心跳包 }, heartInterval); // 心跳包
this.websocket.on('close', () => { this.websocket.on('close', () => {
clearInterval(wsClientInterval); clearInterval(wsClientInterval);
log('The websocket connection: ' + this.url + ' closed, trying reconnecting...'); logDebug('The websocket connection: ' + this.url + ' closed, trying reconnecting...');
this.onclose(); this.onclose();
}); });
} }
@ -122,7 +122,7 @@ class OB11ReverseWebsockets {
try { try {
rwsList.push(new ReverseWebsocket(url)); rwsList.push(new ReverseWebsocket(url));
} catch (e: any) { } catch (e: any) {
log(e.stack); logError(e.stack);
} }
}).then(); }).then();
} }

View File

@ -10,7 +10,7 @@ import { WebsocketServerBase } from '@/common/server/websocket';
import { IncomingMessage } from 'node:http'; import { IncomingMessage } from 'node:http';
import { wsReply } from './reply'; import { wsReply } from './reply';
import { napCatCore } from '@/core'; import { napCatCore } from '@/core';
import { log } from '../../../common/utils/log'; import { log, logDebug, logError } from '../../../common/utils/log';
import { ob11Config } from '@/onebot11/config'; import { ob11Config } from '@/onebot11/config';
import { selfInfo } from '@/common/data'; import { selfInfo } from '@/common/data';
@ -58,19 +58,19 @@ class OB11WebsocketServer extends WebsocketServerBase {
if (url == '/event' || url == '/event/' || url == '/') { if (url == '/event' || url == '/event/' || url == '/') {
registerWsEventSender(wsClient); registerWsEventSender(wsClient);
log('event上报ws客户端已连接'); logDebug('event上报ws客户端已连接');
try { try {
wsReply(wsClient, new OB11LifeCycleEvent(LifeCycleSubType.CONNECT)); wsReply(wsClient, new OB11LifeCycleEvent(LifeCycleSubType.CONNECT));
} catch (e) { } catch (e) {
log('发送生命周期失败', e); logError('发送生命周期失败', e);
} }
const { heartInterval } = ob11Config; const { heartInterval } = ob11Config;
const wsClientInterval = setInterval(() => { const wsClientInterval = setInterval(() => {
postWsEvent(new OB11HeartbeatEvent(!!selfInfo.online, true, heartInterval)); postWsEvent(new OB11HeartbeatEvent(!!selfInfo.online, true, heartInterval));
}, heartInterval); // 心跳包 }, heartInterval); // 心跳包
wsClient.on('close', () => { wsClient.on('close', () => {
log('event上报ws客户端已断开'); logError('event上报ws客户端已断开');
clearInterval(wsClientInterval); clearInterval(wsClientInterval);
unregisterWsEventSender(wsClient); unregisterWsEventSender(wsClient);
}); });

View File

@ -1,7 +1,7 @@
import { WebSocket as WebSocketClass } from 'ws'; import { WebSocket as WebSocketClass } from 'ws';
import { OB11Response } from '../../action/OB11Response'; import { OB11Response } from '../../action/OB11Response';
import { PostEventType } from '../postOB11Event'; import { PostEventType } from '../postOB11Event';
import { log } from '../../../common/utils/log'; import { log, logDebug, logError } from '../../../common/utils/log';
import { isNull } from '../../../common/utils/helper'; import { isNull } from '../../../common/utils/helper';
@ -12,8 +12,8 @@ export function wsReply(wsClient: WebSocketClass, data: OB11Response | PostEvent
delete packet['echo']; delete packet['echo'];
} }
wsClient.send(JSON.stringify(packet)); wsClient.send(JSON.stringify(packet));
log('ws 消息上报', wsClient.url || '', data); logDebug('ws 消息上报', wsClient.url || '', data);
} catch (e: any) { } catch (e: any) {
log('websocket 回复失败', e.stack, data); logError('websocket 回复失败', e.stack, data);
} }
} }

View File

@ -64,7 +64,7 @@ const baseConfig = (mode: string = 'development') => defineConfig({
target: 'esnext', target: 'esnext',
minify: mode === 'production' ? 'esbuild' : false, minify: mode === 'production' ? 'esbuild' : false,
lib: { lib: {
entry: 'src/onebot11/index.ts', entry: 'src/index.ts',
formats: ['cjs'], formats: ['cjs'],
fileName: () => 'napcat.cjs', fileName: () => 'napcat.cjs',
}, },