fix command
This commit is contained in:
+28
-24
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user