diff --git a/bot.py b/bot.py index bf9e61a..77f2794 100644 --- a/bot.py +++ b/bot.py @@ -79,7 +79,7 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: "Используй /help для списка команд." ) -# --- Команда /help --- +# --- Команда /help (ИСПРАВЛЕНО форматирование Markdown) --- async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: if update.message is None: logger.warning("Received an update without a message object in help handler.") @@ -93,13 +93,13 @@ async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> No "**/status** - Показать текущий статус всех активных загрузок и управлять ими.\n" "**/stop_torrent** - Выбрать и остановить загрузку торрента (устаревает, используйте /status).\n" "**/help** - Показать это справочное сообщение.\n\n" - "Также вы можете отправить мне *magnet-ссылку* или *URL torrent-файла* " + "Также вы можете отправить мне `magnet-ссылку` или `URL torrent-файла` " # ИСПРАВЛЕНО: Использованы обратные апострофы "для добавления загрузки. Бот предложит выбрать категорию и директорию." ) await update.message.reply_text(help_text, parse_mode="Markdown") -# --- Команда /status (ОБНОВЛЕНО с учетом точных статусов) --- +# --- Команда /status --- async def status(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: if update.message is None: logger.warning("Received an update without a message object in status handler.") @@ -120,8 +120,6 @@ async def status(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: return for torrent in torrents: - # logger.info(f"Torrent '{torrent.name}' has state: '{torrent.state}'") # Временное логирование удалено - download_speed = torrent.dlspeed / (1024 * 1024) if torrent.dlspeed >= (1024 * 1024) else torrent.dlspeed / 1024 upload_speed = torrent.upspeed / (1024 * 1024) if torrent.upspeed >= (1024 * 1024) else torrent.upspeed / 1024 @@ -129,7 +127,7 @@ async def status(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: up_unit = "MB/s" if torrent.upspeed >= (1024 * 1024) else "KB/s" eta_str = "" - if torrent.eta == 8640000: # qBittorrent returns 8640000 for "infinite" ETA + if torrent.eta == 8640000: eta_str = "∞" elif torrent.eta > 0: hours, remainder = divmod(torrent.eta, 3600) @@ -159,7 +157,7 @@ async def status(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: 'queuedDL', 'checkingUP', 'queuedUP' ] paused_states = [ - 'pausedDL', 'pausedUP', 'stoppedUP', 'stoppedDL' # Корректные статусы из логов + 'pausedDL', 'pausedUP', 'stoppedUP', 'stoppedDL' ] if torrent.state in active_states: @@ -167,9 +165,8 @@ async def status(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: elif torrent.state in paused_states: keyboard.append(InlineKeyboardButton("▶️ Запустить", callback_data=f"start_hash_{torrent.hash}")) elif torrent.state == 'metaDL': - pass # Не предлагаем кнопок, пока не начнется фактическая загрузка + pass else: - # Если торрент не в активных и не в явных "пауза/остановлено" keyboard.append(InlineKeyboardButton("ℹ️ Неизвестное состояние", callback_data=f"info_hash_{torrent.hash}")) @@ -245,7 +242,7 @@ async def start_torrent_callback(update: Update, context: ContextTypes.DEFAULT_T await query.edit_message_text(f"Торрент ({torrent_hash[:6]}...) успешно запущен (возобновлен).") except APIError as e: logger.error(f"Error resuming torrent {torrent_hash}: {e}") - await query.edit_message_text(f"Ошибка при запуске торрента: {e}") + await query.edit_message_text(f"Ошибка при запуске торrenta: {e}") except Exception as e: logger.error(f"An unexpected error occurred during torrent resuming: {e}") await query.edit_message_text(f"Произошла непредвиденная ошибка: {e}") @@ -318,12 +315,10 @@ async def send_directory_options(query, context): "/share/Data/torrents", ] - # Убедимся, что пути уникальны и отсортированы available_paths = sorted(list(set([p.replace(os.sep, '/') for p in available_paths if p]))) directory_keyboard = [] for path in available_paths: - # Отображаем только имя папки, если путь слишком длинный display_path = os.path.basename(path) if len(path) > 30 else path directory_keyboard.append([InlineKeyboardButton(display_path, callback_data=f"select_dir_{path}")]) @@ -372,7 +367,6 @@ async def select_directory_callback(update: Update, context: ContextTypes.DEFAUL f"Категория: {category or 'Без категории'}\n" f"Директория: {selected_directory}" ) - # Очищаем данные пользователя после успешного добавления if 'current_torrent_url' in context.user_data: del context.user_data['current_torrent_url'] if 'selected_category' in context.user_data: