Files
LGBot/src/modules/unban.py

177 lines
7.8 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 action_reporter import action_reporter
from config import COMMAND_MESSAGES
logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля
# Удаляет два последних сообщения
async def delete_messages(bot: AsyncTeleBot, message: Message, time_sleep: int):
await asyncio.sleep(time_sleep)
await bot.delete_message(message.chat.id, message.message_id)
await bot.delete_message(message.chat.id, message.message_id+1)
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()
# Выводим помощь (/unban help)
if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']:
await send_message(chat_id, COMMAND_MESSAGES['manual_unban'])
# Удаляем сообщения через 30 секунд
await delete_messages(bot, message, 30)
return
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'])
# Удаляем сообщения через 5 секунд
await delete_messages(bot, message, 5)
return
# Проверяем право администратора на разбан
if admin_status.status == 'administrator' and not admin_status.can_restrict_members:
await send_message(chat_id, COMMAND_MESSAGES['no_restrict_rights'])
# Удаляем сообщения через 5 секунд
await delete_messages(bot, message, 5)
return
except Exception as e:
await send_message(chat_id, f"⚠️ Ошибка: {str(e)}")
logger.error(f"Ошибка при получении статуса администратора: {str(e)}")
# Удаляем сообщения через 5 секунд
await delete_messages(bot, message, 5)
return
# Если одно слово, то ответом на сообщение
if len(parts_msg) == 1:
# Если это тема
if message.is_topic_message:
# Если без ответа на сообщение, ошибка
if message.message_thread_id == message.reply_to_message.message_id:
await asyncio.sleep(3)
await bot.delete_message(message.chat.id, 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:
await asyncio.sleep(3)
await bot.delete_message(message.chat.id, message.message_id)
return
# Если два, то через тег или ID
elif len(parts_msg) == 2:
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'])
# Удаляем сообщения через 5 секунд
await delete_messages(bot, message, 5)
return
# Выполняем разбан
try:
await bot.unban_chat_member(message.chat.id, target_user.id)
# Отправляем лог в админ-чат
await action_reporter.log_action(
action="РАЗБАН",
user_id=target_user.id,
admin_id=message.from_user.id,
reason=None,
duration=None
)
# Отправляем сообщения, что пользователь получил разбан
await send_message(chat_id, COMMAND_MESSAGES['unbanned'])
logger.info(f"Пользователь {target_user.id} разбанен администратором {message.from_user.id}.")
# Удаляем сообщения через 5 секунд
await delete_messages(bot, message, 5)
except Exception as e:
await send_message(chat_id, f"⚠️ Ошибка: {str(e)}")
logger.error(f"Ошибка разбана: {str(e)}")
# Удаляем сообщения через 5 секунд
await delete_messages(bot, message, 5)
except Exception as e:
await send_message(chat_id, COMMAND_MESSAGES['general_error'])
logger.error(f"Общая ошибка в unban_command: {str(e)}")
# Удаляем сообщения через 5 секунд
await delete_messages(bot, message, 5)