diff --git a/install.sh b/install.sh index ddf21f0..682a209 100644 --- a/install.sh +++ b/install.sh @@ -395,9 +395,19 @@ menu_setup_bot() { if systemctl is-active --quiet "$SERVICE_NAME" 2>/dev/null; then echo -e " Статус бота: ${GREEN}работает${NC}" echo "" + # Показываем текущие настройки + local cur_ids + cur_ids=$(grep "^ALLOWED_IDS=" "$BOT_DIR/.env" 2>/dev/null | cut -d= -f2) + if [ -n "$cur_ids" ]; then + echo -e " Администратор(ы): ${WHITE}$cur_ids${NC}" + else + echo -e " Администратор: ${YELLOW}не задан (бот доступен всем)${NC}" + fi + echo "" echo -e " 1) Обновить файлы бота и перезапустить" echo -e " 2) Изменить BOT_TOKEN" - echo -e " 3) Остановить бота" + echo -e " 3) Изменить администратора (ALLOWED_IDS)" + echo -e " 4) Остановить бота" echo -e " 0) Назад" local sub read -p " Выбор: " sub @@ -414,7 +424,7 @@ menu_setup_bot() { read -r tok tok=$(echo "$tok" | tr -d '[:space:]') if [ -n "$tok" ]; then - echo "BOT_TOKEN=$tok" > "$BOT_DIR/.env" + sed -i "s/^BOT_TOKEN=.*/BOT_TOKEN=$tok/" "$BOT_DIR/.env" chmod 600 "$BOT_DIR/.env" systemctl restart "$SERVICE_NAME" echo -e "${GREEN}[*] Токен обновлён, бот перезапущен.${NC}" @@ -423,6 +433,23 @@ menu_setup_bot() { fi ;; 3) + echo -e "${YELLOW}Введите Telegram ID администратора (или несколько через запятую):${NC}" + echo -e " ${CYAN}Узнать ID: @userinfobot, @getmyid_bot или @RawDataBot${NC}" + echo -e " ${CYAN}Оставьте пустым — бот будет доступен всем.${NC}" + local new_ids + read -r new_ids + new_ids=$(echo "$new_ids" | tr -d '[:space:]') + # Удаляем старую строку ALLOWED_IDS + sed -i "/^ALLOWED_IDS=/d" "$BOT_DIR/.env" + if [ -n "$new_ids" ]; then + echo "ALLOWED_IDS=$new_ids" >> "$BOT_DIR/.env" + echo -e "${GREEN}[*] Администратор(ы): $new_ids. Перезапуск...${NC}" + else + echo -e "${GREEN}[*] Ограничение снято, бот доступен всем. Перезапуск...${NC}" + fi + systemctl restart "$SERVICE_NAME" + ;; + 4) systemctl stop "$SERVICE_NAME" echo -e "${YELLOW}Бот остановлен.${NC}" ;; @@ -466,19 +493,41 @@ menu_setup_bot() { # venv + pip install_bot_deps - # BOT_TOKEN + # BOT_TOKEN + ALLOWED_IDS if [ ! -f "$BOT_DIR/.env" ]; then echo "" echo -e "${YELLOW}Введите BOT_TOKEN от @BotFather:${NC}" + echo -e " ${CYAN}(Откройте @BotFather в Telegram → /newbot → скопируйте токен)${NC}" local TOKEN="" while [ -z "$TOKEN" ]; do read -r TOKEN TOKEN=$(echo "$TOKEN" | tr -d '[:space:]') [ -z "$TOKEN" ] && echo -e "${RED}Токен не может быть пустым.${NC}" done - echo "BOT_TOKEN=$TOKEN" > "$BOT_DIR/.env" + + echo "" + echo -e "${YELLOW}Введите ваш Telegram ID (администратор бота):${NC}" + echo -e " ${CYAN}Как узнать свой ID:${NC}" + echo -e " • Бот ${WHITE}@userinfobot${NC} — напишите ему /start" + echo -e " • Бот ${WHITE}@getmyid_bot${NC} — напишите ему /start" + echo -e " • Бот ${WHITE}@RawDataBot${NC} — напишите ему /start" + echo -e " ${CYAN}Можно указать несколько через запятую: 123456,789012${NC}" + echo -e " ${CYAN}Оставьте пустым, чтобы бот был доступен всем.${NC}" + local ADMIN_IDS="" + read -r ADMIN_IDS + ADMIN_IDS=$(echo "$ADMIN_IDS" | tr -d '[:space:]') + + { + echo "BOT_TOKEN=$TOKEN" + [ -n "$ADMIN_IDS" ] && echo "ALLOWED_IDS=$ADMIN_IDS" + } > "$BOT_DIR/.env" chmod 600 "$BOT_DIR/.env" - echo -e "${GREEN}[*] .env создан.${NC}" + + if [ -n "$ADMIN_IDS" ]; then + echo -e "${GREEN}[*] .env создан. Администратор(ы): $ADMIN_IDS${NC}" + else + echo -e "${GREEN}[*] .env создан. Бот доступен всем пользователям.${NC}" + fi else echo -e "${GREEN}[*] .env уже есть — используем существующий.${NC}" fi @@ -586,10 +635,12 @@ async def check_port(port): if await proxy_running(): hp = await docker_val("{{range $p,$c := .HostConfig.PortBindings}}{{(index $c 0).HostPort}} {{end}}") if str(port) in hp.split(): return None - code, out, _ = await sh("ss","-tlnp", timeout=5) - if code != 0: code, out, _ = await sh("netstat","-tlnp", timeout=5) - for line in out.splitlines(): - if f":{port} " in line or f":{port}\t" in line: return line + for cmd in ["/usr/sbin/ss", "/sbin/ss", "ss", "netstat"]: + code, out, _ = await sh(cmd, "-tlnp", timeout=5) + if code == 0 and out: + for line in out.splitlines(): + if re.search(rf":{port}\b", line): return line + return None return None async def docker_containers_info(): @@ -763,8 +814,12 @@ async def cmd_promo(update, ctx): msg = update.message or (update.callback_query and update.callback_query.message) if not update.effective_user or not msg: return if not _ok(update.effective_user.id): return - text = ("💰 Хостинг со скидкой до -60%\n" - f"Ссылка: {PROMO_LINK}\n\nПромокоды: OFF60, antenka20, antenka6, antenka12\n\nДонат: {TIP_LINK}") + text = ("💰 Хостинг со скидкой до -60%\n\n" + f"Хостинг #1: {PROMO_LINK}\n" + "Промокоды: OFF60, antenka20, antenka6, antenka12\n\n" + "Хостинг #2: https://vk.cc/cUxAhj\n" + "Промокод: OFF60\n\n" + f"☕ Донат: {TIP_LINK}") kb = InlineKeyboardMarkup([[InlineKeyboardButton("◀️ Меню", callback_data="menu_main")]]) if update.callback_query: await update.callback_query.edit_message_text(text, parse_mode="HTML", reply_markup=kb)