crystelf-plugin/lib/ai/sessionManager.js
2025-10-17 23:20:03 +08:00

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