diff --git a/handlers/admin.py b/handlers/admin.py index dce5398..b73b93c 100644 --- a/handlers/admin.py +++ b/handlers/admin.py @@ -130,6 +130,7 @@ async def cmd_legal_sync(message: Message): @router.message(Command('admin')) +@router.message(F.text.in_(['⚙️ Управление', '⚙️ Админка', '⚙️ АДМИНКА'])) @admin_only async def cmd_admin(message: Message): """Админ-меню (только в личке!)""" @@ -150,7 +151,7 @@ async def cmd_admin(message: Message): ) -@router.message(F.text == '📊 Статистика') +@router.message(F.text.in_(['📊 Статистика', '/stats'])) @admin_only async def msg_stats_button(message: Message): """Кнопка Статистика""" @@ -162,19 +163,19 @@ async def msg_stats_button(message: Message): await message.answer(text, parse_mode='HTML') -@router.message(F.text == '🕵️ Шпионы') +@router.message(F.text.in_(['🛡️ Фильтр посторонних', '🕵️ Шпионы', '/spies'])) @admin_only async def msg_spies_button(message: Message): - """Кнопка Шпионы""" + """Кнопка Шпионы / Фильтр посторонних""" async with AsyncSessionLocal() as session: spy_detector = SpyDetector(session) spies = await spy_detector.get_spies() if not spies: - await message.answer('🟢 Шпионов не обнаружено') + await message.answer('🟢 Посторонних и шпионов не обнаружено') return - text = '🚨 ШПИОНЫ 🚨\n\n' + text = '🚨 ПОСТОРОННИЕ / ШПИОНЫ 🚨\n\n' for spy in spies: name = spy.full_name or f'user{spy.user_id}' apt = spy.apartment or '?' @@ -183,16 +184,16 @@ async def msg_spies_button(message: Message): await message.answer(text, parse_mode='HTML') -@router.message(F.text == '👥 Пользователи') +@router.message(F.text.in_(['👥 Список жителей', '👥 Пользователи', '/users'])) @admin_only async def msg_users_button(message: Message): - """Кнопка Пользователи""" + """Кнопка Пользователи / Список жителей""" async with AsyncSessionLocal() as session: stmt = select(User).limit(50) result = await session.execute(stmt) users = list(result.scalars().all()) - text = f'👥 Пользователи (50):\n\n' + text = f'👥 Список жителей (50):\n\n' for user in users: status = '✅' if user.verified else '⏳' name = user.full_name or f'user{user.user_id}' @@ -204,7 +205,7 @@ async def msg_users_button(message: Message): await message.answer(text, parse_mode='HTML') -@router.message(F.text == '❓ Помощь') +@router.message(F.text.in_(['❓ Справка', '❓ Помощь', '/help']), lambda m: config.is_admin(m.from_user.id)) @admin_only async def msg_help_button(message: Message): """Кнопка Помощь - справка по командам""" @@ -699,6 +700,7 @@ async def cmd_spies(message: Message): @router.message(Command('export')) @router.message(Command('экспорт')) +@router.message(F.text.in_(['📥 Выгрузка базы', '📥 Экспорт JSON'])) @admin_only async def cmd_export(message: Message): """Экспорт данных""" diff --git a/handlers/users.py b/handlers/users.py index 0d6cf1b..2bfaa5c 100644 --- a/handlers/users.py +++ b/handlers/users.py @@ -110,6 +110,7 @@ async def cb_main_menu(callback: CallbackQuery): ) @router.message(Command('phones')) +@router.message(F.text.in_(['📞 Важные телефоны', '📞 Телефоны', 'Телефоны'])) @router.callback_query(F.data == 'phones') async def cb_phones(event): text = '📞 ЭКСТРЕННЫЕ ТЕЛЕФОНЫ\n\nВыберите категорию ниже:' @@ -117,7 +118,7 @@ async def cb_phones(event): await safe_edit_or_reply(event, text, reply_markup=kb, parse_mode='HTML') @router.message(Command('masters')) -@router.message(F.text.lower() == 'мастера') +@router.message(F.text.in_(['👷 Мастера', 'Мастера', 'мастера'])) async def cmd_masters(message: Message): """Выдача списка мастеров по команде /masters или тексту 'мастера'""" from database.models import Service @@ -334,6 +335,7 @@ class HelpFeedbackState(StatesGroup): waiting_for_reply = State() @router.message(Command('help')) +@router.message(F.text.in_(['❓ Справка', '❓ Помощь', 'Справка', 'Помощь'])) @router.callback_query(F.data == 'help') async def cb_help(event, state: FSMContext): await state.clear() diff --git a/keyboards/inline.py b/keyboards/inline.py index dc488b6..bc64e49 100644 --- a/keyboards/inline.py +++ b/keyboards/inline.py @@ -14,53 +14,52 @@ def get_main_menu(verified: bool = False, is_ig: bool = False, is_admin: bool = # СТРОКА 1: БАЗА (ВСЕГДА ТУТ) builder.row( - InlineKeyboardButton(text='📞 Телефоны', callback_data='phones'), + InlineKeyboardButton(text='📞 Важные телефоны', callback_data='phones'), InlineKeyboardButton(text='⚖️ Юрист (ЖК РФ)', callback_data='main_jurist') ) builder.row( - InlineKeyboardButton(text='🏢 О доме', callback_data='about_house') + InlineKeyboardButton(text='🏢 Паспорт дома', callback_data='about_house') ) # СТРОКА 2-3: ДЛЯ ВЕРИФИЦИРОВАННЫХ (ФИКСИРОВАННОЕ МЕСТО) if verified: builder.row( - InlineKeyboardButton(text='📅 График', callback_data='schedule'), - InlineKeyboardButton(text='💰 Платежи', callback_data='payments') + InlineKeyboardButton(text='⚠️ Отключения', callback_data='schedule'), + InlineKeyboardButton(text='💳 Оплата ЖКХ', callback_data='payments') ) builder.row( - InlineKeyboardButton(text='📋 Опросы', callback_data='polls'), - InlineKeyboardButton(text='🎉 События', callback_data='events') + InlineKeyboardButton(text='🗳️ Голосования', callback_data='polls'), + InlineKeyboardButton(text='🗓️ События дома', callback_data='events') ) builder.row( - InlineKeyboardButton(text='🏪 Маркет', callback_data='market'), - InlineKeyboardButton(text='🏆 Рейтинг', callback_data='achievements') + InlineKeyboardButton(text='📢 Объявления', callback_data='market'), + InlineKeyboardButton(text='🤝 Добрые соседи', callback_data='achievements') ) else: # Для гостей кнопка верификации на видном месте builder.row( - InlineKeyboardButton(text='🛡️ ВЕРИФИКАЦИЯ', callback_data='start_verification') + InlineKeyboardButton(text='🔑 Подтвердить квартиру', callback_data='start_verification') ) # СТРОКА 4: ИНИЦИАТИВНАЯ ГРУППА И АДМИН if is_ig or is_admin: buttons = [] if is_ig: - buttons.append(InlineKeyboardButton(text='🎯 ТИМ-МЕНЮ', callback_data='ig_menu')) + buttons.append(InlineKeyboardButton(text='👥 Совет Дома', callback_data='ig_menu')) if is_admin: - buttons.append(InlineKeyboardButton(text='⚙️ АДМИНКА', callback_data='admin_menu')) + buttons.append(InlineKeyboardButton(text='⚙️ Управление', callback_data='admin_menu')) builder.row(*buttons) - # СТРОКА 5: СУПЕР-АДМИН (ТЫ) + # СТРОКА 5: СУПЕР-АДМИН (ПРЕДСЕДАТЕЛЬ) if is_superadmin: builder.row( - InlineKeyboardButton(text='👑 [ROOT: УПРАВЛЕНИЕ]', callback_data='superadmin_menu') + InlineKeyboardButton(text='🛡️ Панель председателя', callback_data='superadmin_menu') ) # СТРОКА 6: СЛУЖЕБНОЕ (НИЗ) builder.row( - InlineKeyboardButton(text='❓ Помощь', callback_data='help'), - InlineKeyboardButton(text='🌦️ Погода', callback_data='weather'), - InlineKeyboardButton(text='👤 Профиль', callback_data='my_profile') + InlineKeyboardButton(text='❓ Справка', callback_data='help'), + InlineKeyboardButton(text='👤 Моя квартира', callback_data='my_profile') ) return builder.as_markup() @@ -124,14 +123,14 @@ def get_admin_menu() -> InlineKeyboardMarkup: builder.row( InlineKeyboardButton(text='📊 Статистика', callback_data='admin_stats'), - InlineKeyboardButton(text='🕵️ Шпионы', callback_data='admin_spies'), + InlineKeyboardButton(text='🛡️ Фильтр посторонних', callback_data='admin_spies'), ) builder.row( - InlineKeyboardButton(text='👥 Пользователи', callback_data='admin_users'), - InlineKeyboardButton(text='⏳ Непроверенные', callback_data='admin_unverified'), + InlineKeyboardButton(text='👥 Список жителей', callback_data='admin_users'), + InlineKeyboardButton(text='⏳ Ожидают проверки', callback_data='admin_unverified'), ) builder.row( - InlineKeyboardButton(text='📥 Экспорт JSON', callback_data='admin_export'), + InlineKeyboardButton(text='📥 Выгрузка базы', callback_data='admin_export'), InlineKeyboardButton(text='📤 Рассылка', callback_data='admin_broadcast'), ) builder.row( diff --git a/keyboards/reply.py b/keyboards/reply.py index 59d24d4..7f72644 100644 --- a/keyboards/reply.py +++ b/keyboards/reply.py @@ -13,11 +13,11 @@ def get_reply_menu() -> ReplyKeyboardMarkup: builder = ReplyKeyboardBuilder() builder.row( - KeyboardButton(text='📞 Телефоны'), + KeyboardButton(text='📞 Важные телефоны'), KeyboardButton(text='👷 Мастера'), ) builder.row( - KeyboardButton(text='❓ Помощь'), + KeyboardButton(text='❓ Справка'), ) # Resize keyboard чтобы не занимал много места @@ -29,12 +29,13 @@ def get_admin_reply_menu() -> ReplyKeyboardMarkup: builder = ReplyKeyboardBuilder() builder.row( - KeyboardButton(text='/admin'), - KeyboardButton(text='/stats'), + KeyboardButton(text='⚙️ Управление'), + KeyboardButton(text='📊 Статистика'), ) builder.row( - KeyboardButton(text='/spies'), - KeyboardButton(text='/export'), + KeyboardButton(text='🛡️ Фильтр посторонних'), + KeyboardButton(text='📥 Выгрузка базы'), ) return builder.as_markup(resize_keyboard=True) +