add update logger
This commit is contained in:
@@ -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
@@ -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
@@ -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}}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user