refactor: log

This commit is contained in:
linyuchen 2024-04-27 11:45:24 +08:00
parent f2b2ea61a1
commit 033a7bffb3
9 changed files with 113 additions and 67 deletions

View File

@ -49,7 +49,7 @@ export async function getFriend(uinOrUid: string): Promise<Friend | undefined> {
} }
} }
export async function getGroup(qq: string): Promise<Group | undefined> { export async function getGroup(qq: string | number): Promise<Group | undefined> {
const group = groups.get(qq.toString()); const group = groups.get(qq.toString());
return group; return group;
} }

View File

@ -0,0 +1,53 @@
import path from 'node:path';
import fs from 'node:fs';
import { logDebug, logError } from '@/common/utils/log';
const configDir = path.resolve(__dirname, 'config');
fs.mkdirSync(configDir, { recursive: true });
export class ConfigBase<T>{
constructor() {
}
getConfigPath(): string {
throw new Error('Method not implemented.');
}
read() {
const configPath = this.getConfigPath();
if (!fs.existsSync(configPath)) {
try{
fs.writeFileSync(configPath, JSON.stringify(this, null, 2));
logDebug(`配置文件${configPath}已创建, 修改此文件后重启NapCat生效`);
}
catch (e: any) {
logError(`创建配置文件 ${configPath} 时发生错误:`, e.message);
}
return this;
}
try {
const data = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
logDebug(`配置文件${configPath}已加载`, data);
Object.assign(this, data);
return this;
} catch (e: any) {
if (e instanceof SyntaxError) {
logError(`配置文件 ${configPath} 格式错误,请检查配置文件:`, e.message);
} else {
logError(`读取配置文件 ${configPath} 时发生错误:`, e.message);
}
return this;
}
}
save(config: T) {
const configPath = this.getConfigPath();
try {
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
} catch (e: any) {
logError(`保存配置文件 ${configPath} 时发生错误:`, e.message);
}
}
}

View File

@ -1,7 +1,7 @@
import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElement } from '../../core/src/entities'; import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElement } from '../../core/src/entities';
import sqlite3 from 'sqlite3'; import sqlite3 from 'sqlite3';
import { log } from '@/common/utils/log'; import { log, logDebug, logError } from '@/common/utils/log';
type DBMsg = { type DBMsg = {
id: number, id: number,
@ -33,7 +33,7 @@ class DBUtilBase {
} }
this.db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => { this.db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
if (err) { if (err) {
log('Could not connect to database', err); logError('Could not connect to database', err);
return; return;
} }
this.createTable(); this.createTable();
@ -56,7 +56,7 @@ class DBUtil extends DBUtilBase {
super(); super();
const interval = 1000 * 60 * 10; // 10分钟清理一次缓存 const interval = 1000 * 60 * 10; // 10分钟清理一次缓存
setInterval(() => { setInterval(() => {
log('清理消息缓存'); logDebug('清理消息缓存');
this.msgCache.forEach((msg, key) => { this.msgCache.forEach((msg, key) => {
if ((Date.now() - parseInt(msg.msgTime) * 1000) > interval) { if ((Date.now() - parseInt(msg.msgTime) * 1000) > interval) {
this.msgCache.delete(key); this.msgCache.delete(key);
@ -78,7 +78,7 @@ class DBUtil extends DBUtilBase {
)`; )`;
this.db!.run(createTableSQL, function (err) { this.db!.run(createTableSQL, function (err) {
if (err) { if (err) {
log('Could not create table', err); logError('Could not create table', err);
} }
}); });
@ -98,7 +98,7 @@ class DBUtil extends DBUtilBase {
)`; )`;
this.db!.run(createFileTableSQL, function (err) { this.db!.run(createFileTableSQL, function (err) {
if (err) { if (err) {
log('Could not create table files', err); logError('Could not create table files', err);
} }
}); });
@ -111,7 +111,7 @@ class DBUtil extends DBUtilBase {
)`; )`;
this.db!.run(createTempUinTableSQL, function (err) { this.db!.run(createTempUinTableSQL, function (err) {
if (err) { if (err) {
log('Could not create table temp_uins', err); logError('Could not create table temp_uins', err);
} }
}); });
} }
@ -122,7 +122,7 @@ class DBUtil extends DBUtilBase {
stmt.get(...params, (err: any, row: DBMsg) => { stmt.get(...params, (err: any, row: DBMsg) => {
// log("getMsg", row, err); // log("getMsg", row, err);
if (err) { if (err) {
log('Could not get msg by short id', err); logError('Could not get msg by short id', err);
resolve(null); resolve(null);
} }
try { try {
@ -154,10 +154,10 @@ class DBUtil extends DBUtilBase {
} }
async addMsg(msg: RawMessage, update = true): Promise<number> { async addMsg(msg: RawMessage, update = true): Promise<number> {
log('正在记录消息到数据库', msg.msgId); logDebug('正在记录消息到数据库', msg.msgId);
const existMsg = await this.getMsgByLongId(msg.msgId); const existMsg = await this.getMsgByLongId(msg.msgId);
if (existMsg) { if (existMsg) {
// log('消息已存在,更新数据库', msg.msgId); // logDebug('消息已存在,更新数据库', msg.msgId);
if (update) this.updateMsg(msg).then(); if (update) this.updateMsg(msg).then();
return existMsg.id!; return existMsg.id!;
} }
@ -170,19 +170,19 @@ class DBUtil extends DBUtilBase {
stmt.run(msg.msgId, msg.msgSeq, msg.peerUid, JSON.stringify(msg), function (err: any) { stmt.run(msg.msgId, msg.msgSeq, msg.peerUid, JSON.stringify(msg), function (err: any) {
if (err) { if (err) {
if (err.errno === 19) { if (err.errno === 19) {
// log('消息已存在,更新数据库', msg.msgId); // logDebug('消息已存在,更新数据库', msg.msgId);
dbInstance.getMsgByLongId(msg.msgId).then((msg: RawMessage | null) => { dbInstance.getMsgByLongId(msg.msgId).then((msg: RawMessage | null) => {
if (msg) { if (msg) {
dbInstance.msgCache.set(msg.msgId, msg); dbInstance.msgCache.set(msg.msgId, msg);
// log('获取消息短id成功', msg.id); // logDebug('获取消息短id成功', msg.id);
resolve(msg.id!); resolve(msg.id!);
} else { } else {
log('db could not get msg by long id', err); logError('db could not get msg by long id', err);
resolve(-1); resolve(-1);
} }
}); });
} else { } else {
log('db could not add msg', err); logError('db could not add msg', err);
resolve(-1); resolve(-1);
} }
} else { } else {
@ -210,7 +210,7 @@ class DBUtil extends DBUtilBase {
try { try {
stmt.run(JSON.stringify(msg), msg.msgSeq, msg.msgId); stmt.run(JSON.stringify(msg), msg.msgSeq, msg.msgId);
} catch (e) { } catch (e) {
log('updateMsg db error', e); logError('updateMsg db error', e);
} }
} }
@ -224,7 +224,7 @@ class DBUtil extends DBUtilBase {
file.msgId, file.msgId,
function (err: any) { function (err: any) {
if (err) { if (err) {
log('db could not add file', err); logError('db could not add file', err);
reject(err); reject(err);
} }
resolve(null); resolve(null);
@ -237,7 +237,7 @@ class DBUtil extends DBUtilBase {
return new Promise<DBFile | null>((resolve, reject) => { return new Promise<DBFile | null>((resolve, reject) => {
stmt.get(...params, (err: any, row: DBFile & { element: string }) => { stmt.get(...params, (err: any, row: DBFile & { element: string }) => {
if (err) { if (err) {
log('db could not get file cache', err); logError('db could not get file cache', err);
reject(err); reject(err);
} }
if (row) { if (row) {
@ -262,7 +262,7 @@ class DBUtil extends DBUtilBase {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
stmt.run(file.path, file.url,file.uuid, function (err: any) { stmt.run(file.path, file.url,file.uuid, function (err: any) {
if (err) { if (err) {
log('db could not update file cache', err); logError('db could not update file cache', err);
reject(err); reject(err);
} }
resolve(null); resolve(null);
@ -276,7 +276,7 @@ class DBUtil extends DBUtilBase {
return new Promise<Record<string, string>>((resolve, reject) => { return new Promise<Record<string, string>>((resolve, reject) => {
this.db!.all(stmt, (err, rows: { uin: string, uid: string }[]) => { this.db!.all(stmt, (err, rows: { uin: string, uid: string }[]) => {
if (err) { if (err) {
log('db could not get temp uin map', err); logError('db could not get temp uin map', err);
reject(err); reject(err);
} }
const map: Record<string, string> = {}; const map: Record<string, string> = {};
@ -294,7 +294,7 @@ class DBUtil extends DBUtilBase {
return new Promise<string>((resolve, reject) => { return new Promise<string>((resolve, reject) => {
this.db!.get(stmt, [uid], (err, row: { uin: string, uid: string }) => { this.db!.get(stmt, [uid], (err, row: { uin: string, uid: string }) => {
if (err) { if (err) {
log('db could not get temp uin map', err); logError('db could not get temp uin map', err);
reject(err); reject(err);
} }
resolve(row?.uid); resolve(row?.uid);
@ -309,7 +309,7 @@ class DBUtil extends DBUtilBase {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
stmt.run(uin, uid, function (err: any) { stmt.run(uin, uid, function (err: any) {
if (err) { if (err) {
log('db could not add temp uin', err); logError('db could not add temp uin', err);
reject(err); reject(err);
} }
resolve(null); resolve(null);

View File

@ -25,9 +25,9 @@ function genLogConfig(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
} }
}, },
categories: { categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'info' }, // 默认情况下同时输出到文件和控制台 default: { appenders: ['fileAppender', 'consoleAppender'], level: 'debug' }, // 默认情况下同时输出到文件和控制台
file: { appenders: ['fileAppender'], level: fileLogLevel }, file: { appenders: ['fileAppender'], level: fileLogLevel },
console: { appenders: ['consoleAppender'], level: fileLogLevel } console: { appenders: ['consoleAppender'], level: consoleLogLevel }
} }
}; };
} }
@ -59,7 +59,7 @@ function formatMsg(msg: any[]){
} }
logMsg += msgItem + ' '; logMsg += msgItem + ' ';
} }
return logMsg; return '\n' + logMsg + '\n';
} }
function _log(level: LogLevel, ...args: any[]){ function _log(level: LogLevel, ...args: any[]){

@ -1 +1 @@
Subproject commit 4590fe89ddf124c73f513d738ccc202e1df430e7 Subproject commit 703cf03e708c7ab011c6a02f08a2a73329c2969f

View File

@ -14,7 +14,6 @@ program
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;
@ -56,7 +55,7 @@ const quickLoginQQ = cmdOptions.qq;
// napCatCore.qrLogin().then().catch(console.error); // napCatCore.qrLogin().then().catch(console.error);
// }); // });
if (quickLoginQQ) { if (quickLoginQQ) {
console.log('quick login', quickLoginQQ); log('正在快速登录 ', quickLoginQQ);
napCatCore.quickLogin(quickLoginQQ).then(res=>{ napCatCore.quickLogin(quickLoginQQ).then(res=>{
// log('快速登录结果:', res); // log('快速登录结果:', res);
}).catch((e) => { }).catch((e) => {

View File

@ -2,6 +2,7 @@ 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'; import { logDebug, logError } from '@/common/utils/log';
import { ConfigBase } from '@/common/utils/ConfigBase';
export interface OB11Config { export interface OB11Config {
httpPort: number; httpPort: number;
@ -29,7 +30,7 @@ export interface OB11Config {
const ob11ConfigDir = path.resolve(__dirname, 'config'); const ob11ConfigDir = path.resolve(__dirname, 'config');
fs.mkdirSync(ob11ConfigDir, { recursive: true }); fs.mkdirSync(ob11ConfigDir, { recursive: true });
class Config implements OB11Config { class Config extends ConfigBase<OB11Config> implements OB11Config {
httpPort: number = 3000; httpPort: number = 3000;
httpPostUrls: string[] = []; httpPostUrls: string[] = [];
httpSecret = ''; httpSecret = '';
@ -47,42 +48,9 @@ class Config implements OB11Config {
heartInterval = 30000; heartInterval = 30000;
token = ''; token = '';
constructor() {
}
getConfigPath() { getConfigPath() {
return path.join(ob11ConfigDir, `onebot11_${selfInfo.uin}.json`); return path.join(ob11ConfigDir, `onebot11_${selfInfo.uin}.json`);
} }
read() {
const ob11ConfigPath = this.getConfigPath();
if (!fs.existsSync(ob11ConfigPath)) {
logError(`onebot11配置文件 ${ob11ConfigPath} 不存在, 现已创建请修改配置文件后重启NapCat`);
this.save();
return this;
}
const data = fs.readFileSync(ob11ConfigPath, 'utf-8');
try {
const jsonData = JSON.parse(data);
logDebug('Onebot 11配置文件已加载', jsonData);
Object.assign(this, jsonData);
// eslint-disable-next-line
} catch (e: any) {
if (e instanceof SyntaxError) {
logError(`配置文件 ${ob11ConfigPath} 格式错误,请检查配置文件:`, e.message);
}else{
logError(`读取配置文件 ${ob11ConfigPath} 时发生错误:`, e.message);
}
}
return this;
}
save(newConfig: OB11Config | null = null) {
if (newConfig) {
Object.assign(this, newConfig);
}
fs.writeFileSync(this.getConfigPath(), JSON.stringify(this, null, 4));
}
} }
export const ob11Config = new Config(); export const ob11Config = new Config();

13
src/onebot11/log.ts Normal file
View File

@ -0,0 +1,13 @@
import { OB11Message } from '@/onebot11/types';
import { log } from '@/common/utils/log';
import { getGroup } from '@/common/data';
export async function logMessage(ob11Message: OB11Message){
let prefix = '';
if (ob11Message.message_type === 'group') {
const group = await getGroup(ob11Message.group_id!);
prefix = `群[${group?.groupName}(${ob11Message.group_id})] `;
}
const msgString = `${prefix}${ob11Message.sender.nickname}(${ob11Message.sender.user_id}): ${ob11Message.raw_message}`;
log(msgString);
}

View File

@ -26,6 +26,7 @@ import { OB11GroupAdminNoticeEvent } from '@/onebot11/event/notice/OB11GroupAdmi
import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot11/event/notice/OB11GroupDecreaseEvent'; import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot11/event/notice/OB11GroupDecreaseEvent';
import { OB11FriendRecallNoticeEvent } from '@/onebot11/event/notice/OB11FriendRecallNoticeEvent'; import { OB11FriendRecallNoticeEvent } from '@/onebot11/event/notice/OB11FriendRecallNoticeEvent';
import { OB11GroupRecallNoticeEvent } from '@/onebot11/event/notice/OB11GroupRecallNoticeEvent'; import { OB11GroupRecallNoticeEvent } from '@/onebot11/event/notice/OB11GroupRecallNoticeEvent';
import { logMessage } from '@/onebot11/log';
export class NapCatOnebot11 { export class NapCatOnebot11 {
@ -40,6 +41,16 @@ export class NapCatOnebot11 {
public onReady() { public onReady() {
logDebug('ob11 ready'); logDebug('ob11 ready');
ob11Config.read(); ob11Config.read();
const serviceInfo = `
HTTP服务 ${ob11Config.enableHttp ? '已启动' : '未启动'}, 端口: ${ob11Config.httpPort}
HTTP上报服务 ${ob11Config.enableHttpPost ? '已启动' : '未启动'}, 上报地址: ${ob11Config.httpPostUrls}
WebSocket服务 ${ob11Config.enableWs ? '已启动' : '未启动'}, 端口: ${ob11Config.wsPort}
WebSocket反向服务 ${ob11Config.enableWsReverse ? '已启动' : '未启动'}, 反向地址: ${ob11Config.wsReverseUrls}
`;
log(serviceInfo);
NTQQUserApi.getUserDetailInfo(selfInfo.uin).then(user => {
selfInfo.nick = user.nick;
}).catch(logError);
if (ob11Config.enableHttp) { if (ob11Config.enableHttp) {
ob11HTTPServer.start(ob11Config.httpPort); ob11HTTPServer.start(ob11Config.httpPort);
} }
@ -78,19 +89,19 @@ export class NapCatOnebot11 {
new Promise((resolve) => { new Promise((resolve) => {
dbUtil.addMsg(m).then(msgShortId => { dbUtil.addMsg(m).then(msgShortId => {
m.id = msgShortId; m.id = msgShortId;
this.postReceiveMsg([m]).then().catch(log); this.postReceiveMsg([m]).then().catch(logError);
}).catch(log); }).catch(logError);
}).then(); }).then();
} }
}; };
msgListener.onMsgInfoListUpdate = (msgList) => { msgListener.onMsgInfoListUpdate = (msgList) => {
this.postRecallMsg(msgList).then().catch(log); this.postRecallMsg(msgList).then().catch(logError);
}; };
msgListener.onAddSendMsg = (msg) => { msgListener.onAddSendMsg = (msg) => {
if (ob11Config.reportSelfMessage) { if (ob11Config.reportSelfMessage) {
dbUtil.addMsg(msg).then(id => { dbUtil.addMsg(msg).then(id => {
msg.id = id; msg.id = id;
this.postReceiveMsg([msg]).then().catch(log); this.postReceiveMsg([msg]).then().catch(logError);
}); });
} }
}; };
@ -100,7 +111,7 @@ export class NapCatOnebot11 {
// BuddyListener // BuddyListener
const buddyListener = new BuddyListener(); const buddyListener = new BuddyListener();
buddyListener.onBuddyReqChange = ((req) => { buddyListener.onBuddyReqChange = ((req) => {
this.postFriendRequest(req.buddyReqs).then().catch(log); this.postFriendRequest(req.buddyReqs).then().catch(logError);
}); });
napCatCore.addListener(buddyListener); napCatCore.addListener(buddyListener);
logDebug('ob11 buddy listener added'); logDebug('ob11 buddy listener added');
@ -126,11 +137,12 @@ export class NapCatOnebot11 {
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) {
log('收到新消息', message); logDebug('收到新消息', message);
// if (message.senderUin !== selfInfo.uin){ // if (message.senderUin !== selfInfo.uin){
// message.msgShortId = await dbUtil.addMsg(message); // message.msgShortId = await dbUtil.addMsg(message);
// } // }
OB11Constructor.message(message).then((msg) => { OB11Constructor.message(message).then((msg) => {
logMessage(msg).then().catch(logError);
if (debug) { if (debug) {
msg.raw = message; msg.raw = message;
} else { } else {
@ -138,6 +150,7 @@ export class NapCatOnebot11 {
return; return;
} }
} }
logDebug('收到消息: ', msg);
const isSelfMsg = msg.user_id.toString() == selfInfo.uin; const isSelfMsg = msg.user_id.toString() == selfInfo.uin;
if (isSelfMsg && !reportSelfMessage) { if (isSelfMsg && !reportSelfMessage) {
return; return;