Files
LGBot/src/modules/unban.py
2025-07-09 17:18:06 +03:00

129 lines
5.9 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.

from telebot.async_telebot import AsyncTeleBot
from telebot.types import Message, User
import asyncio
import logging
from database import db
from config import COMMAND_MESSAGES
logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля
def register_handlers(bot: AsyncTeleBot): # Регистрирует все обработчики команд
@bot.message_handler(commands=['unban']) # Обработчик команды /unban
async def unban_command(message: Message):
# Отправка сообщения в тему или обычный чат
send_message = bot.reply_to if message.is_topic_message else bot.send_message
chat_id = message if message.is_topic_message else message.chat.id
# Определяем целевого пользователя
target_user = None
# Разбиваем текст сообщения на части
parts_msg = message.text.split()
try:
# Проверяем, является ли отправитель администратором
try:
admin_status = await bot.get_chat_member(message.chat.id, message.from_user.id)
# Проверяем статус администратора (создателя)
if admin_status.status not in ['administrator', 'creator']:
await send_message(chat_id, COMMAND_MESSAGES['no_admin_rights'])
return
# Проверяем право администратора на разбан
if admin_status.status == 'administrator' and not admin_status.can_restrict_members:
await send_message(chat_id, COMMAND_MESSAGES['no_restrict_rights'])
return
except Exception as e:
await send_message(chat_id, f"⚠️ Ошибка: {str(e)}")
logger.error(f"Ошибка при получении статуса администратора: {str(e)}")
return
# Случай №1 - Команда используется в ответ на сообщение
if len(parts_msg) == 1:
# Если банят в теме
if message.is_topic_message:
# Если без ответа на сообщение
if message.message_thread_id == message.reply_to_message.message_id:
return
# Если команда правильная
else:
target_user = message.reply_to_message.from_user
# Если банят в обычном чате
elif message.reply_to_message and message.is_topic_message is None:
target_user = message.reply_to_message.from_user
# Не выводим сообщение, что команда неправильная
else:
return
# Случай №2 - Команда с аргументом (/unban @username или /unban 12345)
elif len(parts_msg) == 2:
# Выводим помощь (/unban help)
if parts_msg[1].strip() in ['help', 'помощь']:
await send_message(chat_id, COMMAND_MESSAGES['manual_unban'])
return
identifier = parts_msg[1].strip()
# Поиск по ID
if identifier.isdigit():
# Делаем в int и ищем
user_info = db.get_user(int(identifier))
if user_info:
# Создаем объект пользователя из данных базы
target_user = User(
id=user_info[0],
first_name=user_info[1],
username=user_info[2],
is_bot=False
)
# Поиск по тэгу
elif identifier.startswith('@'):
# Убираем @ и ищем
user_info = db.get_user_by_username(identifier[1:])
if user_info:
# Создаем объект пользователя из данных базы
target_user = User(
id=user_info[0],
first_name=user_info[1],
username=user_info[2],
is_bot=False
)
# Если пользователь не найден
if not target_user:
await send_message(chat_id, COMMAND_MESSAGES['user_not_found'])
return
# Выполняем разбан
try:
await bot.unban_chat_member(message.chat.id, target_user.id)
await send_message(chat_id, COMMAND_MESSAGES['unbanned'])
await asyncio.sleep(5)
await bot.delete_message(message.chat.id, message.message_id)
await bot.delete_message(message.chat.id, message.message_id+1)
logger.info(f"Пользователь {target_user.id} разбанен администратором {message.from_user.id}.")
except Exception as e:
await send_message(chat_id, f"⚠️ Ошибка: {str(e)}")
logger.error(f"Ошибка разбана: {str(e)}")
except Exception as e:
await send_message(chat_id, COMMAND_MESSAGES['general_error'])
logger.error(f"Общая ошибка в unban_command: {str(e)}")