# Aiogram imports import aiogram.types as types from aiogram.fsm.context import FSMContext from aiogram.filters import StateFilter from aiogram import Router, F # Const from create_bot import bot, orm # Keyboards from keyboards.admin.mailer_kbs import * # Utils from utils.text_tools import parse_links_to_inline_markup # States from states.admin_states import AdminStates, AdminMailerStates # Funcs from handlers.admin.main import show_admin_menu admin_mailer_router = Router() @admin_mailer_router.message(F.text == "✉️ Рассылка", StateFilter(AdminStates.main)) @admin_mailer_router.message(F.text == "↩️ Назад", StateFilter(AdminMailerStates)) async def process_mailer_post(message: types.Message, state: FSMContext): msg_text = "✉️ Отправьте пост одним сообщением:" await message.answer(text=msg_text, reply_markup=get_back_to_main_kb()) await state.set_state(AdminMailerStates.post) @admin_mailer_router.message(StateFilter(AdminMailerStates.post)) async def process_mailer_ikb(message: types.Message, state: FSMContext): await state.update_data(admin_mailer_post=message.message_id) msg_text = """✉️ Введите кнопки:
Отправьте ссылку(и) в формате: [Текст кнопки + ссылка] Пример: [Переводчик + https://t.me/TransioBot] Чтобы добавить несколько кнопок в один ряд, пишите ссылки рядом с предыдущими. Формат: [Первый текст + первая ссылка][Второй текст + вторая ссылка] Чтобы добавить несколько кнопок в строчку, пишите новые ссылки с новой строки. Формат: [Первый текст + первая ссылка] [Второй текст + вторая ссылка]""" await message.answer( text=msg_text, reply_markup=get_skip_kb(), disable_web_page_preview=True ) await state.set_state(AdminMailerStates.ikb) @admin_mailer_router.message(F.text, StateFilter(AdminMailerStates.ikb)) async def process_mailer_preview(message: types.Message, state: FSMContext): ikb = ( parse_links_to_inline_markup(message.text) if message.text != "↪️ Пропустить" else None ) await state.update_data(admin_mailer_ikb=ikb) state_data = await state.get_data() post = state_data.get("admin_mailer_post") await message.answer(text="✉️ Предпросмотр:", reply_markup=get_mailer_finish_kb()) try: await bot.copy_message( chat_id=message.from_user.id, from_chat_id=message.from_user.id, message_id=post, reply_markup=get_mailer_btn_ikb(buttons_preset=ikb), ) except: await message.answer(text="🔴 Ошибка!") await process_mailer_post(message, state) return await state.set_state(AdminMailerStates.preview) @admin_mailer_router.message( F.text == "🟢 Начать рассылку", StateFilter(AdminMailerStates.preview) ) async def process_mailer_finish(message: types.Message, state: FSMContext): state_data = await state.get_data() ikb = state_data.get("admin_mailer_ikb") post = state_data.get("admin_mailer_post") all_users = await orm.get_all_user_ids() # info await message.answer(text="▶️✉️ Рассылка запущена...") await state.clear() # back to main menu await show_admin_menu(message, state) counter = 0 for user_id in all_users: try: await bot.copy_message( chat_id=user_id, from_chat_id=message.from_user.id, message_id=post, reply_markup=get_mailer_btn_ikb(buttons_preset=ikb), ) counter += 1 except: pass await message.answer( text=f"✅ Рассылка завершена! Сообщение отправлено {counter}/{len(all_users)}." )