- Show active vs closed raffles for each login - Display win/loss status (🏆 for winners, ✗ for non-winners) - Limit display to 5 active + 3 closed raffles - Update help documentation with detailed status explanation - Add status icons (✅/⏸️) for active/inactive logins
283 lines
15 KiB
Python
283 lines
15 KiB
Python
"""Обработчики справки и помощи пользователям"""
|
||
from aiogram import Router, F
|
||
from aiogram.types import Message, CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
|
||
from aiogram.filters import Command
|
||
from src.core.config import ADMIN_IDS
|
||
|
||
from src.filters.case_insensitive import CaseInsensitiveCommand
|
||
|
||
|
||
def is_admin(user_id: int) -> bool:
|
||
"""Проверка является ли пользователь админом"""
|
||
return user_id in ADMIN_IDS
|
||
|
||
|
||
router = Router(name='help_router')
|
||
|
||
|
||
def get_help_menu_keyboard() -> InlineKeyboardMarkup:
|
||
"""Клавиатура меню справки"""
|
||
buttons = [
|
||
[InlineKeyboardButton(text="📝 Регистрация", callback_data="help_registration")],
|
||
[InlineKeyboardButton(text="🎰 Участие в розыгрышах", callback_data="help_lottery")],
|
||
[InlineKeyboardButton(text="📱 Мои логины", callback_data="help_logins")],
|
||
[InlineKeyboardButton(text="💬 Чат", callback_data="help_chat")],
|
||
[InlineKeyboardButton(text="⚙️ Команды", callback_data="help_commands")],
|
||
[InlineKeyboardButton(text="🏠 Главная", callback_data="back_to_main")]
|
||
]
|
||
return InlineKeyboardMarkup(inline_keyboard=buttons)
|
||
|
||
|
||
def get_back_to_help_keyboard() -> InlineKeyboardMarkup:
|
||
"""Клавиатура возврата к справке"""
|
||
buttons = [
|
||
[InlineKeyboardButton(text="◀️ Назад к справке", callback_data="help_main")],
|
||
[InlineKeyboardButton(text="🏠 Главная", callback_data="back_to_main")]
|
||
]
|
||
return InlineKeyboardMarkup(inline_keyboard=buttons)
|
||
|
||
|
||
@router.message(CaseInsensitiveCommand("help"))
|
||
async def help_command(message: Message):
|
||
"""Показать справку по команде /help (регистронезависимо)"""
|
||
await show_help_main(message)
|
||
|
||
|
||
@router.callback_query(F.data == "help_main")
|
||
async def help_main_callback(callback: CallbackQuery):
|
||
"""Показать главное меню справки"""
|
||
await callback.answer()
|
||
await show_help_main(callback.message, edit=True)
|
||
|
||
|
||
async def show_help_main(message: Message, edit: bool = False):
|
||
"""Показать главное меню справки"""
|
||
text = (
|
||
"❓ <b>Справка по работе с ботом</b>\n\n"
|
||
"Выберите интересующий вас раздел:\n\n"
|
||
"📝 <b>Регистрация</b> - как зарегистрироваться в системе\n"
|
||
"🎰 <b>Участие в розыгрышах</b> - как участвовать и выигрывать\n"
|
||
"📱 <b>Мои логины</b> - информация о ваших добавленных логинах\n"
|
||
"💬 <b>Чат</b> - общение с другими участниками\n"
|
||
"⚙️ <b>Команды</b> - список доступных команд"
|
||
)
|
||
|
||
keyboard = get_help_menu_keyboard()
|
||
|
||
if edit:
|
||
try:
|
||
await message.edit_text(text, reply_markup=keyboard, parse_mode="HTML")
|
||
except:
|
||
await message.answer(text, reply_markup=keyboard, parse_mode="HTML")
|
||
else:
|
||
await message.answer(text, reply_markup=keyboard, parse_mode="HTML")
|
||
|
||
|
||
@router.callback_query(F.data == "help_registration")
|
||
async def help_registration(callback: CallbackQuery):
|
||
"""Справка по регистрации"""
|
||
await callback.answer()
|
||
|
||
text = (
|
||
"📝 <b>Регистрация в системе</b>\n\n"
|
||
"<b>Как зарегистрироваться:</b>\n\n"
|
||
"1️⃣ Откройте главное меню и выберите <i>\"Регистрация\"</i>\n\n"
|
||
"2️⃣ Введите ваши данные:\n"
|
||
" • Имя и фамилию\n"
|
||
" • Номер телефона\n"
|
||
" • Номер клубной карты (если есть)\n\n"
|
||
"3️⃣ Ожидайте подтверждения от администратора\n\n"
|
||
"4️⃣ После одобрения вам станут доступны все функции бота:\n"
|
||
" ✅ Участие в розыгрышах\n"
|
||
" ✅ Доступ к чату\n"
|
||
" ✅ Получение уведомлений\n\n"
|
||
"💡 <b>Важно!</b>\n"
|
||
"Указывайте корректные данные - они проверяются администратором.\n\n"
|
||
"Статус вашей регистрации можно проверить в главном меню."
|
||
)
|
||
|
||
keyboard = get_back_to_help_keyboard()
|
||
|
||
try:
|
||
await callback.message.edit_text(text, reply_markup=keyboard, parse_mode="HTML")
|
||
except:
|
||
await callback.message.answer(text, reply_markup=keyboard, parse_mode="HTML")
|
||
|
||
|
||
@router.callback_query(F.data == "help_lottery")
|
||
async def help_lottery(callback: CallbackQuery):
|
||
"""Справка по розыгрышам"""
|
||
await callback.answer()
|
||
|
||
text = (
|
||
"🎰 <b>Участие в розыгрышах</b>\n\n"
|
||
"<b>Как принять участие:</b>\n\n"
|
||
"1️⃣ Убедитесь, что вы зарегистрированы\n\n"
|
||
"2️⃣ Дождитесь объявления нового розыгрыша\n"
|
||
" • Уведомления приходят всем участникам\n"
|
||
" • Розыгрыши проводятся регулярно\n\n"
|
||
"3️⃣ В описании розыгрыша будет указано:\n"
|
||
" 📝 Название и описание приза\n"
|
||
" 👥 Количество победителей\n"
|
||
" 📅 Дата и время проведения\n\n"
|
||
"4️⃣ Когда придет время:\n"
|
||
" • Администратор проведет розыгрыш\n"
|
||
" • Победители определяются случайным образом\n"
|
||
" • Всем участникам придет уведомление о результатах\n\n"
|
||
"🏆 <b>Если вы выиграли:</b>\n"
|
||
" • Вы получите личное уведомление\n"
|
||
" • Информация о получении приза будет в сообщении\n"
|
||
" • Следуйте инструкциям администратора\n\n"
|
||
"💡 <b>Совет:</b> Включите уведомления бота, чтобы не пропустить розыгрыш!"
|
||
)
|
||
|
||
keyboard = get_back_to_help_keyboard()
|
||
|
||
try:
|
||
await callback.message.edit_text(text, reply_markup=keyboard, parse_mode="HTML")
|
||
except:
|
||
await callback.message.answer(text, reply_markup=keyboard, parse_mode="HTML")
|
||
|
||
|
||
@router.callback_query(F.data == "help_logins")
|
||
async def help_logins(callback: CallbackQuery):
|
||
"""Справка по логинам пользователей"""
|
||
await callback.answer()
|
||
|
||
text = (
|
||
"📱 <b>Мои логины</b>\n\n"
|
||
"<b>Что это такое?</b>\n\n"
|
||
"В этом разделе вы всегда сможете найти свои добавленные логины в розыгрыши, "
|
||
"которые администратор указал для вас в системе.\n\n"
|
||
|
||
"<b>Какая информация показывается?</b>\n\n"
|
||
"Для каждого логина вы сможете увидеть:\n"
|
||
"🎲 <b>Активные розыгрыши</b> - розыгрыши в которых сейчас участвует логин\n"
|
||
"🏁 <b>Завершенные розыгрыши</b> - прошедшие розыгрыши:\n"
|
||
" 🏆 ВЫИГРАЛ - если логин победил (указано место)\n"
|
||
" ✗ Не выиграл - если логин не получил приз\n\n"
|
||
|
||
"⚠️ <b>Важное уточнение о статусе логинов:</b>\n\n"
|
||
"✅ <b>Зеленый (активный)</b> - логин участвует в новых розыгрышах\n"
|
||
"⏸️ <b>Серый (неактивный)</b> - логин не участвует в новых розыгрышах\n\n"
|
||
|
||
"Имейте в виду, что логины, которые участвовали в закрытых розыгрышах, "
|
||
"<b>не добавляются в новые розыгрыши</b>. В списке отображаются только те логины, "
|
||
"которые активны и соответствуют условиям текущих розыгрышей.\n\n"
|
||
|
||
"<b>Как это работает:</b>\n\n"
|
||
"1️⃣ Если у вас есть 100 логинов\n"
|
||
"2️⃣ 60 из них участвовали в прошедших/закрытых розыгрышах\n"
|
||
"3️⃣ Статус этих 60 логинов будет ⏸️ (неактивны)\n"
|
||
"4️⃣ Они не добавляются в новые розыгрыши\n"
|
||
"5️⃣ В новых розыгрышах участвуют только оставшиеся активные логины\n\n"
|
||
|
||
"<b>Как использовать:</b>\n\n"
|
||
"1️⃣ Откройте главное меню\n"
|
||
"2️⃣ Нажмите кнопку <i>\"Мои логины\"</i>\n"
|
||
"3️⃣ Вы увидите полный список всех ваших логинов с информацией\n\n"
|
||
|
||
"💡 <b>Совет:</b>\n"
|
||
"Если вы не видите ожидаемый логин в списке активных розыгрышей, "
|
||
"это может означать, что он уже участвовал в закрытых розыгрышах и помечен как неактивный. "
|
||
"Свяжитесь с администратором для уточнения.\n\n"
|
||
|
||
"🔄 <b>Обновление информации:</b>\n"
|
||
"Список обновляется автоматически при каждом открытии раздела."
|
||
)
|
||
|
||
keyboard = get_back_to_help_keyboard()
|
||
|
||
try:
|
||
await callback.message.edit_text(text, reply_markup=keyboard, parse_mode="HTML")
|
||
except:
|
||
await callback.message.answer(text, reply_markup=keyboard, parse_mode="HTML")
|
||
|
||
|
||
@router.callback_query(F.data == "help_chat")
|
||
async def help_chat(callback: CallbackQuery):
|
||
"""Справка по чату"""
|
||
await callback.answer()
|
||
|
||
text = (
|
||
"💬 <b>Чат участников</b>\n\n"
|
||
"<b>Как пользоваться чатом:</b>\n\n"
|
||
"1️⃣ <b>Вход в чат:</b>\n"
|
||
" • Откройте главное меню\n"
|
||
" • Выберите <i>\"Войти в чат\"</i>\n"
|
||
" • Или отправьте команду <code>/chat</code>\n\n"
|
||
"2️⃣ <b>Отправка сообщений:</b>\n"
|
||
" • Пишите как обычно в Telegram\n"
|
||
" • Ваши сообщения увидят все участники\n"
|
||
" • Можно отправлять:\n"
|
||
" 📝 Текст\n"
|
||
" 🖼 Фото и видео\n"
|
||
" 📎 Документы\n"
|
||
" 😊 Стикеры\n\n"
|
||
"3️⃣ <b>Выход из чата:</b>\n"
|
||
" • Нажмите кнопку <i>\"Выйти из чата\"</i>\n"
|
||
" • Или отправьте команду <code>/exit</code>\n"
|
||
" • Или напишите <code>старт</code> / <code>start</code> / <code>/start</code>\n\n"
|
||
"⚠️ <b>Правила чата:</b>\n"
|
||
" • Будьте вежливы с другими участниками\n"
|
||
" • Не спамьте сообщениями\n"
|
||
" • Запрещены оскорбления и реклама\n"
|
||
" • Администратор может заблокировать за нарушения\n\n"
|
||
"💡 <b>Подсказка:</b>\n"
|
||
"Если вы отправляете 20+ сообщений, они рассылаются пакетами с небольшой задержкой."
|
||
)
|
||
|
||
keyboard = get_back_to_help_keyboard()
|
||
|
||
try:
|
||
await callback.message.edit_text(text, reply_markup=keyboard, parse_mode="HTML")
|
||
except:
|
||
await callback.message.answer(text, reply_markup=keyboard, parse_mode="HTML")
|
||
|
||
|
||
@router.callback_query(F.data == "help_commands")
|
||
async def help_commands(callback: CallbackQuery):
|
||
"""Справка по командам"""
|
||
await callback.answer()
|
||
|
||
user_id = callback.from_user.id
|
||
is_user_admin = is_admin(user_id)
|
||
|
||
text = (
|
||
"⚙️ <b>Список команд бота</b>\n\n"
|
||
"<b>Основные команды:</b>\n\n"
|
||
"🏠 <code>/start</code> - Главное меню\n"
|
||
"❓ <code>/help</code> - Справка (это меню)\n"
|
||
"💬 <code>/chat</code> - Войти в чат\n"
|
||
"🚪 <code>/exit</code> - Выйти из чата\n\n"
|
||
"<b>Как использовать:</b>\n\n"
|
||
"• Отправьте команду в чат с ботом\n"
|
||
"• Начните команду с символа /\n"
|
||
"• Можно также использовать кнопки в меню\n\n"
|
||
)
|
||
|
||
if is_user_admin:
|
||
text += (
|
||
"👑 <b>Команды администратора:</b>\n\n"
|
||
"🔧 <code>/admin</code> - Панель администратора\n"
|
||
"📊 Управление розыгрышами\n"
|
||
"👥 Управление пользователями\n"
|
||
"📢 Массовые рассылки\n"
|
||
"⚙️ Настройки системы\n\n"
|
||
)
|
||
|
||
text += (
|
||
"💡 <b>Полезные советы:</b>\n\n"
|
||
"• Включите уведомления для получения важных сообщений\n"
|
||
"• Используйте кнопки - это быстрее команд\n"
|
||
"• В чате пишите <code>старт</code> чтобы вернуться в меню\n"
|
||
"• Регулярно проверяйте бота на наличие новых розыгрышей"
|
||
)
|
||
|
||
keyboard = get_back_to_help_keyboard()
|
||
|
||
try:
|
||
await callback.message.edit_text(text, reply_markup=keyboard, parse_mode="HTML")
|
||
except:
|
||
await callback.message.answer(text, reply_markup=keyboard, parse_mode="HTML")
|