""" Обработчик команды /id для получения информации о пользователе """ from aiogram import Router, F from aiogram.filters import Command from aiogram.types import Message, CallbackQuery from aiogram.utils.keyboard import InlineKeyboardBuilder from configs import settings, COMMANDS from middleware.loggers import logger __all__ = ('router',) router: Router = Router(name='user_id_router') # ================= ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ================= def get_close_keyboard(): """Создаёт клавиатуру с кнопкой закрытия""" ikb = InlineKeyboardBuilder() ikb.button(text='✖️ Закрыть', callback_data='id_close') return ikb.as_markup() # ================= КОМАНДА /ID ================= @router.message(Command(*COMMANDS.get('id', ['id']), prefix=settings.PREFIX, ignore_case=True)) async def id_cmd(message: Message) -> None: """ Показывает информацию о вашем Telegram аккаунте. Доступно всем пользователям. Использование: /id """ user = message.from_user if not user: await message.answer('❌ Не удалось получить информацию о пользователе') return # === ФОРМИРУЕМ ИНФОРМАЦИЮ === output = '💠 ИНФОРМАЦИЯ О ВАС\n\n' # Имя full_name_parts = [] if user.first_name: full_name_parts.append(user.first_name) if user.last_name: full_name_parts.append(user.last_name) full_name = ' '.join(full_name_parts) if full_name_parts else 'Не указано' output += f'💠 Имя: {full_name}\n' # Username if user.username: output += f'💠 Username: @{user.username}\n' else: output += '💠 Username: не установлен\n' # ID output += f'💠 ID: {user.id}\n\n' # Тип аккаунта if user.is_bot: output += '🤖 Тип: Бот\n' elif getattr(user, 'is_premium', False): output += '💠 Тип: Premium пользователь\n' else: output += '👥 Тип: Обычный пользователь\n' # Дополнительная информация output += '\n💠 Дополнительно:\n' # Язык if user.language_code: language_names = { 'ru': '🇷🇺 Русский', 'en': '🇬🇧 English', 'uk': '🇺🇦 Українська', 'de': '🇩🇪 Deutsch', 'es': '🇪🇸 Español', 'fr': '🇫🇷 Français', 'it': '🇮🇹 Italiano', 'pt': '🇵🇹 Português', } language = language_names.get(user.language_code, f'🌐 {user.language_code.upper()}') output += f'├─ Язык: {language}\n' # Информация о чате if message.chat.type == 'private': output += '├─ Чат: 💬 Личные сообщения\n' else: chat_title = message.chat.title or 'Без названия' chat_types = { 'group': '👥 Группа', 'supergroup': '👥 Супергруппа', 'channel': '📢 Канал' } chat_type = chat_types.get(message.chat.type, '💬 Чат') output += f'├─ Чат: {chat_type}\n' output += f'├─ Название: {chat_title}\n' output += f'├─ Chat ID: {message.chat.id}\n' # Получаем количество участников (только для групп) try: member_count = await message.bot.get_chat_member_count(message.chat.id) output += f'├─ Участников: {member_count}\n' except Exception as e: logger.debug(f'Не удалось получить количество участников: {e}', log_type='USER_ID') # Message ID output += f'└─ Message ID: {message.message_id}\n\n' # Клавиатура keyboard = get_close_keyboard() # Отправляем try: await message.answer( text=output, parse_mode='HTML', reply_markup=keyboard ) logger.debug(f'Команда /id от пользователя {user.id}', log_type='USER_ID') except Exception as e: logger.error(f'Ошибка отправки информации о пользователе: {e}', log_type='ERROR') await message.answer('❌ Произошла ошибка при получении информации') # ================= ОБРАБОТЧИК КНОПКИ ЗАКРЫТИЯ ================= @router.callback_query(F.data == 'id_close') async def id_close_callback(callback: CallbackQuery) -> None: """Закрывает (удаляет) сообщение с информацией""" try: await callback.message.delete() await callback.answer('✅ Закрыто') except Exception as e: logger.error(f'Ошибка удаления сообщения ID: {e}', log_type='ERROR') await callback.answer('❌ Не удалось удалить сообщение', show_alert=True) # ================= КОМАНДА /MYID (АЛЬТЕРНАТИВА) ================= @router.message(Command(*COMMANDS.get('myid', ['myid']), prefix=settings.PREFIX, ignore_case=True)) async def myid_cmd(message: Message) -> None: """ Быстрый просмотр вашего ID. Использование: /myid """ user = message.from_user if not user: await message.answer('❌ Не удалось получить ID') return # Короткий ответ text = f'💠 Ваш ID: {user.id}' if user.username: text += f'\n💠 Username: @{user.username}' await message.answer(text, parse_mode='HTML') # ================= КОМАНДА /CHATID ================= @router.message(Command(*COMMANDS.get('chatid', ['chatid']), prefix=settings.PREFIX, ignore_case=True)) async def chatid_cmd(message: Message) -> None: """ Показывает ID текущего чата. Использование: /chatid """ chat = message.chat output = '💬 ИНФОРМАЦИЯ О ЧАТЕ\n\n' # Тип чата chat_types = { 'private': '💬 Личные сообщения', 'group': '👥 Группа', 'supergroup': '👥 Супергруппа', 'channel': '📢 Канал' } chat_type = chat_types.get(chat.type, '💬 Чат') output += f'💠 Тип: {chat_type}\n' if chat.title: output += f'📌 Название: {chat.title}\n' if chat.username: output += f'💠 Username: @{chat.username}\n' output += f'💠 Chat ID: {chat.id}\n' # Дополнительная информация для групп if chat.type in ['group', 'supergroup']: try: member_count = await message.bot.get_chat_member_count(chat.id) output += f'👥 Участников: {member_count}\n' except Exception as e: logger.debug(f'Не удалось получить количество участников: {e}', log_type='USER_ID') keyboard = get_close_keyboard() await message.answer( text=output, parse_mode='HTML', reply_markup=keyboard )