mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2024-11-21 09:36:35 +00:00
refactor: log
This commit is contained in:
parent
f2b2ea61a1
commit
033a7bffb3
@ -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());
|
||||
return group;
|
||||
}
|
||||
|
53
src/common/utils/ConfigBase.ts
Normal file
53
src/common/utils/ConfigBase.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElement } from '../../core/src/entities';
|
||||
|
||||
import sqlite3 from 'sqlite3';
|
||||
import { log } from '@/common/utils/log';
|
||||
import { log, logDebug, logError } from '@/common/utils/log';
|
||||
|
||||
type DBMsg = {
|
||||
id: number,
|
||||
@ -33,7 +33,7 @@ class DBUtilBase {
|
||||
}
|
||||
this.db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
|
||||
if (err) {
|
||||
log('Could not connect to database', err);
|
||||
logError('Could not connect to database', err);
|
||||
return;
|
||||
}
|
||||
this.createTable();
|
||||
@ -56,7 +56,7 @@ class DBUtil extends DBUtilBase {
|
||||
super();
|
||||
const interval = 1000 * 60 * 10; // 10分钟清理一次缓存
|
||||
setInterval(() => {
|
||||
log('清理消息缓存');
|
||||
logDebug('清理消息缓存');
|
||||
this.msgCache.forEach((msg, key) => {
|
||||
if ((Date.now() - parseInt(msg.msgTime) * 1000) > interval) {
|
||||
this.msgCache.delete(key);
|
||||
@ -78,7 +78,7 @@ class DBUtil extends DBUtilBase {
|
||||
)`;
|
||||
this.db!.run(createTableSQL, function (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) {
|
||||
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) {
|
||||
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) => {
|
||||
// log("getMsg", row, err);
|
||||
if (err) {
|
||||
log('Could not get msg by short id', err);
|
||||
logError('Could not get msg by short id', err);
|
||||
resolve(null);
|
||||
}
|
||||
try {
|
||||
@ -154,10 +154,10 @@ class DBUtil extends DBUtilBase {
|
||||
}
|
||||
|
||||
async addMsg(msg: RawMessage, update = true): Promise<number> {
|
||||
log('正在记录消息到数据库', msg.msgId);
|
||||
logDebug('正在记录消息到数据库', msg.msgId);
|
||||
const existMsg = await this.getMsgByLongId(msg.msgId);
|
||||
if (existMsg) {
|
||||
// log('消息已存在,更新数据库', msg.msgId);
|
||||
// logDebug('消息已存在,更新数据库', msg.msgId);
|
||||
if (update) this.updateMsg(msg).then();
|
||||
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) {
|
||||
if (err) {
|
||||
if (err.errno === 19) {
|
||||
// log('消息已存在,更新数据库', msg.msgId);
|
||||
// logDebug('消息已存在,更新数据库', msg.msgId);
|
||||
dbInstance.getMsgByLongId(msg.msgId).then((msg: RawMessage | null) => {
|
||||
if (msg) {
|
||||
dbInstance.msgCache.set(msg.msgId, msg);
|
||||
// log('获取消息短id成功', msg.id);
|
||||
// logDebug('获取消息短id成功', msg.id);
|
||||
resolve(msg.id!);
|
||||
} else {
|
||||
log('db could not get msg by long id', err);
|
||||
logError('db could not get msg by long id', err);
|
||||
resolve(-1);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
log('db could not add msg', err);
|
||||
logError('db could not add msg', err);
|
||||
resolve(-1);
|
||||
}
|
||||
} else {
|
||||
@ -210,7 +210,7 @@ class DBUtil extends DBUtilBase {
|
||||
try {
|
||||
stmt.run(JSON.stringify(msg), msg.msgSeq, msg.msgId);
|
||||
} catch (e) {
|
||||
log('updateMsg db error', e);
|
||||
logError('updateMsg db error', e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -224,7 +224,7 @@ class DBUtil extends DBUtilBase {
|
||||
file.msgId,
|
||||
function (err: any) {
|
||||
if (err) {
|
||||
log('db could not add file', err);
|
||||
logError('db could not add file', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
@ -237,7 +237,7 @@ class DBUtil extends DBUtilBase {
|
||||
return new Promise<DBFile | null>((resolve, reject) => {
|
||||
stmt.get(...params, (err: any, row: DBFile & { element: string }) => {
|
||||
if (err) {
|
||||
log('db could not get file cache', err);
|
||||
logError('db could not get file cache', err);
|
||||
reject(err);
|
||||
}
|
||||
if (row) {
|
||||
@ -262,7 +262,7 @@ class DBUtil extends DBUtilBase {
|
||||
return new Promise((resolve, reject) => {
|
||||
stmt.run(file.path, file.url,file.uuid, function (err: any) {
|
||||
if (err) {
|
||||
log('db could not update file cache', err);
|
||||
logError('db could not update file cache', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
@ -276,7 +276,7 @@ class DBUtil extends DBUtilBase {
|
||||
return new Promise<Record<string, string>>((resolve, reject) => {
|
||||
this.db!.all(stmt, (err, rows: { uin: string, uid: string }[]) => {
|
||||
if (err) {
|
||||
log('db could not get temp uin map', err);
|
||||
logError('db could not get temp uin map', err);
|
||||
reject(err);
|
||||
}
|
||||
const map: Record<string, string> = {};
|
||||
@ -294,7 +294,7 @@ class DBUtil extends DBUtilBase {
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
this.db!.get(stmt, [uid], (err, row: { uin: string, uid: string }) => {
|
||||
if (err) {
|
||||
log('db could not get temp uin map', err);
|
||||
logError('db could not get temp uin map', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(row?.uid);
|
||||
@ -309,7 +309,7 @@ class DBUtil extends DBUtilBase {
|
||||
return new Promise((resolve, reject) => {
|
||||
stmt.run(uin, uid, function (err: any) {
|
||||
if (err) {
|
||||
log('db could not add temp uin', err);
|
||||
logError('db could not add temp uin', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
|
@ -25,9 +25,9 @@ function genLogConfig(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
|
||||
}
|
||||
},
|
||||
categories: {
|
||||
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'info' }, // 默认情况下同时输出到文件和控制台
|
||||
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'debug' }, // 默认情况下同时输出到文件和控制台
|
||||
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 + ' ';
|
||||
}
|
||||
return logMsg;
|
||||
return '\n' + logMsg + '\n';
|
||||
}
|
||||
|
||||
function _log(level: LogLevel, ...args: any[]){
|
||||
|
2
src/core
2
src/core
@ -1 +1 @@
|
||||
Subproject commit 4590fe89ddf124c73f513d738ccc202e1df430e7
|
||||
Subproject commit 703cf03e708c7ab011c6a02f08a2a73329c2969f
|
@ -14,7 +14,6 @@ program
|
||||
|
||||
const cmdOptions = program.opts();
|
||||
// console.log(process.argv);
|
||||
setLogLevel(LogLevel.DEBUG, LogLevel.DEBUG);
|
||||
|
||||
checkVersion().then((remoteVersion: string) => {
|
||||
const localVersion = require('./package.json').version;
|
||||
@ -56,7 +55,7 @@ const quickLoginQQ = cmdOptions.qq;
|
||||
// napCatCore.qrLogin().then().catch(console.error);
|
||||
// });
|
||||
if (quickLoginQQ) {
|
||||
console.log('quick login', quickLoginQQ);
|
||||
log('正在快速登录 ', quickLoginQQ);
|
||||
napCatCore.quickLogin(quickLoginQQ).then(res=>{
|
||||
// log('快速登录结果:', res);
|
||||
}).catch((e) => {
|
||||
|
@ -2,6 +2,7 @@ import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { selfInfo } from '@/common/data';
|
||||
import { logDebug, logError } from '@/common/utils/log';
|
||||
import { ConfigBase } from '@/common/utils/ConfigBase';
|
||||
|
||||
export interface OB11Config {
|
||||
httpPort: number;
|
||||
@ -29,7 +30,7 @@ export interface OB11Config {
|
||||
const ob11ConfigDir = path.resolve(__dirname, 'config');
|
||||
fs.mkdirSync(ob11ConfigDir, { recursive: true });
|
||||
|
||||
class Config implements OB11Config {
|
||||
class Config extends ConfigBase<OB11Config> implements OB11Config {
|
||||
httpPort: number = 3000;
|
||||
httpPostUrls: string[] = [];
|
||||
httpSecret = '';
|
||||
@ -47,42 +48,9 @@ class Config implements OB11Config {
|
||||
heartInterval = 30000;
|
||||
token = '';
|
||||
|
||||
constructor() {
|
||||
}
|
||||
|
||||
getConfigPath() {
|
||||
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();
|
||||
|
13
src/onebot11/log.ts
Normal file
13
src/onebot11/log.ts
Normal 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);
|
||||
}
|
@ -26,6 +26,7 @@ import { OB11GroupAdminNoticeEvent } from '@/onebot11/event/notice/OB11GroupAdmi
|
||||
import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot11/event/notice/OB11GroupDecreaseEvent';
|
||||
import { OB11FriendRecallNoticeEvent } from '@/onebot11/event/notice/OB11FriendRecallNoticeEvent';
|
||||
import { OB11GroupRecallNoticeEvent } from '@/onebot11/event/notice/OB11GroupRecallNoticeEvent';
|
||||
import { logMessage } from '@/onebot11/log';
|
||||
|
||||
|
||||
export class NapCatOnebot11 {
|
||||
@ -40,6 +41,16 @@ export class NapCatOnebot11 {
|
||||
public onReady() {
|
||||
logDebug('ob11 ready');
|
||||
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) {
|
||||
ob11HTTPServer.start(ob11Config.httpPort);
|
||||
}
|
||||
@ -78,19 +89,19 @@ export class NapCatOnebot11 {
|
||||
new Promise((resolve) => {
|
||||
dbUtil.addMsg(m).then(msgShortId => {
|
||||
m.id = msgShortId;
|
||||
this.postReceiveMsg([m]).then().catch(log);
|
||||
}).catch(log);
|
||||
this.postReceiveMsg([m]).then().catch(logError);
|
||||
}).catch(logError);
|
||||
}).then();
|
||||
}
|
||||
};
|
||||
msgListener.onMsgInfoListUpdate = (msgList) => {
|
||||
this.postRecallMsg(msgList).then().catch(log);
|
||||
this.postRecallMsg(msgList).then().catch(logError);
|
||||
};
|
||||
msgListener.onAddSendMsg = (msg) => {
|
||||
if (ob11Config.reportSelfMessage) {
|
||||
dbUtil.addMsg(msg).then(id => {
|
||||
msg.id = id;
|
||||
this.postReceiveMsg([msg]).then().catch(log);
|
||||
this.postReceiveMsg([msg]).then().catch(logError);
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -100,7 +111,7 @@ export class NapCatOnebot11 {
|
||||
// BuddyListener
|
||||
const buddyListener = new BuddyListener();
|
||||
buddyListener.onBuddyReqChange = ((req) => {
|
||||
this.postFriendRequest(req.buddyReqs).then().catch(log);
|
||||
this.postFriendRequest(req.buddyReqs).then().catch(logError);
|
||||
});
|
||||
napCatCore.addListener(buddyListener);
|
||||
logDebug('ob11 buddy listener added');
|
||||
@ -126,11 +137,12 @@ export class NapCatOnebot11 {
|
||||
async postReceiveMsg(msgList: RawMessage[]) {
|
||||
const { debug, reportSelfMessage } = ob11Config;
|
||||
for (const message of msgList) {
|
||||
log('收到新消息', message);
|
||||
logDebug('收到新消息', message);
|
||||
// if (message.senderUin !== selfInfo.uin){
|
||||
// message.msgShortId = await dbUtil.addMsg(message);
|
||||
// }
|
||||
OB11Constructor.message(message).then((msg) => {
|
||||
logMessage(msg).then().catch(logError);
|
||||
if (debug) {
|
||||
msg.raw = message;
|
||||
} else {
|
||||
@ -138,6 +150,7 @@ export class NapCatOnebot11 {
|
||||
return;
|
||||
}
|
||||
}
|
||||
logDebug('收到消息: ', msg);
|
||||
const isSelfMsg = msg.user_id.toString() == selfInfo.uin;
|
||||
if (isSelfMsg && !reportSelfMessage) {
|
||||
return;
|
||||
|
Loading…
x
Reference in New Issue
Block a user