From d3cc09d9cfc62e93fa21a049c43e2e8121395a59 Mon Sep 17 00:00:00 2001 From: Orion Date: Mon, 4 May 2026 02:36:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=88=A0=E9=99=A4=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在管理员群组逻辑中添加了对 `/del` 命令的支持。当管理员对某条消息回复 `/del` 时,将触发 `handleAdminDelete` 函数,同时优化了管理员回复逻辑的判定结构。 - 新增 `handleAdminDelete` 处理函数用于处理消息删除指令 - 优化管理员群组内的条件分支判定 - 改进 handleAdminEdit 函数以主动通知用户消息变更内容 --- telegram/tg-bot.js | 126 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 2 deletions(-) diff --git a/telegram/tg-bot.js b/telegram/tg-bot.js index 772d73d..ca341bc 100644 --- a/telegram/tg-bot.js +++ b/telegram/tg-bot.js @@ -212,7 +212,14 @@ async function handleUpdate(update, env, ctx) { // 会话路由 if (msg.chat.type === "private") await handlePrivate(msg, env, ctx); - else if (msg.chat.id.toString() === env.ADMIN_GROUP_ID) await handleAdminReply(msg, env); + else if (msg.chat.id.toString() === env.ADMIN_GROUP_ID) { + // 检查是否是管理员的 /del 命令 + if ((msg.text === "/del" || msg.caption === "/del") && msg.reply_to_message) { + await handleAdminDelete(msg, env); + } else { + await handleAdminReply(msg, env); + } + } } // 管理员编辑群组内消息时的逻辑,主动通知用户变更内容 @@ -229,6 +236,120 @@ async function handleAdminEdit(msg, env) { }); } +// 用户侧删除消息处理 +async function handleUserDelete(msg, u, env) { + if (!msg.reply_to_message) { + return api(env.BOT_TOKEN, "sendMessage", { + chat_id: u.user_id, + text: "⚠️ 请回复要删除的消息后使用 /del 命令", + reply_to_message_id: msg.message_id + }); + } + + const targetMsgId = msg.reply_to_message.message_id.toString(); + + // 查询对应的管理员侧消息ID + const ref = await sql(env, "SELECT topic_message_id FROM messages WHERE user_id=? AND message_id=?", [u.user_id, targetMsgId], 'first'); + + if (!ref || !ref.topic_message_id) { + return api(env.BOT_TOKEN, "sendMessage", { + chat_id: u.user_id, + text: "❌ 未找到对应的消息记录", + reply_to_message_id: msg.message_id + }); + } + + try { + // 1. 删除用户侧消息 + await api(env.BOT_TOKEN, "deleteMessage", { + chat_id: u.user_id, + message_id: msg.message_id + }); + + // 2. 删除被回复的目标消息 + await api(env.BOT_TOKEN, "deleteMessage", { + chat_id: u.user_id, + message_id: parseInt(targetMsgId) + }); + + // 3. 通知管理员(引用原消息) + await api(env.BOT_TOKEN, "sendMessage", { + chat_id: env.ADMIN_GROUP_ID, + message_thread_id: u.topic_id, + text: `🗑️ 用户已删除消息`, + parse_mode: "HTML", + reply_to_message_id: parseInt(ref.topic_message_id) + }); + + // 4. 清理数据库记录 + await sql(env, "DELETE FROM messages WHERE user_id=? AND message_id=?", [u.user_id, targetMsgId]); + + } catch (e) { + console.error("User Delete Failed:", e); + await api(env.BOT_TOKEN, "sendMessage", { + chat_id: u.user_id, + text: "❌ 删除失败,请稍后重试", + reply_to_message_id: msg.message_id + }); + } +} + +// 管理员侧删除消息处理 +async function handleAdminDelete(msg, env) { + if (!msg.message_thread_id || !(await isAuthAdmin(msg.from.id, env))) return; + + if (!msg.reply_to_message) { + return api(env.BOT_TOKEN, "sendMessage", { + chat_id: msg.chat.id, + message_thread_id: msg.message_thread_id, + text: "⚠️ 请回复要删除的消息后使用 /del 命令" + }); + } + + const targetTopicMsgId = msg.reply_to_message.message_id; + + // 查询对应的用户侧消息ID + const ref = await sql(env, "SELECT user_id, message_id FROM messages WHERE topic_message_id=?", targetTopicMsgId.toString(), 'first'); + + if (!ref) { + return api(env.BOT_TOKEN, "sendMessage", { + chat_id: msg.chat.id, + message_thread_id: msg.message_thread_id, + text: "❌ 未找到对应的消息记录" + }); + } + + try { + // 1. 删除管理员侧消息(包括 /del 命令本身和被回复的消息) + await api(env.BOT_TOKEN, "deleteMessage", { + chat_id: msg.chat.id, + message_id: msg.message_id + }).catch(() => {}); + + await api(env.BOT_TOKEN, "deleteMessage", { + chat_id: msg.chat.id, + message_id: targetTopicMsgId + }).catch(() => {}); + + // 2. 删除用户侧消息 + await api(env.BOT_TOKEN, "deleteMessage", { + chat_id: ref.user_id, + message_id: parseInt(ref.message_id) + }).catch(() => {}); + + // 3. 清理数据库记录 + await sql(env, "DELETE FROM messages WHERE user_id=? AND message_id=?", [ref.user_id, ref.message_id]); + + } catch (e) { + console.error("Admin Delete Failed:", e); + await api(env.BOT_TOKEN, "sendMessage", { + chat_id: msg.chat.id, + message_thread_id: msg.message_thread_id, + text: "❌ 删除失败,请稍后重试" + }); + } +} + // 私聊消息处理总线 (用户侧逻辑入口) async function handlePrivate(msg, env, ctx) { const id = msg.chat.id.toString(); @@ -264,7 +385,8 @@ async function handlePrivate(msg, env, ctx) { } return isAdm ? handleAdminConfig(id, null, 'menu', null, null, env) : sendStart(id, msg, env); } - if (text === "/help" && isAdm) return api(env.BOT_TOKEN, "sendMessage", { chat_id: id, text: "ℹ️ 帮助\n• 回复消息即对话\n• /start 打开面板", parse_mode: "HTML" }); + if (text === "/help" && isAdm) return api(env.BOT_TOKEN, "sendMessage", { chat_id: id, text: "ℹ️ 帮助\n• 回复消息即对话\n• /start 打开面板\n• /del 删除消息", parse_mode: "HTML" }); + if (text === "/del" && !isAdm) return handleUserDelete(msg, u, env); // 2. 封禁拦截层 if (u.is_blocked) {