Files
new_lottery_bot/src/handlers/help_handlers.py
Andrew K. Choi ede4617b00 Enhance login display with raffle participation history
- 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
2026-03-07 08:53:48 +09:00

283 lines
15 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Обработчики справки и помощи пользователям"""
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")