add event add
This commit is contained in:
+51
-8
@@ -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": []
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user