add update logger

This commit is contained in:
2024-12-22 14:33:18 +07:00
parent a825472f42
commit b80da75de8
3 changed files with 100 additions and 42 deletions
+2 -3
View File
@@ -1,8 +1,7 @@
from aiohttp_socks import ProxyConnector
import aiohttp
from aiogram import Bot
from aiogram import F, Router, types
from aiogram import Bot, F, Router, types
from aiogram.enums import ContentType
from aiohttp_socks import ProxyConnector
from bot.utils.actions import BotActions
from bot.utils.api_client import ApiClient
+16 -25
View File
@@ -2,8 +2,8 @@ from datetime import timedelta
from typing import Union
from aiogram import Bot
from aiogram.types import Message, Chat, ChatPermissions
from aiogram.exceptions import TelegramBadRequest
from aiogram.types import Chat, ChatPermissions, Message, User
from bot.utils.db import UseDB
from bot.utils.logger import get_logger, log_event
@@ -124,6 +124,7 @@ class BotActions:
f"так как обнаружено: {detected_type}"
)
await log_event(
bot=self.bot,
chat=message.chat,
user=message.from_user,
reason=detected_type,
@@ -133,33 +134,21 @@ class BotActions:
async def ban_user(
self,
user_id: int,
user: User,
chat: Chat,
detected_type: str,
message: Message
detected_type: str
) -> None:
"""
Забанить пользователя
:param user_id: int - ID пользователя
:param user: User - пользователь
:param chat: Chat - объект чата
:param detected_type: str - тип обнаруженного контента
:param message: Message - сообщение, связанное с нарушением
"""
reason = (
f"Пользователь заблокирован, "
f"так как обнаружено нарушение: **{detected_type}**.\n"
"Если вы считаете, что это ошибка, обратитесь к администратору."
)
try:
await message.bot.send_message(
chat_id=message.chat.id,
text=reason,
parse_mode="Markdown"
)
await self.bot.ban_chat_member(
chat_id=chat.id,
user_id=user_id
user_id=user.id
)
except TelegramBadRequest:
self.logger.warning("Не удалось забанить пользователя.")
@@ -168,7 +157,7 @@ class BotActions:
await self.bot.send_message(
chat_id=chat.id,
text=(
f"Пользователь {user_id} был заблокирован.\n"
f"Пользователь {user} был заблокирован.\n"
f"Причина: **{detected_type}**.\n"
"Пожалуйста, соблюдайте правила сообщества."
),
@@ -179,8 +168,9 @@ class BotActions:
f"Пользователь забанен через бота, так как обнаружено: {detected_type}"
)
await log_event(
bot=self.bot,
chat=chat,
user=user_id,
user=user,
reason=detected_type,
performed_by="system",
event_description="Пользователь забанен"
@@ -188,7 +178,7 @@ class BotActions:
async def restrict_user(
self,
user_id: int,
user: User,
chat: Chat,
duration: int,
detected_type: str
@@ -196,7 +186,7 @@ class BotActions:
"""
Ограничить пользователя (аналог мута)
:param user_id: int - ID пользователя
:param user: User - пользователь
:param chat: Chat - объект чата
:param duration: int - длительность ограничения в секундах
:param detected_type: str - тип обнаруженного контента
@@ -216,7 +206,7 @@ class BotActions:
try:
await self.bot.restrict_chat_member(
chat_id=chat.id,
user_id=user_id,
user_id=user.id,
permissions=restricted_permissions,
until_date=until_date
)
@@ -238,8 +228,9 @@ class BotActions:
f"Пользователь ограничен через бота, так как обнаружено: {detected_type}"
)
await log_event(
bot=self.bot,
chat=chat,
user=user_id,
user=user,
reason=detected_type,
performed_by="system",
event_description="Пользователь ограничен"
@@ -265,11 +256,11 @@ class BotActions:
if action == "delete":
await self.delete_message(message, detected_type)
elif action == "ban":
await self.ban_user(user_id, message.chat, detected_type, message)
await self.ban_user(message.from_user, message.chat, detected_type)
elif isinstance(action, dict) and "mute" in action:
duration = action["mute"]
await self.restrict_user(
user_id,
message.from_user,
message.chat,
duration,
detected_type
+82 -14
View File
@@ -1,8 +1,14 @@
import sys
from datetime import UTC, datetime
from pathlib import Path
from aiogram import Bot
from aiogram.types import Chat, User
from aiogram.utils.markdown import hlink
from loguru import logger
from bot.utils.db import UseDB
LOG_FILE = Path("bot.log")
@@ -41,22 +47,84 @@ def get_logger(name: str) -> logger:
return logger.bind(name=name)
async def log_event(
chat,
user,
reason,
performed_by,
event_description
async def send_log_to_admin_or_roles(
bot: Bot, chat: Chat, message_text: str
):
"""
Логирует событие в канале логов и записывает его в базу данных.
Отправляет лог админу в ЛС или пользователю с ролями в чат.
:param chat: discord.Guild - объект сервера Discord
:param user: discord.Member - пользователь, к которому относится событие
:param reason: str - причина события
:param performed_by: discord.Member или str - пользователь, совершивший действие,
либо "system", если действие автоматическое
:param event_description: str - описание события (например, "Пользователь забанен")
:param bot: Bot - объект бота
:param chat: Chat - объект чата
:param message_text: str - текст сообщения
:return: None
"""
pass
for member in await bot.get_chat_administrators(chat.id):
if member.user.is_bot:
continue
try:
await bot.send_message(
chat_id=member.user.id,
text=message_text,
parse_mode="HTML"
)
return
except Exception as e:
loger = get_logger(__name__)
loger.error(e)
async def log_event(
bot: Bot,
chat: Chat,
user: User,
reason: str,
performed_by: User | str,
event_description: str
):
"""
Логирует событие и отправляет сообщение админу или пользователю с ролями.
:param bot: Bot - объект бота
:param chat: Chat - объект чата
:param user: User - пользователь, к которому относится событие
:param reason: str - причина события
:param performed_by: User или str - пользователь, совершивший действие,
либо "system", если действие автоматическое
:param event_description: str - описание события
(например, "Пользователь забанен")
:return: None
"""
# Определение исполнителя
if isinstance(performed_by, User):
performed_by_name = f"{performed_by.full_name} ({performed_by.id})"
elif isinstance(performed_by, str) and performed_by.lower() == "system":
performed_by_name = "Автоматическая система"
else:
raise ValueError("performed_by должен быть User или строкой 'system'")
# Создание сообщения для логов
message_text = (
f"<b>Лог модерации</b>\n"
f"<b>Описание:</b> {event_description}\n"
f"<b>Пользователь:</b> {hlink(
user.full_name, f'tg://user?id={user.id}'
)} ({user.id})\n"
f"<b>Причина:</b> {reason}\n"
f"<b>Совершено:</b> {performed_by_name}"
)
await send_log_to_admin_or_roles(bot, chat, message_text)
db = UseDB("telegram_bot")
log_entry = {
"chat_id": str(chat.id),
"user_id": str(user.id),
"event_description": event_description,
"reason": reason,
"performed_by": performed_by_name,
"timestamp": datetime.now(UTC).isoformat()
}
db.update_all_document(
{"chat_id": str(chat.id)},
{"$push": {"logs": log_entry}}
)