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