fix command

This commit is contained in:
Yuriy Yuriev
2026-05-22 20:02:27 +07:00
parent 858d40d923
commit 54db810f9e
+28 -24
View File
@@ -1039,17 +1039,18 @@ class BotInterface:
interface._menu_msg[uid] = callback.message.message_id interface._menu_msg[uid] = callback.message.message_id
await callback.answer() await callback.answer()
@dp.callback_query(F.data == "skip_percent") @dp.callback_query(F.data == "skip_twitch_ctr")
async def cb_skip_percent(callback: CallbackQuery): async def cb_skip_twitch_ctr(callback: CallbackQuery):
uid = callback.from_user.id uid = callback.from_user.id
state = interface._user_task_state.pop(uid, None) state = interface._user_task_state.pop(uid, None)
if not state or state.get("step") != "percent": if not state or state.get("step") != "twitch_ctr":
await callback.answer() await callback.answer()
return return
interface._menu_msg.pop(uid, None) interface._menu_msg.pop(uid, None)
await callback.message.delete() await callback.message.delete()
await interface._create_twitch_task( await interface._create_twitch_task(
callback.message, uid, state["channel"], state["domains"], 0.0 callback.message, uid, state["channel"], state["domains"],
min_ctr=0.8, max_ctr=1.0
) )
await callback.answer() await callback.answer()
@@ -2815,38 +2816,41 @@ class BotInterface:
await self._show_user_tasks(message, user_id) await self._show_user_tasks(message, user_id)
return return
# Новая задача — идём к шагу ввода процента зрителей # Новая задача — идём к шагу ввода CTR
if user_id in self._menu_msg: if user_id in self._menu_msg:
await self._safe_delete(message.bot, message.chat.id, self._menu_msg.pop(user_id)) await self._safe_delete(message.bot, message.chat.id, self._menu_msg.pop(user_id))
self._user_task_state[user_id] = { self._user_task_state[user_id] = {
"step": "percent", "step": "twitch_ctr",
"channel": state["channel"], "channel": state["channel"],
"domains": domains, "domains": domains,
} }
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="⏭️ Без процента", callback_data="skip_percent")) builder.row(InlineKeyboardButton(text="⏭️ По умолчанию", callback_data="skip_twitch_ctr"))
builder.row(InlineKeyboardButton(text="❌ Отмена", callback_data="cancel_new_task")) builder.row(InlineKeyboardButton(text="❌ Отмена", callback_data="cancel_new_task"))
sent = await message.answer( sent = await message.answer(
f"📺 Канал: {state['channel']}\n" f"📺 Канал: {state['channel']}\n"
f"🌐 Домены: {', '.join(domains)}\n\n" f"🌐 Домены: {', '.join(domains)}\n\n"
"Шаг 3/3 — введите % от зрителей для расчёта переходов на ссылку:\n" "Шаг 3/3 — CTR\n\n"
"(например: 5 = 5% от текущих зрителей)\n" "Введите минимальный и максимальный % от зрителей для расчёта переходов на ссылку\n"
"Или нажмите «Без процента» для фиксированного значения", "(например: `0.5-1.5` % от текущих зрителей)",
reply_markup=builder.as_markup() reply_markup=builder.as_markup()
) )
self._menu_msg[user_id] = sent.message_id self._menu_msg[user_id] = sent.message_id
elif state["step"] == "percent": elif state["step"] == "twitch_ctr":
try: try:
percent = float(text.replace(",", ".")) min_ctr, max_ctr = parse_range(text, default_min=1)
if percent <= 0 or percent > 100: if min_ctr <= 0 or max_ctr > 100:
raise ValueError raise ValueError
except ValueError: except (ValueError, Exception):
await self._send_temp(message, "Введите число от 0.1 до 100") await self._send_temp(message, "Введите диапазон `0.8-1.2` или одно число `1`")
return return
await self._clean_prev(message) await self._clean_prev(message)
del self._user_task_state[user_id] del self._user_task_state[user_id]
await self._create_twitch_task(message, user_id, state["channel"], state["domains"], percent) await self._create_twitch_task(
message, user_id, state["channel"], state["domains"],
min_ctr=min_ctr, max_ctr=max_ctr
)
return return
# ========================================================================= # =========================================================================
@@ -2984,7 +2988,8 @@ class BotInterface:
async def _create_twitch_task( async def _create_twitch_task(
self, message: Message, user_id: int, self, message: Message, user_id: int,
channel: str, domains: list, visits_percent: float channel: str, domains: list,
min_ctr: float = 0.8, max_ctr: float = 1.0,
): ):
"""Создаёт twitch_irc задачу и запускает её.""" """Создаёт twitch_irc задачу и запускает её."""
balance = await self.balance_storage.get_balance(user_id) balance = await self.balance_storage.get_balance(user_id)
@@ -2992,9 +2997,8 @@ class BotInterface:
await self._send_temp(message, "Недостаточно переходов") await self._send_temp(message, "Недостаточно переходов")
return return
# Проверяем статус стрима до создания задачи (None = ошибка запроса → считаем онлайн)
viewers = await get_viewer_count(channel) viewers = await get_viewer_count(channel)
is_offline = (viewers == 0) # None → не 0 → False → онлайн is_offline = (viewers == 0)
task_id = f"u{user_id}_{channel}_{datetime.now().strftime('%H%M%S')}" task_id = f"u{user_id}_{channel}_{datetime.now().strftime('%H%M%S')}"
params = TaskParams( params = TaskParams(
@@ -3004,9 +3008,8 @@ class BotInterface:
allowed_domains=domains, allowed_domains=domains,
user_id=user_id, user_id=user_id,
visits_per_link=settings.DEFAULT_VISITS_PER_LINK, visits_per_link=settings.DEFAULT_VISITS_PER_LINK,
visits_percent=visits_percent, min_ctr=min_ctr,
min_ctr=visits_percent if visits_percent > 0 else 0.8, max_ctr=max_ctr,
max_ctr=visits_percent if visits_percent > 0 else 1.0,
monitor_minutes=0, monitor_minutes=0,
min_delay=settings.DEFAULT_MIN_DELAY, min_delay=settings.DEFAULT_MIN_DELAY,
max_delay=settings.DEFAULT_MAX_DELAY, max_delay=settings.DEFAULT_MAX_DELAY,
@@ -3028,13 +3031,14 @@ class BotInterface:
if success: if success:
if self.storage: if self.storage:
await self.storage.save_task(task_id, params) await self.storage.save_task(task_id, params)
percent_info = f"\n📊 {visits_percent}% от зрителей" if visits_percent > 0 else "" ctr_str = f"{min_ctr}%" if min_ctr == max_ctr else f"{min_ctr}{max_ctr}%"
status = f"⏸ Стрим оффлайн — задача на паузе" if is_offline else f"▶️ Онлайн: {viewers} зрителей" status = f"⏸ Стрим оффлайн — задача на паузе" if is_offline else f"▶️ Онлайн: {viewers} зрителей"
await self._send_temp( await self._send_temp(
message, message,
f"✅ Задача создана\n" f"✅ Задача создана\n"
f"📺 {channel} | 🌐 {', '.join(domains)}\n" f"📺 {channel} | 🌐 {', '.join(domains)}\n"
f"{status}{percent_info}", f"📊 CTR: {ctr_str} от зрителей\n"
f"{status}",
delay=6 delay=6
) )
await self._show_user_menu(message, user_id=user_id) await self._show_user_menu(message, user_id=user_id)