From 1975fafe292b9ef900b3337717cfdb6c3f2e6745 Mon Sep 17 00:00:00 2001 From: Verum Date: Mon, 23 Feb 2026 14:12:13 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20id=20=D1=87=D0=B0=D1=82=D0=BE=D0=B2=20=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/handlers/commands/users/id.py | 218 ++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 bot/handlers/commands/users/id.py diff --git a/bot/handlers/commands/users/id.py b/bot/handlers/commands/users/id.py new file mode 100644 index 0000000..caa3a1a --- /dev/null +++ b/bot/handlers/commands/users/id.py @@ -0,0 +1,218 @@ +""" +Обработчик команды /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 + )