fix(core): 🐛 优化 Telegram 机器人消息 ID 查询逻辑

调整 tg-bot.js 中针对回复消息 ID 的处理逻辑。通过显式转换原始 ID 为字符串,并增加针对不同数据类型的回退查询机制,解决了由于数据库字段类型不匹配导致的删除请求映射失败问题。此外,增强了相关操作的日志输出以便于调试。
This commit is contained in:
2026-05-04 02:49:41 +08:00
parent 3cd76722ef
commit a870ebfe18

View File

@@ -246,15 +246,45 @@ async function handleUserDelete(msg, u, env) {
}); });
} }
const targetMsgId = msg.reply_to_message.message_id.toString(); const targetMsgIdRaw = msg.reply_to_message.message_id;
console.log(`Delete request: user=${u.user_id}, target_msg=${targetMsgId}`); const targetMsgId = targetMsgIdRaw.toString();
console.log(`Delete request: user=${u.user_id}, target_msg_raw=${targetMsgIdRaw} (type: ${typeof targetMsgIdRaw}), target_msg_str=${targetMsgId}`);
// 查询对应的管理员侧消息ID // 查询对应的管理员侧消息ID - 尝试多种可能的格式
const ref = await sql(env, "SELECT topic_message_id FROM messages WHERE user_id=? AND message_id=?", [u.user_id, targetMsgId], 'first'); let 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(`First query failed, trying with integer...`);
ref = await sql(env, "SELECT topic_message_id FROM messages WHERE user_id=? AND message_id=?", [u.user_id, parseInt(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}`); console.log(`Delete failed: No mapping found for user=${u.user_id}, msg=${targetMsgId}`);
console.log(`Tip: Check if the message was forwarded successfully and exists in database`);
// 检查是否是管理员发送的消息(通过反向查询)
const adminRef = await sql(env, "SELECT user_id FROM messages WHERE topic_message_id=?", [targetMsgId], 'first');
if (adminRef) {
console.log(`Delete blocked: User tried to delete admin's message (topic_msg=${targetMsgId})`);
return api(env.BOT_TOKEN, "sendMessage", {
chat_id: u.user_id,
text: "❌ 您只能删除自己发送的消息,无法删除管理员回复的消息",
reply_to_message_id: msg.message_id
});
}
console.log(`Tip: Check database records with: SELECT * FROM messages WHERE user_id='${u.user_id}'`);
// 帮助用户排查列出该用户的最近5条消息记录
try {
const recentMsgs = await sql(env, "SELECT message_id, topic_message_id, text FROM messages WHERE user_id=? ORDER BY date DESC LIMIT 5", [u.user_id], 'all');
if (recentMsgs && recentMsgs.results) {
console.log(`Recent messages for user ${u.user_id}:`, JSON.stringify(recentMsgs.results));
}
} catch (e) {
console.log(`Failed to fetch recent messages:`, e.message);
}
return api(env.BOT_TOKEN, "sendMessage", { return api(env.BOT_TOKEN, "sendMessage", {
chat_id: u.user_id, chat_id: u.user_id,
text: "❌ 未找到对应的消息记录,可能该消息未被转发或已被删除", text: "❌ 未找到对应的消息记录,可能该消息未被转发或已被删除",