From ba692f5b73a77fbd0eb2b2629e33efd329629d9b Mon Sep 17 00:00:00 2001 From: hteppl Date: Fri, 31 Jan 2025 05:03:07 +0300 Subject: [PATCH] Get back cluster sender option --- handlers/admin/admin_sender.py | 28 ++++++++++++++++++++++++++-- keyboards/admin/sender_kb.py | 18 ++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/handlers/admin/admin_sender.py b/handlers/admin/admin_sender.py index 4e8a92cf..7987598c 100644 --- a/handlers/admin/admin_sender.py +++ b/handlers/admin/admin_sender.py @@ -8,7 +8,7 @@ from aiogram.types import CallbackQuery from filters.admin import IsAdminFilter from keyboards.admin.panel_kb import AdminPanelCallback, build_admin_back_kb -from keyboards.admin.sender_kb import AdminSenderCallback, build_sender_kb +from keyboards.admin.sender_kb import AdminSenderCallback, build_sender_kb, build_clusters_kb from logger import logger router = Router() @@ -38,10 +38,22 @@ async def handle_sender_callback(callback_query: CallbackQuery, callback_data: A text="✍️ Введите текст сообщения для рассылки:", reply_markup=build_admin_back_kb("sender"), ) - await state.update_data(type=callback_data.type) + await state.update_data(type=callback_data.type, data=callback_data.data) await state.set_state(AdminSender.waiting_for_message) +@router.callback_query( + AdminSenderCallback.filter(F.type == "cluster-select"), + IsAdminFilter(), +) +async def handle_sender_callback(callback_query: CallbackQuery, session: Any): + clusters = await session.fetch("SELECT DISTINCT cluster_name FROM servers") + await callback_query.message.answer( + "✍️ Выберите кластер для рассылки сообщений:", + reply_markup=build_clusters_kb(clusters), + ) + + @router.message( AdminSender.waiting_for_message, IsAdminFilter(), @@ -74,6 +86,18 @@ async def handle_message_input(message: types.Message, state: FSMContext, sessio """, int(datetime.utcnow().timestamp() * 1000), ) + elif send_to == "cluster": + cluster_name = state_data.get("data") + tg_ids = await session.fetch( + """ + SELECT DISTINCT c.tg_id + FROM connections c + JOIN keys k ON c.tg_id = k.tg_id + JOIN servers s ON k.server_id = s.cluster_name + WHERE s.cluster_name = $1 + """, + cluster_name, + ) else: tg_ids = await session.fetch("SELECT DISTINCT tg_id FROM connections") diff --git a/keyboards/admin/sender_kb.py b/keyboards/admin/sender_kb.py index d0acfc59..bf29f29c 100644 --- a/keyboards/admin/sender_kb.py +++ b/keyboards/admin/sender_kb.py @@ -1,3 +1,5 @@ +from typing import Union + from aiogram.filters.callback_data import CallbackData from aiogram.types import InlineKeyboardMarkup from aiogram.utils.keyboard import InlineKeyboardBuilder @@ -7,6 +9,7 @@ from keyboards.admin.panel_kb import build_admin_back_btn class AdminSenderCallback(CallbackData, prefix="admin_sender"): type: str + data: Union[str, None] = None def build_sender_kb() -> InlineKeyboardMarkup: @@ -14,6 +17,21 @@ def build_sender_kb() -> InlineKeyboardMarkup: builder.button(text="👥 Все пользователи", callback_data=AdminSenderCallback(type="all").pack()) builder.button(text="✅ Пользователи с подпиской", callback_data=AdminSenderCallback(type="subscribed").pack()) builder.button(text="❌ Пользователи без подписки", callback_data=AdminSenderCallback(type="unsubscribed").pack()) + builder.button(text="📢 Пользователи кластера", callback_data=AdminSenderCallback(type="cluster-select").pack()) + builder.row(build_admin_back_btn()) + builder.adjust(1) + return builder.as_markup() + + +def build_clusters_kb(clusters: list) -> InlineKeyboardMarkup: + builder = InlineKeyboardBuilder() + for cluster in clusters: + name = cluster['cluster_name'] + builder.button( + text=f"🌐 {name}", + callback_data=AdminSenderCallback(type="cluster", data=name).pack() + ) + builder.row(build_admin_back_btn()) builder.adjust(1) return builder.as_markup()