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;