"""
Обработчик команды /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
)