fix: исправлены импорты и добавлен планировщик рассылки
Some checks reported errors
continuous-integration/drone/push Build encountered an error

- Исправлены импорты: database → src.core.database, config → src.core.config
- Заменены async for get_session() на async with async_session_maker()
- Добавлен планировщик для пакетной рассылки сообщений (BATCH_SIZE=20, BATCH_DELAY=1.0s)
- Исправлено использование is_registered вместо is_active для фильтрации пользователей
- Реализована защита от блокировки Telegram при массовой рассылке

Изменения:
- src/handlers/chat_handlers.py: добавлен broadcast_message_with_scheduler
- src/handlers/admin_chat_handlers.py: исправлены импорты и использование сессий
This commit is contained in:
2025-11-16 14:35:33 +09:00
parent b6c27b7b70
commit e798216cef
3 changed files with 244 additions and 63 deletions

View File

@@ -10,8 +10,8 @@ from src.core.chat_services import (
ChatMessageService
)
from src.core.services import UserService
from database import get_session
from config import ADMIN_IDS
from src.core.database import async_session_maker
from src.core.config import ADMIN_IDS
router = Router(name='admin_chat_router')
@@ -40,7 +40,7 @@ async def cmd_chat_mode(message: Message):
await message.answer("У вас нет прав для выполнения этой команды")
return
async for session in get_session():
async with async_session_maker() as session:
settings = await ChatSettingsService.get_or_create_settings(session)
mode_text = "📢 Рассылка всем пользователям" if settings.mode == 'broadcast' else "➡️ Пересылка в канал"
@@ -63,7 +63,7 @@ async def process_chat_mode(callback: CallbackQuery):
mode = callback.data.split(":")[1]
async for session in get_session():
async with async_session_maker() as session:
settings = await ChatSettingsService.set_mode(session, mode)
mode_text = "📢 Рассылка всем пользователям" if mode == 'broadcast' else "➡️ Пересылка в канал"
@@ -100,7 +100,7 @@ async def cmd_set_forward(message: Message):
chat_id = args[1].strip()
async for session in get_session():
async with async_session_maker() as session:
settings = await ChatSettingsService.set_forward_chat(session, chat_id)
await message.answer(
@@ -118,7 +118,7 @@ async def cmd_global_ban(message: Message):
await message.answer("У вас нет прав для выполнения этой команды")
return
async for session in get_session():
async with async_session_maker() as session:
settings = await ChatSettingsService.get_or_create_settings(session)
# Переключаем состояние
@@ -169,7 +169,7 @@ async def cmd_ban(message: Message):
await message.answer("❌ Неверный ID пользователя")
return
async for session in get_session():
async with async_session_maker() as session:
# Получаем пользователя
user = await UserService.get_user_by_telegram_id(session, target_user_id)
@@ -228,7 +228,7 @@ async def cmd_unban(message: Message):
await message.answer("❌ Неверный ID пользователя")
return
async for session in get_session():
async with async_session_maker() as session:
# Разбаниваем
success = await BanService.unban_user(session, target_user_id)
@@ -250,7 +250,7 @@ async def cmd_banlist(message: Message):
await message.answer("У вас нет прав для выполнения этой команды")
return
async for session in get_session():
async with async_session_maker() as session:
banned_users = await BanService.get_banned_users(session, active_only=True)
if not banned_users:
@@ -290,7 +290,7 @@ async def cmd_delete_message(message: Message):
)
return
async for session in get_session():
async with async_session_maker() as session:
# Получаем админа
admin = await UserService.get_user_by_telegram_id(session, message.from_user.id)
@@ -345,7 +345,7 @@ async def cmd_chat_stats(message: Message):
await message.answer("У вас нет прав для выполнения этой команды")
return
async for session in get_session():
async with async_session_maker() as session:
settings = await ChatSettingsService.get_or_create_settings(session)
banned_users = await BanService.get_banned_users(session, active_only=True)
recent_messages = await ChatMessageService.get_recent_messages(session, limit=100)