mirror of
https://github.com/anten-ka/gotelegram_pro.git
synced 2026-05-19 15:36:03 +00:00
fix: main menu 30s refresh, stats submenu flicker-free via tput
This commit is contained in:
52
install.sh
52
install.sh
@@ -131,7 +131,7 @@ show_main_menu() {
|
|||||||
echo -e " ${CYAN}5${NC}) О программе ▸"
|
echo -e " ${CYAN}5${NC}) О программе ▸"
|
||||||
echo -e " ${CYAN}0${NC}) ${DIM}Выход${NC}"
|
echo -e " ${CYAN}0${NC}) ${DIM}Выход${NC}"
|
||||||
echo -e " ${DIM}${line2}${NC}"
|
echo -e " ${DIM}${line2}${NC}"
|
||||||
echo -e " ${DIM}Обновление через 1 сек${NC}"
|
echo -e " ${DIM}Обновление через 30 сек${NC}"
|
||||||
echo -ne " ${WHITE}▸ ${NC}"
|
echo -ne " ${WHITE}▸ ${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -946,8 +946,8 @@ main() {
|
|||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
show_main_menu
|
show_main_menu
|
||||||
# Auto-refresh: 1 sec timeout
|
# Auto-refresh: 30 sec timeout
|
||||||
if read -t 1 -r choice; then
|
if read -t 30 -r choice; then
|
||||||
case "$choice" in
|
case "$choice" in
|
||||||
1) submenu_proxy ;;
|
1) submenu_proxy ;;
|
||||||
2) submenu_stats ;;
|
2) submenu_stats ;;
|
||||||
@@ -957,32 +957,57 @@ main() {
|
|||||||
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
|
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
|
||||||
*) log_error "Неверный выбор" ;;
|
*) log_error "Неверный выбор" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# Пауза после подменю (кроме статистики — у неё свой цикл)
|
||||||
|
if [ "$choice" != "2" ]; then
|
||||||
|
echo ""
|
||||||
|
echo -ne " ${DIM}Нажмите Enter для возврата в меню...${NC}"
|
||||||
|
read -r
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
# If read timed out, loop refreshes the dashboard
|
# If read timed out, loop refreshes the dashboard
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Статистика (авто-обновление 1 сек) ──────────────────────────────────────
|
# ── Статистика (авто-обновление 1 сек, без мерцания) ───────────────────────
|
||||||
submenu_stats() {
|
submenu_stats() {
|
||||||
# Инициализируем статистику при первом входе
|
# Инициализируем статистику при первом входе
|
||||||
if type stats_init &>/dev/null; then
|
if type stats_init &>/dev/null; then
|
||||||
stats_init 2>/dev/null
|
stats_init 2>/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local line2; line2=$(printf '─%.0s' {1..54})
|
||||||
|
local first_draw=1
|
||||||
|
|
||||||
|
# Скрываем курсор для плавного обновления
|
||||||
|
tput civis 2>/dev/null
|
||||||
|
|
||||||
|
# Восстанавливаем курсор при выходе из функции
|
||||||
|
trap 'tput cnorm 2>/dev/null; trap - RETURN' RETURN
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
if [ "$first_draw" -eq 1 ]; then
|
||||||
echo ""
|
clear
|
||||||
|
first_draw=0
|
||||||
|
else
|
||||||
|
# Перемещаем курсор в начало экрана вместо clear — нет мерцания
|
||||||
|
tput cup 0 0 2>/dev/null || printf '\033[H'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Рисуем весь экран поверх старого содержимого
|
||||||
|
echo -e "\033[J" # очищаем от курсора до конца (убирает хвосты)
|
||||||
echo -e " ${BOLD}${WHITE}📊 Статистика трафика${NC}"
|
echo -e " ${BOLD}${WHITE}📊 Статистика трафика${NC}"
|
||||||
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
|
echo -e " ${DIM}${line2}${NC}"
|
||||||
|
|
||||||
if type show_traffic_stats &>/dev/null; then
|
if type show_traffic_stats &>/dev/null; then
|
||||||
show_traffic_stats
|
show_traffic_stats
|
||||||
else
|
else
|
||||||
echo -e " ${DIM}Модуль статистики не загружен.${NC}"
|
echo -e " ${DIM}Модуль статистики не загружен.${NC}"
|
||||||
echo -e " ${DIM}Файл lib/stats.sh не найден.${NC}"
|
echo -e " ${DIM}Файл lib/stats.sh не найден.${NC}"
|
||||||
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
|
echo -e " ${DIM}${line2}${NC}"
|
||||||
local stats_on="вкл"
|
local stats_on="вкл"
|
||||||
if type toggle_stats &>/dev/null; then
|
if type toggle_stats &>/dev/null; then
|
||||||
local cfg_val
|
local cfg_val
|
||||||
@@ -992,27 +1017,34 @@ submenu_stats() {
|
|||||||
echo -e " ${CYAN}1${NC}) Вкл/Выкл подсчёт (сейчас: ${stats_on})"
|
echo -e " ${CYAN}1${NC}) Вкл/Выкл подсчёт (сейчас: ${stats_on})"
|
||||||
echo -e " ${CYAN}2${NC}) Установить/обновить сборщик статистики"
|
echo -e " ${CYAN}2${NC}) Установить/обновить сборщик статистики"
|
||||||
echo -e " ${CYAN}0${NC}) ${DIM}← Назад${NC}"
|
echo -e " ${CYAN}0${NC}) ${DIM}← Назад${NC}"
|
||||||
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
|
echo -e " ${DIM}${line2}${NC}"
|
||||||
echo -e " ${DIM}Обновление через 1 сек${NC}"
|
echo -e " ${DIM}Обновление каждую секунду${NC}"
|
||||||
|
|
||||||
|
# Показываем курсор для ввода, потом снова скрываем
|
||||||
|
tput cnorm 2>/dev/null
|
||||||
echo -ne " ${WHITE}▸ ${NC}"
|
echo -ne " ${WHITE}▸ ${NC}"
|
||||||
|
|
||||||
if read -t 1 -r ch; then
|
if read -t 1 -r ch; then
|
||||||
|
tput civis 2>/dev/null
|
||||||
case "$ch" in
|
case "$ch" in
|
||||||
1)
|
1)
|
||||||
if type toggle_stats &>/dev/null; then
|
if type toggle_stats &>/dev/null; then
|
||||||
toggle_stats
|
toggle_stats
|
||||||
echo -ne " ${DIM}Нажмите Enter...${NC}"; read -r
|
echo -ne " ${DIM}Нажмите Enter...${NC}"; read -r
|
||||||
|
first_draw=1 # полная перерисовка после действия
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
if type install_stats_collector &>/dev/null; then
|
if type install_stats_collector &>/dev/null; then
|
||||||
install_stats_collector
|
install_stats_collector
|
||||||
echo -ne " ${DIM}Нажмите Enter...${NC}"; read -r
|
echo -ne " ${DIM}Нажмите Enter...${NC}"; read -r
|
||||||
|
first_draw=1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
0|"") return ;;
|
0|"") return ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
tput civis 2>/dev/null
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user