add event add

This commit is contained in:
2024-12-22 15:26:30 +07:00
parent b80da75de8
commit 7402b64b58
6 changed files with 176 additions and 130 deletions
+51 -8
View File
@@ -1,21 +1,31 @@
from aiogram import Router, types
from aiogram.enums import ChatMemberStatus
from aiogram import Router, Bot
from aiogram.filters import ChatMemberUpdatedFilter, JOIN_TRANSITION
from aiogram.types import ChatMemberUpdated
from bot.utils.db import UseDB
router = Router()
@router.chat_join_request()
async def new_chat_handler(event: types.ChatJoinRequest):
@router.my_chat_member(ChatMemberUpdatedFilter(member_status_changed=JOIN_TRANSITION))
async def bot_added(event: ChatMemberUpdated, bot: Bot):
"""
Обработчик события, когда бот добавляется в новый чат.
:param event: Объект события добавления в чат
:param event: Объект сообщения
:param bot: Bot
:return: None
"""
chat_name = event.chat.title or "группу"
bot_member = await event.bot.get_chat_member(event.chat.id, event.bot.id)
bot_member = await event.bot.get_chat_member(
event.chat.id,
event.bot.id
)
if not bot_member.is_chat_admin():
await event.bot.send_message(
if bot_member.status != ChatMemberStatus.ADMINISTRATOR:
await bot.send_message(
event.chat.id,
f"<b>Спасибо за добавление меня в {chat_name}!</b>\n"
"Однако, чтобы я мог выполнять свои функции, "
@@ -24,9 +34,42 @@ async def new_chat_handler(event: types.ChatJoinRequest):
parse_mode="HTML"
)
else:
await event.bot.send_message(
await bot.send_message(
event.chat.id,
f"<b>Спасибо за добавление меня в {chat_name}!</b>\n"
"Я готов помогать модерировать и защищать ваш чат.",
parse_mode="HTML"
)
db = UseDB("telegram_bot")
if not db.find_document({"chat_id": event.chat.id}):
db.insert_document(
{
"chat_id": event.chat.id,
"language": "en",
"actions": {
"nsfw": {
"actions": [
"delete",
"ban"
]
},
"spam": {
"actions": [
"delete",
{
"mute": 7800
}
]
},
"mat": {
"actions": [
"delete"
]
}
},
"ignored_users": [],
"ignored_channels": [],
"logs": []
}
)
-121
View File
@@ -1,121 +0,0 @@
import aiohttp
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
from bot.utils.logger import get_logger
from config.settings import (
BOT_PROXY_IP,
BOT_PROXY_PASSWORD,
BOT_PROXY_SOCKS5_PORT,
BOT_PROXY_USER,
)
router = Router()
class MessageHandler:
def __init__(self, bot: Bot):
self.api_client = ApiClient()
self.bot_actions = BotActions(bot)
self.logger = get_logger(__name__)
async def handle_text_message(self, message: types.Message) -> bool:
"""
Обработка текстового сообщения.
:param message: Объект сообщения Telegram
:return: True, если обработка успешна, иначе False
"""
try:
response = await self.api_client.check_message(message.text)
if response:
category = response.get('category')
likelihood = response.get('likelihood')
if likelihood > 0.7:
await self.bot_actions.handle_actions(
message.chat.id,
category,
message
)
return True
except Exception as e:
self.logger.error(f"Ошибка при обработке текста: {e}")
return False
async def handle_image_message(self, message: types.Message) -> bool:
"""
Обработка сообщения с изображениями.
:param message: Объект сообщения Telegram
:return: True, если обработка успешна, иначе False
"""
try:
if message.photo:
photo = message.photo[-1]
file_info = await message.bot.get_file(photo.file_id)
file_path = file_info.file_path
image_url = (
f"https://api.telegram.org/file/"
f"bot{message.bot.token}/{file_path}"
)
image_data = await self.download_image(image_url)
response = await self.api_client.check_image(image_data)
if response:
category = response.get('category')
likelihood = response.get('likelihood')
if likelihood > 0.7:
await self.bot_actions.handle_actions(
message.chat.id,
category,
message
)
return True
except Exception as e:
self.logger.error(f"Ошибка при обработке изображения: {e}")
return False
async def download_image(self, url: str) -> bytes | None:
"""
Асинхронная загрузка изображения по URL через SOCKS5 прокси.
:param url: Ссылка на изображение
:return: Байтовые данные изображения
"""
try:
proxy_url = (
f"socks5://{BOT_PROXY_USER}:{BOT_PROXY_PASSWORD}"
f"@{BOT_PROXY_IP}:{BOT_PROXY_SOCKS5_PORT}"
)
connector = ProxyConnector.from_url(proxy_url)
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get(url) as response:
if response.status == 200:
return await response.read()
except Exception as e:
self.logger.error(f"Ошибка при загрузке изображения: {e}")
return None
@router.message(
F.content_type != ContentType.CONTACT
)
async def on_message(message: types.Message):
"""
Обработка всех сообщений.
:param message: Объект сообщения Telegram
:return: None
"""
handler = MessageHandler(message.bot)
if message.text:
await handler.handle_text_message(message)
if message.photo:
await handler.handle_image_message(message)
+121
View File
@@ -0,0 +1,121 @@
import aiohttp
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
from bot.utils.logger import get_logger
from config.settings import (
BOT_PROXY_IP,
BOT_PROXY_PASSWORD,
BOT_PROXY_SOCKS5_PORT,
BOT_PROXY_USER,
)
router = Router()
class MessageHandler:
def __init__(self, bot: Bot):
self.api_client = ApiClient()
self.bot_actions = BotActions(bot)
self.logger = get_logger(__name__)
async def handle_text_message(self, message: types.Message) -> bool:
"""
Обработка текстового сообщения.
:param message: Объект сообщения Telegram
:return: True, если обработка успешна, иначе False
"""
try:
response = await self.api_client.check_message(message.text)
if response:
category = response.get('category')
likelihood = response.get('likelihood')
if likelihood > 0.7:
await self.bot_actions.handle_actions(
message.chat.id,
category,
message
)
return True
except Exception as e:
self.logger.error(f"Ошибка при обработке текста: {e}")
return False
async def handle_image_message(self, message: types.Message) -> bool:
"""
Обработка сообщения с изображениями.
:param message: Объект сообщения Telegram
:return: True, если обработка успешна, иначе False
"""
try:
if message.photo:
photo = message.photo[-1]
file_info = await message.bot.get_file(photo.file_id)
file_path = file_info.file_path
image_url = (
f"https://api.telegram.org/file/"
f"bot{message.bot.token}/{file_path}"
)
image_data = await self.download_image(image_url)
response = await self.api_client.check_image(image_data)
if response:
category = response.get('category')
likelihood = response.get('likelihood')
if likelihood > 0.7:
await self.bot_actions.handle_actions(
message.chat.id,
category,
message
)
return True
except Exception as e:
self.logger.error(f"Ошибка при обработке изображения: {e}")
return False
async def download_image(self, url: str) -> bytes | None:
"""
Асинхронная загрузка изображения по URL через SOCKS5 прокси.
:param url: Ссылка на изображение
:return: Байтовые данные изображения
"""
try:
proxy_url = (
f"socks5://{BOT_PROXY_USER}:{BOT_PROXY_PASSWORD}"
f"@{BOT_PROXY_IP}:{BOT_PROXY_SOCKS5_PORT}"
)
connector = ProxyConnector.from_url(proxy_url)
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get(url) as response:
if response.status == 200:
return await response.read()
except Exception as e:
self.logger.error(f"Ошибка при загрузке изображения: {e}")
return None
@router.message(
F.content_type != ContentType.CONTACT
)
async def on_message(message: types.Message):
"""
Обработка всех сообщений.
:param message: Объект сообщения Telegram
:return: None
"""
handler = MessageHandler(message.bot)
if message.text:
await handler.handle_text_message(message)
if message.photo:
await handler.handle_image_message(message)
View File
View File