fix(core): 🐛 实现管理员删除消息功能

在管理员群组逻辑中添加了对 `/del` 命令的支持。当管理员对某条消息回复 `/del` 时,将触发 `handleAdminDelete` 函数,同时优化了管理员回复逻辑的判定结构。

- 新增 `handleAdminDelete` 处理函数用于处理消息删除指令
- 优化管理员群组内的条件分支判定
- 改进 handleAdminEdit 函数以主动通知用户消息变更内容
This commit is contained in:
2026-05-04 02:36:16 +08:00
parent e749c4633f
commit d3cc09d9cf

View File

@@ -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: `🗑️ <b>用户已删除消息</b>`,
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: " <b>帮助</b>\n• 回复消息即对话\n• /start 打开面板", parse_mode: "HTML" });
if (text === "/help" && isAdm) return api(env.BOT_TOKEN, "sendMessage", { chat_id: id, text: " <b>帮助</b>\n• 回复消息即对话\n• /start 打开面板\n• /del 删除消息", parse_mode: "HTML" });
if (text === "/del" && !isAdm) return handleUserDelete(msg, u, env);
// 2. 封禁拦截层
if (u.is_blocked) {