diff --git a/.env.example b/.env.example index 6df6c2a..2d6bf66 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,3 @@ -BOT_TOKEN = "..." # Токен бота получать у @BotFather \ No newline at end of file +BOT_TOKEN = "..." # Токен бота получать у @BotFather +ADMIN_CHAT_ID = -1001111111111 # ID админ-чата получать у @username_to_id_bot +LOG_THREAD_ID = 2 # ID топика, брать из ссылки сообщения \ No newline at end of file diff --git a/README.md b/README.md index 2aee56c..050f2dd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

LGBot

-

Бот-модератор для @linux_gaming_ru

+

Бот-администратор для @linux_gaming_ru

## Список дел @@ -15,7 +15,7 @@ - [ ] Удаление сообщений с матом - [ ] Удаление рекламы -### Установка зависимостей (через pyenv) +### Установка зависимостей (pyenv) ```sh pyenv install 3.11.0 @@ -30,7 +30,7 @@ pip install -r requirements.txt ### Настройка -Создатите файл **.env** и внесите в него ваш токен, который вы получили у @BotFather. +Создайте файл **.env** и внесите в него токен бота, ID админ-чата и топика. ### Запуск diff --git a/src/action_reporter.py b/src/action_reporter.py new file mode 100644 index 0000000..cf790e2 --- /dev/null +++ b/src/action_reporter.py @@ -0,0 +1,80 @@ +from telebot.async_telebot import AsyncTeleBot +from telebot.types import Message +import logging +from database import db + +# Инициализация +class ActionReporter: + def __init__(self, bot: AsyncTeleBot, log_chat_id: int, log_thread_id: int): + self.bot = bot + self.log_chat_id = log_chat_id + self.log_thread_id = log_thread_id + + # Получает информацию о пользователе из базы данных + async def _get_user_info(self, user_id: int) -> str: + user_info = db.get_user(user_id) + if user_info: + + # Вытаскиваем данные с кортежа + _, nickname, tag = user_info + + # Формируем справку о пользователе + text = "👤 Пользователь:\n" + if nickname: + text += f"• Name: {nickname}\n" + if tag: + text += f"• Tag: @{tag}\n" + text += f"• ID: {user_id}" + + return text + + # Получает информацию об администраторе + async def _get_admin_info(self, admin_id: int) -> str: + admin_info = db.get_user(admin_id) + if admin_info: + + # Вытаскиваем данные с кортежа + _, nickname, tag = admin_info + + # Формируем справку об администраторе + text = "🛡 Администратор:\n" + if nickname: + text += f"• Name: {nickname}\n" + if tag: + text += f"• Tag: @{tag}\n" + text += f"• ID: {admin_id}" + + return text + + # Отправляет лог действия в админ-чат + async def log_action(self, action: str, user_id: int, admin_id: int, reason: str, duration: str): + try: + + # Получаем информацию о пользователе и администраторе + user_info = await self._get_user_info(user_id) + admin_info = await self._get_admin_info(admin_id) + + # Формируем сообщение + msg = f"⚙️ Действие: {action}\n" + + if duration: + msg += f"⏱ Длительность: {duration}\n" + + if reason: + msg += f"📝 Причина: {reason}\n" + + msg += f"\n{user_info}\n\n{admin_info}" + + # Отправляем сообщение + await self.bot.send_message(self.log_chat_id, msg, message_thread_id=self.log_thread_id) + + except Exception as e: + logging.error(f"Ошибка отправки лога: {str(e)}") + +# Создаем глобальный экземпляр для импорта +action_reporter = None + +# Инициализирует логгер модерации +def init_action_reporter(bot: AsyncTeleBot, log_chat_id: int, log_thread_id: int): + global action_reporter + action_reporter = ActionReporter(bot, log_chat_id, log_thread_id) \ No newline at end of file diff --git a/src/main.py b/src/main.py index c01eb1b..53d22df 100644 --- a/src/main.py +++ b/src/main.py @@ -12,11 +12,16 @@ from logger import setup_logging from database import db +from action_reporter import init_action_reporter + from config import MODULES_DIR load_dotenv() # Загружаем токен бота из .env bot = AsyncTeleBot(os.getenv("BOT_TOKEN"), parse_mode="html") +# Загружаем ID админ-чата из .env и инициализируемся для логов в чат +init_action_reporter(bot, os.getenv("ADMIN_CHAT_ID"), os.getenv("LOG_THREAD_ID")) + logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля class UserUpdateMiddleware(BaseMiddleware): diff --git a/src/modules/ban.py b/src/modules/ban.py index 9c5d498..ddb1efb 100644 --- a/src/modules/ban.py +++ b/src/modules/ban.py @@ -4,6 +4,8 @@ import asyncio import logging from database import db +from action_reporter import action_reporter + from config import COMMAND_MESSAGES logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля @@ -211,6 +213,15 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об try: await bot.ban_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=reason, + duration=None + ) + # Отправляем сообщения, что пользователь получил бан await send_message(chat_id, COMMAND_MESSAGES['banned']) logger.info(f"Пользователь {target_user.id} забанен администратором {message.from_user.id}.") diff --git a/src/modules/mute.py b/src/modules/mute.py index 01ec9b1..3aa7ef9 100644 --- a/src/modules/mute.py +++ b/src/modules/mute.py @@ -5,6 +5,8 @@ import logging import time from database import db +from action_reporter import action_reporter + from config import COMMAND_MESSAGES logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля @@ -195,8 +197,7 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об identifier = parts_msg[1].strip() time_arg = parts_msg[2] reason = extract_reason(parts_msg[3:]) - print(identifier) - + # Поиск по ID if identifier.isdigit(): @@ -343,6 +344,15 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об # Форматирование времени time_display = format_time(mute_seconds) + # Отправляем лог в админ-чат + await action_reporter.log_action( + action="МУТ", + user_id=target_user.id, + admin_id=message.from_user.id, + reason=reason, + duration=time_display + ) + # Отправляем сообщения, что пользователь получил мут await send_message(chat_id, COMMAND_MESSAGES['muted'].format(time_display=time_display)) logger.info(f"Пользователь {target_user.id} получил мут на {time_display} от администратора {message.from_user.id}.") diff --git a/src/modules/unban.py b/src/modules/unban.py index 18e6146..24ff256 100644 --- a/src/modules/unban.py +++ b/src/modules/unban.py @@ -4,6 +4,8 @@ import asyncio import logging from database import db +from action_reporter import action_reporter + from config import COMMAND_MESSAGES logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля @@ -143,6 +145,15 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об # Выполняем разбан 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']) diff --git a/src/modules/unmute.py b/src/modules/unmute.py index f0969f5..6dfaae6 100644 --- a/src/modules/unmute.py +++ b/src/modules/unmute.py @@ -4,6 +4,8 @@ import asyncio import logging from database import db +from action_reporter import action_reporter + from config import COMMAND_MESSAGES logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля @@ -159,6 +161,15 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об user_id=target_user.id, permissions=permissions ) + + # Отправляем лог в админ-чат + 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['unmuted'])