fix(core): 🐛 修复 Telegram 机器人消息删除逻辑

优化消息删除流程,将原本删除命令消息改为优先删除被回复的目标消息。同时增加了更详细的错误日志输出,并更新了未找到记录时的用户提示语,使反馈更加清晰。

- 优先删除目标转发消息而非命令消息
- 增加对 targetMsgId 的类型转换处理
- 捕获并忽略删除失败的异常以提高稳定性
- 丰富了控制台调试日志和用户侧错误提示内容
This commit is contained in:
2026-05-04 02:39:09 +08:00
parent d3cc09d9cf
commit f6c0801352

View File

@@ -252,25 +252,26 @@ async function handleUserDelete(msg, u, env) {
const ref = await sql(env, "SELECT topic_message_id FROM messages WHERE user_id=? AND message_id=?", [u.user_id, targetMsgId], 'first'); 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) { if (!ref || !ref.topic_message_id) {
console.log(`Delete failed: No mapping found for user=${u.user_id}, msg=${targetMsgId}`);
return api(env.BOT_TOKEN, "sendMessage", { return api(env.BOT_TOKEN, "sendMessage", {
chat_id: u.user_id, chat_id: u.user_id,
text: "❌ 未找到对应的消息记录", text: "❌ 未找到对应的消息记录,可能该消息未被转发或已被删除",
reply_to_message_id: msg.message_id reply_to_message_id: msg.message_id
}); });
} }
try { try {
// 1. 删除用户侧消息 // 1. 删除被回复的目标消息(先删目标,再删命令)
await api(env.BOT_TOKEN, "deleteMessage", {
chat_id: u.user_id,
message_id: msg.message_id
});
// 2. 删除被回复的目标消息
await api(env.BOT_TOKEN, "deleteMessage", { await api(env.BOT_TOKEN, "deleteMessage", {
chat_id: u.user_id, chat_id: u.user_id,
message_id: parseInt(targetMsgId) message_id: parseInt(targetMsgId)
}); }).catch(() => {});
// 2. 删除用户侧的 /del 命令消息
await api(env.BOT_TOKEN, "deleteMessage", {
chat_id: u.user_id,
message_id: msg.message_id
}).catch(() => {});
// 3. 通知管理员(引用原消息) // 3. 通知管理员(引用原消息)
await api(env.BOT_TOKEN, "sendMessage", { await api(env.BOT_TOKEN, "sendMessage", {
@@ -279,7 +280,7 @@ async function handleUserDelete(msg, u, env) {
text: `🗑️ <b>用户已删除消息</b>`, text: `🗑️ <b>用户已删除消息</b>`,
parse_mode: "HTML", parse_mode: "HTML",
reply_to_message_id: parseInt(ref.topic_message_id) reply_to_message_id: parseInt(ref.topic_message_id)
}); }).catch(() => {});
// 4. 清理数据库记录 // 4. 清理数据库记录
await sql(env, "DELETE FROM messages WHERE user_id=? AND message_id=?", [u.user_id, targetMsgId]); await sql(env, "DELETE FROM messages WHERE user_id=? AND message_id=?", [u.user_id, targetMsgId]);
@@ -582,7 +583,7 @@ async function relayToTopic(msg, u, env) {
let topicReplyToMsgId = undefined; let topicReplyToMsgId = undefined;
if (msg.reply_to_message) { if (msg.reply_to_message) {
const ref = await sql(env, "SELECT topic_message_id FROM messages WHERE user_id=? AND message_id=?", [uid, msg.reply_to_message.message_id.toString()], 'first'); const ref = await sql(env, "SELECT topic_message_id FROM messages WHERE user_id=? AND message_id=?", [uid, msg.reply_to_message.message_id.toString()], 'first');
if (ref?.topic_message_id) topicReplyToMsgId = ref.topic_message_id; if (ref?.topic_message_id) topicReplyToMsgId = parseInt(ref.topic_message_id);
} }
// 特殊引用语法降级渲染支持 // 特殊引用语法降级渲染支持
@@ -601,18 +602,27 @@ async function relayToTopic(msg, u, env) {
}); });
} else { } else {
// 标准转发处理尝试,若触碰受限隐私配置则回退到原生复制 // 标准转发处理尝试,若触碰受限隐私配置则回退到原生复制
if (topicReplyToMsgId) { try {
forwardedMsg = await api(env.BOT_TOKEN, "copyMessage", { if (topicReplyToMsgId) {
chat_id: env.ADMIN_GROUP_ID, from_chat_id: uid, message_id: msg.message_id, message_thread_id: tid, reply_to_message_id: topicReplyToMsgId forwardedMsg = await api(env.BOT_TOKEN, "copyMessage", {
}); chat_id: env.ADMIN_GROUP_ID, from_chat_id: uid, message_id: msg.message_id, message_thread_id: tid, reply_to_message_id: topicReplyToMsgId
} else try { });
forwardedMsg = await api(env.BOT_TOKEN, "forwardMessage", { } else {
chat_id: env.ADMIN_GROUP_ID, from_chat_id: uid, message_id: msg.message_id, message_thread_id: tid forwardedMsg = await api(env.BOT_TOKEN, "forwardMessage", {
}); chat_id: env.ADMIN_GROUP_ID, from_chat_id: uid, message_id: msg.message_id, message_thread_id: tid
});
}
} catch(fwdErr) { } catch(fwdErr) {
forwardedMsg = await api(env.BOT_TOKEN, "copyMessage", { console.log("Forward failed, trying copyMessage:", fwdErr.message);
chat_id: env.ADMIN_GROUP_ID, from_chat_id: uid, message_id: msg.message_id, message_thread_id: tid if (topicReplyToMsgId) {
}); forwardedMsg = await api(env.BOT_TOKEN, "copyMessage", {
chat_id: env.ADMIN_GROUP_ID, from_chat_id: uid, message_id: msg.message_id, message_thread_id: tid, reply_to_message_id: topicReplyToMsgId
});
} else {
forwardedMsg = await api(env.BOT_TOKEN, "copyMessage", {
chat_id: env.ADMIN_GROUP_ID, from_chat_id: uid, message_id: msg.message_id, message_thread_id: tid
});
}
} }
} }