feat: 添加 SessionManager 支持到 SessionCommandHandler,优化会话管理

This commit is contained in:
oudecheng 2026-05-15 16:51:06 +08:00
parent 2cc3b1ce9c
commit 34938f57b8
3 changed files with 37 additions and 6 deletions

View File

@ -2,6 +2,7 @@ use crate::command::context::CommandContext;
use crate::command::handler::CommandHandler; use crate::command::handler::CommandHandler;
use crate::command::response::{CommandError, CommandResponse, MessageKind}; use crate::command::response::{CommandError, CommandResponse, MessageKind};
use crate::command::Command; use crate::command::Command;
use crate::gateway::session::SessionManager;
use crate::storage::SessionStore; use crate::storage::SessionStore;
use async_trait::async_trait; use async_trait::async_trait;
use std::sync::Arc; use std::sync::Arc;
@ -11,6 +12,7 @@ use std::sync::Arc;
/// 处理与会话管理相关的命令 /// 处理与会话管理相关的命令
pub struct SessionCommandHandler { pub struct SessionCommandHandler {
store: Arc<SessionStore>, store: Arc<SessionStore>,
session_manager: Option<SessionManager>,
} }
impl SessionCommandHandler { impl SessionCommandHandler {
@ -19,7 +21,16 @@ impl SessionCommandHandler {
/// # Arguments /// # Arguments
/// * `store` - Session 存储 /// * `store` - Session 存储
pub(crate) fn new(store: Arc<SessionStore>) -> Self { pub(crate) fn new(store: Arc<SessionStore>) -> Self {
Self { store } Self {
store,
session_manager: None,
}
}
/// 设置 SessionManager用于 CreateSession 命令自动切换话题)
pub fn with_session_manager(mut self, session_manager: SessionManager) -> Self {
self.session_manager = Some(session_manager);
self
} }
} }
@ -62,6 +73,19 @@ async fn handle_create_session(
.create_topic(session_id, &topic_title, None) .create_topic(session_id, &topic_title, None)
.map_err(|e| CommandError::new("CREATE_TOPIC_ERROR", e.to_string()))?; .map_err(|e| CommandError::new("CREATE_TOPIC_ERROR", e.to_string()))?;
// 获取 chat_id
let chat_id = ctx.chat_id.as_deref()
.ok_or_else(|| CommandError::new("NO_CHAT_ID", "No chat_id in context"))?;
// 如果有 SessionManager自动切换到新话题
if let Some(ref session_manager) = handler.session_manager {
if let Some(session) = session_manager.get(&ctx.channel_name).await {
let mut session_guard = session.lock().await;
session_guard.switch_topic(chat_id, &topic.id)
.map_err(|e| CommandError::new("SWITCH_TOPIC_ERROR", e.to_string()))?;
}
}
Ok(CommandResponse::success(ctx.request_id) Ok(CommandResponse::success(ctx.request_id)
.with_message(MessageKind::Notification, &topic.title) .with_message(MessageKind::Notification, &topic.title)
.with_metadata("topic_id", &topic.id) .with_metadata("topic_id", &topic.id)
@ -88,7 +112,8 @@ mod tests {
let session = store.create_session("cli", Some("test session")).unwrap(); let session = store.create_session("cli", Some("test session")).unwrap();
let ctx = CommandContext::new("test", "cli") let ctx = CommandContext::new("test", "cli")
.with_session_id(&session.id); .with_session_id(&session.id)
.with_chat_id(&session.id);
let cmd = Command::CreateSession { let cmd = Command::CreateSession {
title: Some("my topic".to_string()), title: Some("my topic".to_string()),
}; };
@ -108,7 +133,8 @@ mod tests {
let session = store.create_session("cli", Some("test session")).unwrap(); let session = store.create_session("cli", Some("test session")).unwrap();
let ctx = CommandContext::new("test", "cli") let ctx = CommandContext::new("test", "cli")
.with_session_id(&session.id); .with_session_id(&session.id)
.with_chat_id(&session.id);
let cmd = Command::CreateSession { title: None }; let cmd = Command::CreateSession { title: None };
let result = handler.handle(cmd, ctx).await; let result = handler.handle(cmd, ctx).await;

View File

@ -39,7 +39,9 @@ impl InboundProcessor {
let store = session_manager.store(); let store = session_manager.store();
// 注册 Session 处理器 // 注册 Session 处理器
command_router.register(Box::new(SessionCommandHandler::new(store.clone()))); let session_handler = SessionCommandHandler::new(store.clone())
.with_session_manager(session_manager.clone());
command_router.register(Box::new(session_handler));
// 注册 session_query 处理器 // 注册 session_query 处理器
let session_query_handler = SessionQueryCommandHandler::new(store) let session_query_handler = SessionQueryCommandHandler::new(store)

View File

@ -224,8 +224,11 @@ async fn handle_inbound(
])); ]));
let mut router = CommandRouter::new(); let mut router = CommandRouter::new();
router.register(Box::new(SessionCommandHandler::new(store.clone()))); // 注册 Session 处理器,添加 SessionManager
// 修复:添加 SessionManager 到 SessionQueryCommandHandler let session_handler = SessionCommandHandler::new(store.clone())
.with_session_manager(state.session_manager.clone());
router.register(Box::new(session_handler));
// 注册 SessionQuery 处理器
let session_query_handler = SessionQueryCommandHandler::new(store.clone()) let session_query_handler = SessionQueryCommandHandler::new(store.clone())
.with_session_manager(state.session_manager.clone()); .with_session_manager(state.session_manager.clone());
router.register(Box::new(session_query_handler)); router.register(Box::new(session_query_handler));