feat: 添加获取话题消息数量的方法,优化话题列表和切换话题的反馈信息

This commit is contained in:
ooodc 2026-05-16 22:03:32 +08:00
parent 428df8da59
commit 4eb6193d0c
3 changed files with 21 additions and 47 deletions

View File

@ -65,42 +65,26 @@ async fn handle_list_sessions(
} else {
let mut lines = vec![format!("Found {} topic(s):", topics.len())];
lines.push(String::new());
lines.push("┌────┬─────────────────┬──────────────────────┬──────────┬─────────────────┐".to_string());
lines.push("│ No │ Topic ID │ Title │ Messages │ Last Active │".to_string());
lines.push("├────┼─────────────────┼──────────────────────┼──────────┼─────────────────┤".to_string());
for (idx, topic) in topics.iter().enumerate() {
let row_num = idx + 1;
let num = idx + 1;
let is_current = topic.id == current_topic_id;
let num_marker = if is_current { " * ".to_string() } else { format!(" {:<2}", row_num) };
let marker = if is_current { " *" } else { "" };
let topic_id_display = if topic.id.len() > 15 {
format!("{}...", &topic.id[..12])
} else {
topic.id.clone()
};
let title_display = if topic.title.len() > 20 {
format!("{}...", &topic.title[..17])
} else {
topic.title.clone()
};
let last_active = format_time_ago(topic.last_active_at);
// 使用辅助方法获取消息数量
let msg_count = handler.store
.get_topic_message_count(&topic.id)
.unwrap_or(0);
lines.push(format!(
"│{}│ {:<15} │ {:<20} │ {:<8} │ {:<15} │",
num_marker,
topic_id_display,
title_display,
topic.message_count,
last_active
"{}. {}{} ({})",
num, topic.title, marker, msg_count
));
}
lines.push("└────┴─────────────────┴──────────────────────┴──────────┴─────────────────┘".to_string());
lines.push(String::new());
lines.push("* = current topic".to_string());
lines.push("Use /use <number> or /use <topic_id> to switch".to_string());
lines.push("Use /use <number> to switch".to_string());
lines.join("\n")
};
@ -113,24 +97,4 @@ async fn handle_list_sessions(
.with_metadata("topics", &topics_json)
.with_metadata("count", &topics.len().to_string())
.with_metadata("current_topic_id", current_topic_id))
}
fn format_time_ago(timestamp_ms: i64) -> String {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_millis() as i64;
let diff_ms = now - timestamp_ms;
let diff_secs = diff_ms / 1000;
if diff_secs < 60 {
"just now".to_string()
} else if diff_secs < 3600 {
format!("{} mins ago", diff_secs / 60)
} else if diff_secs < 86400 {
format!("{} hours ago", diff_secs / 3600)
} else {
format!("{} days ago", diff_secs / 86400)
}
}

View File

@ -97,14 +97,19 @@ async fn handle_switch_session(
}
}
// 使用辅助方法获取消息数量
let msg_count = handler.store
.get_topic_message_count(&target_topic_id)
.unwrap_or(0);
let message = format!(
"✓ Switched to topic: {} ({} messages)",
topic.title, topic.message_count
topic.title, msg_count
);
Ok(CommandResponse::success(ctx.request_id)
.with_message(MessageKind::Notification, &message)
.with_metadata("topic_id", &topic.id)
.with_metadata("title", &topic.title)
.with_metadata("message_count", &topic.message_count.to_string()))
.with_metadata("message_count", &msg_count.to_string()))
}

View File

@ -1359,6 +1359,11 @@ impl SessionStore {
Ok(messages)
}
/// 获取指定话题的消息数量(动态计算,确保准确)
pub fn get_topic_message_count(&self, topic_id: &str) -> Result<usize, StorageError> {
self.load_messages_for_topic(topic_id).map(|msgs| msgs.len())
}
pub fn load_all_messages(&self, session_id: &str) -> Result<Vec<ChatMessage>, StorageError> {
let conn = self.conn.lock().expect("session db mutex poisoned");
load_messages_after(&conn, session_id, 0)