""" Обработчик команды /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 += f"🔗 Username: не установлен\n" # ID output += f"🆔 ID: {user.id}\n\n" # Тип аккаунта if user.is_bot: output += f"🤖 Тип: Бот\n" elif user.is_premium: output += f"⭐️ Тип: Premium пользователь\n" else: output += f"👥 Тип: Обычный пользователь\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 += f"├─ Чат: 💬 Личные сообщения\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" # Подсказка output += "💡 Эту информацию видите только вы" # Клавиатура 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 )