Files
PrimoGuardBot-/bot/handlers/commands/users/id.py
2026-02-17 11:24:55 +07:00

222 lines
7.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Обработчик команды /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 = "👤 <b>ИНФОРМАЦИЯ О ВАС</b>\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"📝 <b>Имя:</b> {full_name}\n"
# Username
if user.username:
output += f"🔗 <b>Username:</b> @{user.username}\n"
else:
output += f"🔗 <b>Username:</b> <i>не установлен</i>\n"
# ID
output += f"🆔 <b>ID:</b> <code>{user.id}</code>\n\n"
# Тип аккаунта
if user.is_bot:
output += f"🤖 <b>Тип:</b> Бот\n"
elif user.is_premium:
output += f"⭐️ <b>Тип:</b> Premium пользователь\n"
else:
output += f"👥 <b>Тип:</b> Обычный пользователь\n"
# Дополнительная информация
output += "\n📊 <b>Дополнительно:</b>\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: <code>{message.chat.id}</code>\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: <code>{message.message_id}</code>\n\n"
# Подсказка
output += "💡 <i>Эту информацию видите только вы</i>"
# Клавиатура
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: <code>{user.id}</code>"
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 = "💬 <b>ИНФОРМАЦИЯ О ЧАТЕ</b>\n\n"
# Тип чата
chat_types = {
"private": "💬 Личные сообщения",
"group": "👥 Группа",
"supergroup": "👥 Супергруппа",
"channel": "📢 Канал"
}
chat_type = chat_types.get(chat.type, "💬 Чат")
output += f"📝 <b>Тип:</b> {chat_type}\n"
if chat.title:
output += f"📌 <b>Название:</b> {chat.title}\n"
if chat.username:
output += f"🔗 <b>Username:</b> @{chat.username}\n"
output += f"🆔 <b>Chat ID:</b> <code>{chat.id}</code>\n"
# Дополнительная информация для групп
if chat.type in ["group", "supergroup"]:
try:
member_count = await message.bot.get_chat_member_count(chat.id)
output += f"👥 <b>Участников:</b> {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
)