From 69bd0c1d63b7a0776f5d7aab67abc801cabbfc38 Mon Sep 17 00:00:00 2001 From: Yuriy Yuriev Date: Mon, 18 May 2026 19:07:56 +0700 Subject: [PATCH] fix command --- handlers/commands.py | 84 ++++++++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/handlers/commands.py b/handlers/commands.py index 304ff24..52eeef4 100644 --- a/handlers/commands.py +++ b/handlers/commands.py @@ -814,14 +814,14 @@ class BotInterface: else str(params.min_series) ) perlink_label = ( - f"πŸ”’ *Кликов Π² ΠΎΠ΄Π½ΠΎΠΉ сСрии*\n" + f"πŸ”’ *Кликов Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅*\n" f"Бколько ΠΊΠ»ΠΈΠΊΠΎΠ² подряд Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ°ΡƒΠ·ΠΎΠΉ.\n" f"Π’Π΅ΠΊΡƒΡ‰Π΅Π΅: {cur}\n" f"Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ `2-5` ΠΈΠ»ΠΈ фиксированно `3`." ) delay_label = ( - f"⏱️ *ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ сСриями*\n" - f"Бколько сСкунд ΠΆΠ΄Π°Ρ‚ΡŒ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сСрии ΠΊΠ»ΠΈΠΊΠΎΠ².\n" + f"⏱️ *ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ*\n" + f"Бколько сСкунд ΠΆΠ΄Π°Ρ‚ΡŒ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° ΠΊΠ»ΠΈΠΊΠΎΠ².\n" f"ВСкущая: {params.min_delay}–{params.max_delay} сСк\n" f"Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ `30-60` ΠΈΠ»ΠΈ фиксированно `45`." ) @@ -856,8 +856,8 @@ class BotInterface: ), "perlink": perlink_label, "clickdelay": ( - f"⏳ *Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ Π² сСрии*\n" - f"Бколько сСкунд ΠΆΠ΄Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΊΠ»ΠΈΠΊΠΎΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠΉ сСрии.\n" + f"⏳ *Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ Π² Ρ†ΠΈΠΊΠ»Π΅*\n" + f"Бколько сСкунд ΠΆΠ΄Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΊΠ»ΠΈΠΊΠΎΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°.\n" f"ВСкущая: {params.min_click_delay}–{params.max_click_delay} сСк\n" f"Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ `5-15` ΠΈΠ»ΠΈ фиксированно `10`." ), @@ -1734,7 +1734,7 @@ class BotInterface: mn = mx = int(value) await self.task_manager.update_task(task_id, min_series=mn, max_series=mx) lbl = f"{mn}–{mx}" if mn != mx else str(mn) - await message.answer(f"βœ… БСрия: {lbl} ΠΊΠ»ΠΈΠΊΠΎΠ²") + await message.answer(f"βœ… Π¦ΠΈΠΊΠ»: {lbl} ΠΊΠ»ΠΈΠΊΠΎΠ²") else: await self.task_manager.update_task(task_id, visits_per_link=int(value)) await message.answer(f"βœ… На ссылку: {value}") @@ -1809,9 +1809,9 @@ class BotInterface: info = ( f"πŸ”— {params.url[:50]}\n" f"πŸ“Š Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ: {params.successful_visits} ΠΈΠ· {params.max_visits} ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ²\n\n" - f"πŸ”’ Кликов Π² сСрии: {series_range}\n" + f"πŸ”’ Кликов Π² Ρ†ΠΈΠΊΠ»Π΅: {series_range}\n" f"⏳ Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ: {params.min_click_delay}–{params.max_click_delay} сСк\n" - f"⏱ ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ сСриями: {params.min_delay}–{params.max_delay} сСк\n" + f"⏱ ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ: {params.min_delay}–{params.max_delay} сСк\n" f"πŸ“– ВрСмя Π½Π° страницС: {params.min_reading}–{params.max_reading} сСк" ) else: @@ -1844,16 +1844,14 @@ class BotInterface: ) if params.task_type == "user_visit": builder.row( - InlineKeyboardButton(text="πŸ”’ Π Π°Π·ΠΌΠ΅Ρ€ сСрии", callback_data=f"uset_{task_id}_perlink"), + InlineKeyboardButton(text="πŸ”’ Π Π°Π·ΠΌΠ΅Ρ€ Ρ†ΠΈΠΊΠ»Π°", callback_data=f"uset_{task_id}_perlink"), InlineKeyboardButton(text="⏳ ΠœΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ", callback_data=f"uset_{task_id}_clickdelay"), ) else: builder.row( - InlineKeyboardButton(text="πŸ‘₯ % Π·Ρ€ΠΈΡ‚Π΅Π»Π΅ΠΉ", callback_data=f"uset_{task_id}_percent"), - InlineKeyboardButton(text="πŸ”— Π Π΅Π·Π΅Ρ€Π² ΠΊΠ»ΠΈΠΊΠΎΠ²", callback_data=f"uset_{task_id}_perlink"), - InlineKeyboardButton(text="πŸ“Š CTR %", callback_data=f"uset_{task_id}_ctr"), + InlineKeyboardButton(text="πŸ“Š % CTR Π·Ρ€ΠΈΡ‚Π΅Π»Π΅ΠΉ", callback_data=f"uset_{task_id}_ctr"), + InlineKeyboardButton(text="🌐 Π”ΠΎΠΌΠ΅Π½Ρ‹", callback_data=f"uedit_{task_id}"), ) - builder.row(InlineKeyboardButton(text="🌐 Π”ΠΎΠΌΠ΅Π½Ρ‹", callback_data=f"uedit_{task_id}")) builder.row(InlineKeyboardButton(text="πŸ”™ К Π·Π°Π΄Π°Ρ‡Π°ΠΌ", callback_data="my_tasks")) try: @@ -1955,7 +1953,7 @@ class BotInterface: async def _run_url_visits(self, task_id: str, params: TaskParams, bot): - """ΠŸΠΎΡΠ΅Ρ‰Π°Π΅Ρ‚ URL сСриями: sleep(мСТсСрийная) β†’ N ΠΊΠ»ΠΈΠΊΠΎΠ²(+sleep ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ) β†’ ΠΏΠΎΠ²Ρ‚ΠΎΡ€.""" + """ΠŸΠΎΡΠ΅Ρ‰Π°Π΅Ρ‚ URL Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ: sleep(мСТцикловая) β†’ N ΠΊΠ»ΠΈΠΊΠΎΠ²(+sleep ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ) β†’ ΠΏΠΎΠ²Ρ‚ΠΎΡ€.""" total_done = 0 max_v = params.max_visits or 1 @@ -1969,15 +1967,15 @@ class BotInterface: try: while total_done < max_v and not params.stopped: - # --- ΠΏΠ°ΡƒΠ·Π° ΠΏΠ΅Ρ€Π΅Π΄ сСриСй --- + # --- ΠΏΠ°ΡƒΠ·Π° ΠΏΠ΅Ρ€Π΅Π΄ Ρ†ΠΈΠΊΠ»ΠΎΠΌ --- await _sleep_interruptible(params.get_delay()) if params.stopped: break - # Ρ€Π°Π·ΠΌΠ΅Ρ€ сСрии выбираСтся случайно ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· + # Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ†ΠΈΠΊΠ»Π° выбираСтся случайно ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· series_size = params.get_series_size() - # --- сСрия ΠΊΠ»ΠΈΠΊΠΎΠ² --- + # --- Ρ†ΠΈΠΊΠ» ΠΊΠ»ΠΈΠΊΠΎΠ² --- for click_num in range(series_size): if params.stopped or total_done >= max_v: break @@ -2007,7 +2005,7 @@ class BotInterface: logger.error(f"URL visit error: {e}") total_done += 1 - # Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрии (ΠΊΡ€ΠΎΠΌΠ΅ послСднСго) + # Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° (ΠΊΡ€ΠΎΠΌΠ΅ послСднСго) if click_num < series_size - 1 and not params.stopped and total_done < max_v: await _sleep_interruptible(params.get_click_delay()) @@ -2171,6 +2169,11 @@ class BotInterface: builder.row(InlineKeyboardButton(text="πŸ”™ К ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ", callback_data=f"udetail_{user_id}")) else: for tid, p in list(user_tasks.items())[:8]: + if p.task_type == "user_visit": + domain = extract_domain(p.url)[:18] if p.url else "?" + label = f"πŸ”— {domain}" + else: + label = f"πŸ“Ί {p.channel}" if not p.completed and not p.stopped: pause_btn = ( InlineKeyboardButton(text="▢️", callback_data=f"uresume_{tid}") @@ -2178,13 +2181,14 @@ class BotInterface: InlineKeyboardButton(text="⏸️", callback_data=f"upause_{tid}") ) builder.row( + InlineKeyboardButton(text=label, callback_data=f"utask_{tid}"), pause_btn, InlineKeyboardButton(text="βš™οΈ", callback_data=f"utask_{tid}"), InlineKeyboardButton(text="πŸ—‘οΈ", callback_data=f"ustop_{tid}"), ) else: builder.row(InlineKeyboardButton( - text=f"πŸ—‘οΈ {p.channel} (Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°)", + text=f"πŸ—‘οΈ {label} (Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°)", callback_data=f"ustop_{tid}" )) builder.row(InlineKeyboardButton(text="πŸ“ Новая Π·Π°Π΄Π°Ρ‡Π°", callback_data="new_task")) @@ -2241,7 +2245,7 @@ class BotInterface: builder = InlineKeyboardBuilder() builder.row(InlineKeyboardButton(text="❌ ΠžΡ‚ΠΌΠ΅Π½Π°", callback_data="cancel_new_task")) sent = await message.answer( - f"πŸ”— {text[:50]}\n\nΠ¨Π°Π³ 2/3 β€” Π²Π²Π΅Π΄ΠΈΡ‚Π΅ количСство ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ²:", + f"πŸ”— {text[:50]}\n\nΠ¨Π°Π³ 2/4 β€” Π²Π²Π΅Π΄ΠΈΡ‚Π΅ количСство ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ²:", reply_markup=builder.as_markup() ) self._menu_msg[user_id] = sent.message_id @@ -2270,9 +2274,9 @@ class BotInterface: builder.row(InlineKeyboardButton(text="❌ ΠžΡ‚ΠΌΠ΅Π½Π°", callback_data="cancel_new_task")) sent = await message.answer( f"βœ… ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ²: {count}\n\n" - "Π¨Π°Π³ 3/3 β€” сколько ΠΊΠ»ΠΈΠΊΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΉ сСрии?\n\n" - "Π‘ΠΎΡ‚ Π΄Π΅Π»Π°Π΅Ρ‚ N ΠΊΠ»ΠΈΠΊΠΎΠ² подряд, Π·Π°Ρ‚Π΅ΠΌ ΠΆΠ΄Ρ‘Ρ‚ ΠΏΠ°ΡƒΠ·Ρƒ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΠ΅Ρ€ΠΈΡŽ.\n\n" - "Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ `2-5` β€” каТдая сСрия Π±ΡƒΠ΄Π΅Ρ‚ случайной Π΄Π»ΠΈΠ½Ρ‹ ΠΎΡ‚ 2 Π΄ΠΎ 5.\n" + "Π¨Π°Π³ 3/4 β€” сколько ΠΊΠ»ΠΈΠΊΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅?\n\n" + "Π‘ΠΎΡ‚ Π΄Π΅Π»Π°Π΅Ρ‚ N ΠΊΠ»ΠΈΠΊΠΎΠ² подряд, Π·Π°Ρ‚Π΅ΠΌ ΠΆΠ΄Ρ‘Ρ‚ ΠΏΠ°ΡƒΠ·Ρƒ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ†ΠΈΠΊΠ».\n\n" + "Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ `2-5` β€” ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ случайной Π΄Π»ΠΈΠ½Ρ‹ ΠΎΡ‚ 2 Π΄ΠΎ 5.\n" "Одно число `3` β€” всСгда Ρ€ΠΎΠ²Π½ΠΎ 3 ΠΊΠ»ΠΈΠΊΠ°.", reply_markup=builder.as_markup() ) @@ -2290,12 +2294,38 @@ class BotInterface: await self._send_temp(message, "Π’Π²Π΅Π΄ΠΈΡ‚Π΅ число ΠΈΠ»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: `3` ΠΈΠ»ΠΈ `2-5`") return + if user_id in self._menu_msg: + await self._safe_delete(message.bot, message.chat.id, self._menu_msg.pop(user_id)) + self._user_task_state[user_id] = {**state, "step": "delay", "min_series": mn, "max_series": mx} + builder = InlineKeyboardBuilder() + builder.row(InlineKeyboardButton(text="❌ ΠžΡ‚ΠΌΠ΅Π½Π°", callback_data="cancel_new_task")) + series_label = f"{mn}–{mx}" if mn != mx else str(mn) + sent = await message.answer( + f"βœ… Π¦ΠΈΠΊΠ»: {series_label} ΠΊΠ»ΠΈΠΊΠΎΠ²\n\n" + "Π¨Π°Π³ 4/4 β€” Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ (Π² ΠΌΠΈΠ½ΡƒΡ‚Π°Ρ…)\n\n" + "Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΎΠ΄Π½ΠΎ число, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `3` β€” ΠΏΠ°ΡƒΠ·Π° 3 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹.", + reply_markup=builder.as_markup() + ) + self._menu_msg[user_id] = sent.message_id + + elif state["step"] == "delay": + try: + mn_d = mx_d = int(text) + if mn_d < 1: + raise ValueError + except Exception: + await self._send_temp(message, "Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ†Π΅Π»ΠΎΠ΅ число ΠΌΠΈΠ½ΡƒΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: `3`") + return + del self._user_task_state[user_id] await self._clean_prev(message) url = state["url"] count = state["count"] + mn = state["min_series"] + mx = state["max_series"] series_label = f"{mn}–{mx}" if mn != mx else str(mn) + delay_label = str(mn_d) task_id = f"u{user_id}_{extract_domain(url)[:12]}_{datetime.now().strftime('%H%M%S')}" params = TaskParams( @@ -2305,8 +2335,8 @@ class BotInterface: min_series=mn, max_series=mx, user_id=user_id, - min_delay=settings.DEFAULT_MIN_DELAY, - max_delay=settings.DEFAULT_MAX_DELAY, + min_delay=mn_d * 60, + max_delay=mx_d * 60, min_reading=settings.DEFAULT_MIN_READING, max_reading=settings.DEFAULT_MAX_READING, started_at=datetime.now(), @@ -2327,8 +2357,8 @@ class BotInterface: await self._send_temp( message, f"βœ… Π—Π°Π΄Π°Ρ‡Π° создана\nπŸ”— {url[:50]}\n" - f"πŸ”’ ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ²: {count} | БСрия: {series_label} ΠΊΠ»ΠΈΠΊΠΎΠ²\n" - f"⏱ ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ сСриями: {settings.DEFAULT_MIN_DELAY}–{settings.DEFAULT_MAX_DELAY} сСк", + f"πŸ”’ ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ²: {count} | Π¦ΠΈΠΊΠ»: {series_label} ΠΊΠ»ΠΈΠΊΠΎΠ²\n" + f"⏱ ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ: {delay_label} ΠΌΠΈΠ½", delay=6 ) await self._show_user_menu(message, user_id=user_id)