added sending logs to the admin chat

This commit is contained in:
2025-07-16 10:28:42 +03:00
parent fc3ef20145
commit 40b60baa93
8 changed files with 136 additions and 6 deletions

View File

@ -1 +1,3 @@
BOT_TOKEN = "..." # Токен бота получать у @BotFather
BOT_TOKEN = "..." # Токен бота получать у @BotFather
ADMIN_CHAT_ID = -1001111111111 # ID админ-чата получать у @username_to_id_bot
LOG_THREAD_ID = 2 # ID топика, брать из ссылки сообщения

View File

@ -1,6 +1,6 @@
<div align="center">
<h1 align="center">LGBot</h1>
<p align="center">Бот-модератор для @linux_gaming_ru </p>
<p align="center">Бот-администратор для @linux_gaming_ru </p>
</div>
## Список дел
@ -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 админ-чата и топика.
### Запуск

80
src/action_reporter.py Normal file
View File

@ -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 = "👤 <b>Пользователь:</b>\n"
if nickname:
text += f"• Name: <code>{nickname}</code>\n"
if tag:
text += f"• Tag: <code>@{tag}</code>\n"
text += f"• ID: <code>{user_id}</code>"
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 = "🛡 <b>Администратор:</b>\n"
if nickname:
text += f"• Name: <code>{nickname}</code>\n"
if tag:
text += f"• Tag: <code>@{tag}</code>\n"
text += f"• ID: <code>{admin_id}</code>"
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"⚙️ <b>Действие:</b> {action}\n"
if duration:
msg += f"⏱ <b>Длительность:</b> {duration}\n"
if reason:
msg += f"📝 <b>Причина:</b> <i>{reason}</i>\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)

View File

@ -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):

View File

@ -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}.")

View File

@ -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}.")

View File

@ -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'])

View File

@ -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'])