Compare commits

..

3 Commits

Author SHA1 Message Date
279e0c6a70 Обновить README.md 2025-12-14 10:22:18 +00:00
5cf9455f76 add logging to mailing error 2025-11-14 14:42:25 +03:00
da3af83b3a mailig skip blocked users 2025-11-14 14:28:18 +03:00
2 changed files with 33 additions and 11 deletions

View File

@@ -1,5 +1,4 @@
# Бот для записи на курсы и мероприятия от школы фасциопатии
# Бот для записи на курсы и мероприятия от школы фасциопатии
## Текущие возможности

View File

@@ -4,9 +4,11 @@ from aiogram.types import CallbackQuery, Message
from aiogram_dialog import DialogManager
from aiogram_dialog.widgets.input import MessageInput
from aiogram_dialog.widgets.kbd import Button
from structlog import get_logger
from app.infrastructure.database.crud import get_users
logger = get_logger()
async def message_data(
message: Message,
@@ -26,29 +28,50 @@ async def choose_recipients(
await manager.next()
async def confirm_mailing(
callback: CallbackQuery,
button: Button,
manager: DialogManager,
):
print(manager.dialog_data["recipients"])
users = list(await get_users(
manager.middleware_data["session"],
exclude_admins=manager.dialog_data["recipients"] == "send_users",
))
await asyncio.gather(
*[
callback.bot.copy_message(
message = manager.dialog_data["message"]
source_chat_id = message.chat.id
source_message_id = message.message_id
success_count = 0
# Создаём задачу с обработкой ошибок для каждого пользователя
async def send_to_user(user):
nonlocal success_count
try:
await callback.bot.copy_message(
chat_id=user.tg_id,
from_chat_id=manager.dialog_data["message"].chat.id,
message_id=manager.dialog_data["message"].message_id,
from_chat_id=source_chat_id,
message_id=source_message_id,
)
for user in users
]
success_count += 1
except Exception as e:
logger.warning(
"не удалось отправить сообщение",
user_id=user.tg_id,
error=str(e),
exc_info=True, # добавит traceback
)
pass
await asyncio.gather(*[send_to_user(user) for user in users])
await callback.bot.send_message(
chat_id=callback.from_user.id,
text=f"Разослано сообщений: {len(users)}",
text=f"Рассылка завершена.\nУспешно отправлено: {success_count} из {len(users)}",
)
await manager.done()