适配crystelf-plugin

添加reportBots支持
This commit is contained in:
Jerry 2025-04-28 14:00:14 +08:00
parent d8d7fc864b
commit d442d707d3
2 changed files with 59 additions and 4 deletions

View File

@ -17,7 +17,6 @@ class RedisService {
private async initialize() { private async initialize() {
await this.connectWithRetry(); await this.connectWithRetry();
this.setupEventListeners(); this.setupEventListeners();
//await this.test();
} }
private async connectWithRetry(): Promise<void> { private async connectWithRetry(): Promise<void> {
@ -47,6 +46,9 @@ class RedisService {
} }
} }
/**
* Redis客户端事件监听器
*/
private setupEventListeners(): void { private setupEventListeners(): void {
this.client.on('error', (err) => { this.client.on('error', (err) => {
if (!err.message.includes('ECONNREFUSED')) { if (!err.message.includes('ECONNREFUSED')) {
@ -80,6 +82,11 @@ class RedisService {
}); });
} }
/**
* Redis客户端实例
* @returns {Redis} Redis客户端
* @throws fatal日志
*/
public getClient(): Redis { public getClient(): Redis {
if (!this.isConnected) { if (!this.isConnected) {
logger.fatal(1, 'Redis未连接..'); logger.fatal(1, 'Redis未连接..');
@ -87,11 +94,22 @@ class RedisService {
return this.client; return this.client;
} }
/**
* Redis连接
* @returns {Promise<void>}
*/
public async disconnect(): Promise<void> { public async disconnect(): Promise<void> {
await this.client.quit(); await this.client.quit();
this.isConnected = false; this.isConnected = false;
} }
/**
* Redis
* @template T
* @param {string} key Redis键
* @param {T} value
* @param {number} [ttl]
*/
public async setObject<T>(key: string, value: T, ttl?: number): Promise<void> { public async setObject<T>(key: string, value: T, ttl?: number): Promise<void> {
const serialized = redisTools.serialize(value); const serialized = redisTools.serialize(value);
await this.getClient().set(key, serialized); await this.getClient().set(key, serialized);
@ -101,14 +119,27 @@ class RedisService {
} }
} }
/**
* Redis获取对象
* @template T
* @param {string} key Redis键
* @returns {Promise<T | undefined>} undefined
*/
public async getObject<T>(key: string): Promise<T | undefined> { public async getObject<T>(key: string): Promise<T | undefined> {
const serialized = await this.getClient().get(key); const serialized = await this.getClient().get(key);
if (!serialized) return undefined; if (!serialized) return undefined;
const deseralized = redisTools.deserialize<T>(serialized); const deserialized = redisTools.deserialize<T>(serialized);
return redisTools.reviveDates(deseralized); return redisTools.reviveDates(deserialized);
} }
/**
* Redis中已存在的对象
* @template T
* @param {string} key Redis键
* @param {T} updates
* @returns {Promise<T>}
*/
public async update<T>(key: string, updates: T): Promise<T> { public async update<T>(key: string, updates: T): Promise<T> {
const existing = await this.getObject<T>(key); const existing = await this.getObject<T>(key);
if (!existing) { if (!existing) {
@ -119,6 +150,13 @@ class RedisService {
return updated; return updated;
} }
/**
* Redis或本地文件获取数据
* @template T
* @param {string} key Redis键
* @param {string} fileName
* @returns {Promise<T | undefined>} undefined
*/
public async fetch<T>(key: string, fileName: string): Promise<T | undefined> { public async fetch<T>(key: string, fileName: string): Promise<T | undefined> {
const data = await this.getObject<T>(key); const data = await this.getObject<T>(key);
if (data) return data; if (data) return data;
@ -130,12 +168,22 @@ class RedisService {
logger.error(`数据${key}不存在..`); logger.error(`数据${key}不存在..`);
} }
/**
* Redis和本地文件
* @template T
* @param {string} key Redis键
* @param {T} data
* @param {string} fileName
*/
public async persistData<T>(key: string, data: T, fileName: string): Promise<void> { public async persistData<T>(key: string, data: T, fileName: string): Promise<void> {
await this.setObject(key, data); await this.setObject(key, data);
await Persistence.writeDataLocal(key, data, fileName); await Persistence.writeDataLocal(key, data, fileName);
return; return;
} }
/**
*
*/
public async test(): Promise<void> { public async test(): Promise<void> {
const user = await this.fetch<IUser>('Jerry', 'IUser'); const user = await this.fetch<IUser>('Jerry', 'IUser');
logger.debug('User:', user); logger.debug('User:', user);

View File

@ -2,6 +2,7 @@ import { AuthenticatedSocket } from '../../types/ws';
import wsTools from '../../utils/ws/wsTools'; import wsTools from '../../utils/ws/wsTools';
import { WebSocket } from 'ws'; import { WebSocket } from 'ws';
import logger from '../../utils/core/logger'; import logger from '../../utils/core/logger';
import redisService from '../redis/redis';
type MessageHandler = (socket: WebSocket, msg: any) => Promise<void>; type MessageHandler = (socket: WebSocket, msg: any) => Promise<void>;
@ -13,6 +14,7 @@ class WSMessageHandler {
['test', this.handleTest], ['test', this.handleTest],
['ping', this.handlePing], ['ping', this.handlePing],
['pong', this.handlePong], ['pong', this.handlePong],
['reportBots', this.handleReportBots],
]); ]);
} }
@ -48,7 +50,7 @@ class WSMessageHandler {
} }
private async handlePong(socket: WebSocket, msg: any) { private async handlePong(socket: WebSocket, msg: any) {
logger.debug(`received pong ${msg.data}`); logger.debug(`received pong`);
} }
private async handleUnknown(socket: WebSocket, msg: any) { private async handleUnknown(socket: WebSocket, msg: any) {
@ -59,6 +61,11 @@ class WSMessageHandler {
}); });
} }
private async handleReportBots(socket: WebSocket, msg: any) {
logger.debug(`received reportBots: ${msg.data}`);
await redisService.persistData('crystelf', msg, 'bots');
}
public registerHandler(type: string, handler: MessageHandler): void { public registerHandler(type: string, handler: MessageHandler): void {
this.handlers.set(type, handler); this.handlers.set(type, handler);
} }