Получение id чатов и пользователей
This commit is contained in:
218
bot/handlers/commands/users/id.py
Normal file
218
bot/handlers/commands/users/id.py
Normal file
@@ -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 = '<tg-emoji emoji-id="4961064956368782417">💠</tg-emoji> <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'<tg-emoji emoji-id="4960791319707387164">💠</tg-emoji> <b>Имя:</b> {full_name}\n'
|
||||
|
||||
# Username
|
||||
if user.username:
|
||||
output += f'<tg-emoji emoji-id="4961200307968148582">💠</tg-emoji> <b>Username:</b> @{user.username}\n'
|
||||
else:
|
||||
output += '<tg-emoji emoji-id="4961200307968148582">💠</tg-emoji> <b>Username:</b> <i>не установлен</i>\n'
|
||||
|
||||
# ID
|
||||
output += f'<tg-emoji emoji-id="4961121396534019447">💠</tg-emoji> <b>ID:</b> <code>{user.id}</code>\n\n'
|
||||
|
||||
# Тип аккаунта
|
||||
if user.is_bot:
|
||||
output += '🤖 <b>Тип:</b> Бот\n'
|
||||
elif getattr(user, 'is_premium', False):
|
||||
output += '<tg-emoji emoji-id="4961075019477156700">💠</tg-emoji> <b>Тип:</b> Premium пользователь\n'
|
||||
else:
|
||||
output += '👥 <b>Тип:</b> Обычный пользователь\n'
|
||||
|
||||
# Дополнительная информация
|
||||
output += '\n<tg-emoji emoji-id="4961141003059725568">💠</tg-emoji> <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 += '├─ Чат: 💬 Личные сообщения\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'
|
||||
|
||||
# Клавиатура
|
||||
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'<tg-emoji emoji-id="4961121396534019447">💠</tg-emoji> Ваш ID: <code>{user.id}</code>'
|
||||
|
||||
if user.username:
|
||||
text += f'\n<tg-emoji emoji-id="4961200307968148582">💠</tg-emoji> 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'<tg-emoji emoji-id="4960791319707387164">💠</tg-emoji> <b>Тип:</b> {chat_type}\n'
|
||||
|
||||
if chat.title:
|
||||
output += f'📌 <b>Название:</b> {chat.title}\n'
|
||||
|
||||
if chat.username:
|
||||
output += f'<tg-emoji emoji-id="4961200307968148582">💠</tg-emoji> <b>Username:</b> @{chat.username}\n'
|
||||
|
||||
output += f'<tg-emoji emoji-id="4961121396534019447">💠</tg-emoji> <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
|
||||
)
|
||||
Reference in New Issue
Block a user