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');
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", {
chat_id: u.user_id,
text: "❌ 未找到对应的消息记录",
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. 删除被回复的目标消息
// 1. 删除被回复的目标消息(先删目标,再删命令)
await api(env.BOT_TOKEN, "deleteMessage", {
chat_id: u.user_id,
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. 通知管理员(引用原消息)
await api(env.BOT_TOKEN, "sendMessage", {
@@ -279,7 +280,7 @@ async function handleUserDelete(msg, u, env) {
text: `🗑️ <b>用户已删除消息</b>`,
parse_mode: "HTML",
reply_to_message_id: parseInt(ref.topic_message_id)
});
}).catch(() => {});
// 4. 清理数据库记录
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;
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');
if (ref?.topic_message_id) topicReplyToMsgId = ref.topic_message_id;
if (ref?.topic_message_id) topicReplyToMsgId = parseInt(ref.topic_message_id);
}
// 特殊引用语法降级渲染支持
@@ -601,20 +602,29 @@ async function relayToTopic(msg, u, env) {
});
} else {
// 标准转发处理尝试,若触碰受限隐私配置则回退到原生复制
try {
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 try {
} else {
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) {
console.log("Forward failed, trying copyMessage:", fwdErr.message);
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
});
}
}
}
// 推送资料卡片流程补偿机制
try {