feat(master): 引入全局追踪与指令气泡抹杀机制,彻底解决纯文本指令触发的面板堆积问题

This commit is contained in:
hotyue
2026-08-10 07:30:24 +00:00
parent a015052ed7
commit 5642cbcfbf
+29 -3
View File
@@ -60,7 +60,7 @@ render_ui() {
local buttons="$4"
if [ -n "$msg_id" ]; then
# 1. 尝试物理删除旧面板,实现完美沉底转移
# 1. 按钮触发:尝试物理删除旧面板,实现完美沉底转移
local del_res=$(curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/deleteMessage" \
-d "chat_id=$chat_id" -d "message_id=$msg_id")
@@ -70,9 +70,24 @@ render_ui() {
-H "Content-Type: application/json" \
-d "{\"chat_id\":\"$chat_id\",\"message_id\":\"$msg_id\",\"reply_markup\":{\"inline_keyboard\":[]}}" > /dev/null
fi
else
# 3. [新增] 文本触发 (如输入/start):尝试抹除全局记录的上一个遗留面板
if [ -f "${MASTER_DIR}/.last_ui_id" ]; then
local last_ui=$(cat "${MASTER_DIR}/.last_ui_id")
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/deleteMessage" \
-d "chat_id=$chat_id" -d "message_id=$last_ui" > /dev/null
fi
fi
# 4. 无论如何,在最底部发送全新面板,并捕获最新 message_id 记录下来
local res=$(curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d "{\"chat_id\":\"$chat_id\",\"text\":\"$text\",\"parse_mode\":\"Markdown\",\"reply_markup\":{\"inline_keyboard\":$buttons}}")
local new_id=$(echo "$res" | jq -r '.result.message_id // empty')
if [ -n "$new_id" ] && [ "$new_id" != "null" ]; then
echo "$new_id" > "${MASTER_DIR}/.last_ui_id"
fi
# 3. 无论如何,在最底部发送全新面板,杜绝视线跳跃
send_ui "$chat_id" "$text" "$buttons"
}
# [核心重构] 文本沉底重绘引擎
@@ -204,6 +219,10 @@ while true; do
# [安全漏洞 #106 修复] 严格区分消息文本与按钮回调源
MSG_TEXT=$(echo "$UPDATE" | jq -r '.message.text // empty')
# 👇 --- 新增这一行:提取用户的文本气泡 ID --- 👇
USER_MSG_ID=$(echo "$UPDATE" | jq -r '.message.message_id // empty')
CB_DATA=$(echo "$UPDATE" | jq -r '.callback_query.data // empty')
CB_ID=$(echo "$UPDATE" | jq -r '.callback_query.id // empty')
MSG_ID=$(echo "$UPDATE" | jq -r '.callback_query.message.message_id // empty')
@@ -347,6 +366,13 @@ while true; do
# ----------------------------------------------------------
case "$TEXT" in
"/start"|"/menu")
# 👇 --- 新增这段逻辑:抹杀用户发送的 /start 文本指令 --- 👇
if [ -n "$USER_MSG_ID" ] && [ -z "$CB_ID" ]; then
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/deleteMessage" \
-d "chat_id=$CHAT_ID" -d "message_id=$USER_MSG_ID" > /dev/null
fi
# 👆 ----------------------------------------------------- 👆
REMOTE_VER=$(curl -s -m 2 "${REPO_RAW_URL}/version.txt" | grep "^MASTER_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]')
VER_INFO="当前版本: \`v${MASTER_VERSION}\`"