diff --git a/warp.sh b/warp.sh index 9122608..7bb3d68 100644 --- a/warp.sh +++ b/warp.sh @@ -1553,42 +1553,53 @@ bot_daemon() { if has_awg_mode && [ -n "$CONTAINER" ]; then awg_load_container_data 2>/dev/null; fi local offset=0 while true; do - local response - response=$(curl -s --max-time 35 \ - "https://api.telegram.org/bot${BOT_TOKEN}/getUpdates?offset=${offset}&timeout=30" 2>/dev/null) - [ -z "$response" ] && sleep 2 && continue - local ok; ok=$(echo "$response" | jq -r '.ok // "false"') - [ "$ok" != "true" ] && sleep 5 && continue - local cnt; cnt=$(echo "$response" | jq '.result | length') - for (( i=0; i /dev/null; continue; fi - bot_handle_callback "$cci" "$cmi" "$cbi" "$cbd" - else - local mci mtx - mci=$(echo "$upd" | jq -r '.message.chat.id // empty') - mtx=$(echo "$upd" | jq -r '.message.text // empty') - if [ -n "$mci" ] && [ -n "$mtx" ]; then - if ! is_bot_admin "$mci"; then tg_send "$mci" "⛔ Нет доступа.\nChat ID: $mci" "" > /dev/null; continue; fi - if [[ "$mtx" == "/start" || "$mtx" == "/menu" ]]; then - bot_main_menu "$mci" - else - tg_send "$mci" "Используйте /start или /menu" "" > /dev/null - fi - fi - fi - done + bot_poll_cycle done } +bot_poll_cycle() { + local response + response=$(curl -s --max-time 35 \ + "https://api.telegram.org/bot${BOT_TOKEN}/getUpdates?offset=${offset}&timeout=30" 2>/dev/null) + [ -z "$response" ] && sleep 2 && return + + local header + header=$(jq -r '[.ok // "false", (.result | length)] | @tsv' <<< "$response" 2>/dev/null) + local ok cnt + IFS=$'\t' read -r ok cnt <<< "$header" + [ "$ok" != "true" ] && sleep 5 && return + [ "$cnt" -eq 0 ] 2>/dev/null && return + + local updates_tsv + updates_tsv=$(jq -r ' + .result[] | [ + .update_id, + (.callback_query.data // ""), + (.callback_query.id // ""), + (.callback_query.message.chat.id // ""), + (.callback_query.message.message_id // ""), + (.message.chat.id // ""), + (.message.text // "") + ] | @tsv + ' <<< "$response" 2>/dev/null) + + while IFS=$'\t' read -r uid cbd cbi cci cmi mci mtx; do + [ -z "$uid" ] && continue + offset=$((uid + 1)) + if [ -n "$cbd" ]; then + if ! is_bot_admin "$cci"; then tg_answer_cb "$cbi" "Нет доступа" > /dev/null; continue; fi + bot_handle_callback "$cci" "$cmi" "$cbi" "$cbd" + elif [ -n "$mci" ] && [ -n "$mtx" ]; then + if ! is_bot_admin "$mci"; then tg_send "$mci" "⛔ Нет доступа.\nChat ID: $mci" "" > /dev/null; continue; fi + if [[ "$mtx" == "/start" || "$mtx" == "/menu" ]]; then + bot_main_menu "$mci" + else + tg_send "$mci" "Используйте /start или /menu" "" > /dev/null + fi + fi + done <<< "$updates_tsv" +} + # ─── Bot menu (SSH) ────────────────────────────────────────── start_bot() {