mirror of
https://github.com/Jerryplusy/crystelf-plugin.git
synced 2025-12-05 15:41:56 +00:00
125 lines
3.2 KiB
JavaScript
125 lines
3.2 KiB
JavaScript
import ConfigControl from "../config/configControl.js";
|
|
|
|
/**
|
|
* Session管理器
|
|
*/
|
|
class SessionManager {
|
|
constructor() {
|
|
this.sessions = new Map(); // 存储群聊ID到session的映射
|
|
this.maxSessions = 10; // 默认最大sessions数量
|
|
this.userSessions = new Map(); // 存储用户ID到群聊ID的映射,确保一个群只有一个用户聊天
|
|
}
|
|
// TODO 优化session处理逻辑,主人不清理session等
|
|
async init() {
|
|
try {
|
|
const config = await ConfigControl.get('ai');
|
|
this.maxSessions = config?.maxSessions || 10;
|
|
} catch (error) {
|
|
logger.error(`[crystelf-ai] 初始化失败: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 创建/获取session
|
|
* @param groupId 群聊id
|
|
* @param userId 用户id
|
|
* @returns {{groupId, userId, chatHistory: *[], memory: *[], createdAt: number, lastActive: number}|any|null}
|
|
*/
|
|
createOrGetSession(groupId, userId) {
|
|
//是否已有该群聊的session
|
|
if (this.sessions.has(groupId)) {
|
|
const session = this.sessions.get(groupId);
|
|
//当前用户不是session的拥有者,返回null
|
|
if (session.userId !== userId) {
|
|
return null;
|
|
}
|
|
//更新最后活动时间
|
|
session.lastActive = Date.now();
|
|
return session;
|
|
}
|
|
// 检查是否达到最大sessions数量
|
|
if (this.sessions.size >= this.maxSessions) {
|
|
this.cleanOldestSession();
|
|
}
|
|
const session = {
|
|
groupId,
|
|
userId,
|
|
chatHistory: [],
|
|
memory: [],
|
|
createdAt: Date.now(),
|
|
lastActive: Date.now()
|
|
};
|
|
|
|
this.sessions.set(groupId, session);
|
|
logger.info(`[crystelf-ai] 创建新session: 群${groupId}, 用户${userId}`);
|
|
return session;
|
|
}
|
|
|
|
/**
|
|
* 清理最旧的session
|
|
*/
|
|
cleanOldestSession() {
|
|
let oldestSession = null;
|
|
let oldestTime = Date.now();
|
|
for (const [groupId, session] of this.sessions) {
|
|
if (session.lastActive < oldestTime) {
|
|
oldestTime = session.lastActive;
|
|
oldestSession = groupId;
|
|
}
|
|
}
|
|
if (oldestSession) {
|
|
this.sessions.delete(oldestSession);
|
|
logger.info(`[crystelf-ai] 清理最旧session: 群${oldestSession}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取session
|
|
* @param groupId
|
|
* @returns {any|null}
|
|
*/
|
|
getSession(groupId) {
|
|
return this.sessions.get(groupId) || null;
|
|
}
|
|
|
|
/**
|
|
* 删除session
|
|
* @param groupId
|
|
*/
|
|
removeSession(groupId) {
|
|
if (this.sessions.has(groupId)) {
|
|
this.sessions.delete(groupId);
|
|
logger.info(`[crystelf-ai] 删除session: 群${groupId}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更新聊天历史
|
|
* @param groupId
|
|
* @param chatHistory
|
|
*/
|
|
updateChatHistory(groupId, chatHistory) {
|
|
const session = this.sessions.get(groupId);
|
|
if (session) {
|
|
session.chatHistory = chatHistory;
|
|
session.lastActive = Date.now();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清理超时的sessions
|
|
* @param {number} timeout 超时时间(毫秒)
|
|
*/
|
|
cleanTimeoutSessions(timeout = 30 * 60 * 1000) { // 默认30分钟
|
|
const now = Date.now();
|
|
for (const [groupId, session] of this.sessions) {
|
|
if (now - session.lastActive > timeout) {
|
|
this.sessions.delete(groupId);
|
|
logger.info(`[crystelf-ai] 清理超时session: 群${groupId}`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export default new SessionManager();
|