Get back cluster sender option

This commit is contained in:
hteppl
2025-01-31 05:03:07 +03:00
parent 993c79e9db
commit ba692f5b73
2 changed files with 44 additions and 2 deletions
+26 -2
View File
@@ -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")
+18
View File
@@ -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()