From 0854f94e874df25fdcdd2df74c8d8075a44aec68 Mon Sep 17 00:00:00 2001
From: Vaica <94612053+zqlit@users.noreply.github.com>
Date: Wed, 24 Jun 2026 16:01:59 +0800
Subject: [PATCH] 1601
---
write-server/src/lib/bot/handlers.ts | 76 +++++++++++++++++++++++++++-
1 file changed, 75 insertions(+), 1 deletion(-)
diff --git a/write-server/src/lib/bot/handlers.ts b/write-server/src/lib/bot/handlers.ts
index 55bdd56c..c54bfbd9 100644
--- a/write-server/src/lib/bot/handlers.ts
+++ b/write-server/src/lib/bot/handlers.ts
@@ -606,4 +606,78 @@ handlers.feed_edit = async (chatId, arg) => {
handlers.handleFeedEditReply = async (chatId, newText) => {
const s = getSession(chatId);
const oldUrl = s.originalSlug;
- if (!oldUrl) { await sendMain(chatId, "⚠️ 会话已
\ No newline at end of file
+ if (!oldUrl) { await sendMain(chatId, "⚠️ 会话已过期,请重新执行 /feed_edit"); return; }
+
+ try {
+ if (newText && newText.trim()) {
+ const parts = newText.trim().split(/\s+/);
+ const newUrl = parts[0] || oldUrl;
+ const feedTitle = parts.slice(1).join(" ") || "";
+
+ await updateFeed(oldUrl, newUrl, feedTitle);
+ await sendMain(chatId, "✅ 订阅源已更新:" + (feedTitle || newUrl));
+ } else {
+ await sendMain(chatId, "ℹ️ 未做修改");
+ }
+ s.originalSlug = undefined;
+ invalidateByPrefix("feeds");
+ } catch (e) {
+ await sendMain(chatId, "⚠️ 更新失败,请稍后再试");
+ }
+};
+
+handlers.feed_del = async (chatId, url) => {
+ if (!url) { await sendMain(chatId, "格式:/feed_del url"); return; }
+ try { await deleteFeed(url); invalidateByPrefix("feeds"); await sendMain(chatId, "✅ 已删除:" + url); }
+ catch (e) { await sendMain(chatId, "⚠️ API 暂时不可用,请稍后再试"); }
+};
+
+handlers.feed_health = async (chatId) => {
+ try {
+ await sendMessage(chatId, "⏳ 正在检测订阅源...");
+ const result = await cachedHealth();
+ const lines = ["📊 订阅源健康报告\n", "✅ 存活:" + result.alive + " ❌ 异常:" + result.dead];
+ const dead = (result.results || []).filter((r) => !r.ok);
+ if (dead.length > 0) {
+ lines.push("\n❌ 异常站点:");
+ for (const d of dead) {
+ lines.push("🔴 " + d.url + " — " + (d.error || String(d.status)));
+ }
+ }
+ await sendMain(chatId, lines.join("\n"));
+ } catch (e) { await sendMain(chatId, "⚠️ API 暂时不可用,请稍后再试"); }
+};
+
+// ---- Read ----
+
+handlers.read = async (chatId) => {
+ try {
+ await sendMessage(chatId, "📰 正在获取友链最新文章...");
+ const articles = await getArticles(10);
+ if (articles.length === 0) { await sendMain(chatId, "暂时没有新文章。"); return; }
+ const lines = ["📰 友链最新文章\n"];
+ for (const a of articles) {
+ const date = new Date(a.pubDate).toLocaleDateString("zh-CN", { timeZone: "Asia/Shanghai" });
+ lines.push("• " + escapeHtml(a.title) + "");
+ lines.push(" " + (a.feedName || a.siteUrl) + " · " + date);
+ }
+ await tg("sendMessage", {
+ chat_id: chatId, text: lines.join("\n"), parse_mode: "HTML", disable_web_page_preview: true,
+ });
+ } catch (e) { await sendMain(chatId, "⚠️ 获取失败,请稍后再试"); }
+};
+
+// ---- Stats ----
+
+handlers.stats = async (chatId) => {
+ try {
+ const res = await fetch(BLOG_ROOT + "/index.xml");
+ const data = await getStats();
+ const lines = ["📊 网站数据\n"];
+ lines.push("📝 文章总数:" + data.totalPosts + " 篇");
+ lines.push("💬 评论总数:" + data.totalComments + " 条");
+ await sendMain(chatId, lines.join("\n"));
+ } catch (e) { await sendMain(chatId, "⚠️ 获取失败,请稍后再试"); }
+};
+
+export default handlers;