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) {
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[]) {
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 { 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 <type>', '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);
}

View File

@ -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<PayloadType, ReturnDataType> {
actionName: ActionName;
actionName!: ActionName;
protected async check(payload: PayloadType): Promise<BaseCheckResult> {
return {
@ -21,8 +21,8 @@ class BaseAction<PayloadType, ReturnDataType> {
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<PayloadType, ReturnDataType> {
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<PayloadType, ReturnDataType> {
}
}
export default BaseAction;
export default BaseAction;

View File

@ -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<Payload, any> {
actionName = ActionName.Debug;
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,
// NTQQFileCacheApi,
NTQQWindowApi];
for (const ntqqApiClass of ntqqApi) {
log('ntqqApiClass', ntqqApiClass);
logDebug('ntqqApiClass', ntqqApiClass);
const method = (<any>ntqqApiClass)[payload.method];
if (method) {
const result = method(...payload.args);

View File

@ -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<GetFilePayload, GetFileResponse> {
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) {

View File

@ -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<Payload, Response> {
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);

View File

@ -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<Payload, Resp
chatType: ChatType.group,
peerUid: group.groupCode
}, 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);

View File

@ -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<OB11User> {
const user_id = payload.user_id.toString();
log('uidMaps', uid2UinMap);
logDebug('uidMaps', uid2UinMap);
const uid = getUidByUin(user_id);
if (!uid) {
throw new Error('查无此人');

View File

@ -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<PayloadType, OB11GroupMember> {
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 {

View File

@ -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<Payload, any> {
try {
await NTQQGroupApi.quitGroup(payload.group_id.toString());
} catch (e) {
log('退群失败', e);
logError('退群失败', e);
throw e;
}
}

View File

@ -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<OB11PostSendMsg, ReturnDataType> {
}
private async cloneMsg(msg: RawMessage): Promise<RawMessage | undefined> {
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<OB11PostSendMsg, ReturnDataType> {
}
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<OB11PostSendMsg, ReturnDataType> {
await sleep(500);
return nodeMsg;
} catch (e) {
log(e, '克隆转发消息失败,将忽略本条消息', msg);
logError(e, '克隆转发消息失败,将忽略本条消息', msg);
}
}
@ -440,7 +440,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
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<OB11PostSendMsg, ReturnDataType> {
} 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<OB11PostSendMsg, ReturnDataType> {
}
}
}
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<OB11PostSendMsg, ReturnDataType> {
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;
}
}

View File

@ -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<Payload, null> {
actionName = ActionName.SendLike;
protected async _handle(payload: Payload): Promise<null> {
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<Payload, null> {
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);
}

View File

@ -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;

View File

@ -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));
}

View File

@ -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;

View File

@ -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);
});
}
}

View File

@ -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();
}

View File

@ -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);
});

View File

@ -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);
}
}

View File

@ -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',
},