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 @@
Бот-модератор для @linux_gaming_ru
+Бот-администратор для @linux_gaming_ru
{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'])