From 7154374fdc305d2bbdaebc2c25a1a91df48fa10a Mon Sep 17 00:00:00 2001 From: hteppl Date: Wed, 15 Jan 2025 14:29:33 +0300 Subject: [PATCH] Update stats, fix some text input flows to working with delete middleware --- handlers/admin/admin_coupons.py | 2 +- handlers/admin/admin_stats.py | 30 ++++++++++++++++++++++++------ handlers/admin/admin_users.py | 14 +++++++------- middlewares/delete.py | 23 ++--------------------- 4 files changed, 34 insertions(+), 35 deletions(-) diff --git a/handlers/admin/admin_coupons.py b/handlers/admin/admin_coupons.py index b890b61e..357b9946 100644 --- a/handlers/admin/admin_coupons.py +++ b/handlers/admin/admin_coupons.py @@ -168,7 +168,7 @@ async def handle_delete_coupon( if result: await show_coupon_list(callback_query, session) else: - await callback_query.message.answer( + await callback_query.message.edit_text( text=f"❌ Купон с кодом {coupon_code} не найден.", ) await show_coupon_list(callback_query, session) diff --git a/handlers/admin/admin_stats.py b/handlers/admin/admin_stats.py index c83456a8..e5e4a869 100644 --- a/handlers/admin/admin_stats.py +++ b/handlers/admin/admin_stats.py @@ -19,7 +19,7 @@ router = Router() ) async def user_stats_menu(callback_query: CallbackQuery, session: Any): try: - total_users = await session.fetchval("SELECT COUNT(*) FROM connections") + total_users = await session.fetchval("SELECT COUNT(*) FROM users") total_keys = await session.fetchval("SELECT COUNT(*) FROM keys") total_referrals = await session.fetchval("SELECT COUNT(*) FROM referrals") @@ -36,6 +36,20 @@ async def user_stats_menu(callback_query: CallbackQuery, session: Any): "SELECT COALESCE(SUM(amount), 0) FROM payments" ) + registrations_today = await session.fetchval( + "SELECT COUNT(*) FROM users WHERE created_at >= CURRENT_DATE" + ) + registrations_week = await session.fetchval( + "SELECT COUNT(*) FROM users WHERE created_at >= date_trunc('week', CURRENT_DATE)" + ) + registrations_month = await session.fetchval( + "SELECT COUNT(*) FROM users WHERE created_at >= date_trunc('month', CURRENT_DATE)" + ) + + users_updated_today = await session.fetchval( + "SELECT COUNT(*) FROM users WHERE updated_at >= CURRENT_DATE" + ) + active_keys = await session.fetchval( "SELECT COUNT(*) FROM keys WHERE expiry_time > $1", int(datetime.utcnow().timestamp() * 1000), @@ -45,8 +59,14 @@ async def user_stats_menu(callback_query: CallbackQuery, session: Any): stats_message = ( f"📊 Подробная статистика проекта:\n\n" f"👥 Пользователи:\n" - f" 🌐 Зарегистрировано: {total_users}\n" - f" 🤝 Привлеченных рефералов: {total_referrals}\n\n" + f" 📅 За день: {registrations_today}\n" + f" 📆 За неделю: {registrations_week}\n" + f" 📆 За месяц: {registrations_month}\n" + f" 🌐 За все время: {total_users}\n\n" + f"🌟 Активные пользователи:\n" + f" 🌟 Активных сегодня: {users_updated_today}\n\n" + f"👥 Рефералы:\n" + f" 🤝 Всего привлечено: {total_referrals}\n\n" f"🔑 Ключи:\n" f" 🌈 Всего сгенерировано: {total_keys}\n" f" ✅ Действующих: {active_keys}\n" @@ -58,11 +78,9 @@ async def user_stats_menu(callback_query: CallbackQuery, session: Any): f" 🏦 За все время: {total_payments_all_time} ₽\n" ) - kb = build_stats_kb() - await callback_query.message.edit_text( text=stats_message, - reply_markup=kb + reply_markup=build_stats_kb() ) except Exception as e: logger.error(f"Error in user_stats_menu: {e}") diff --git a/handlers/admin/admin_users.py b/handlers/admin/admin_users.py index 3667a312..4f48a5ac 100644 --- a/handlers/admin/admin_users.py +++ b/handlers/admin/admin_users.py @@ -82,7 +82,7 @@ async def handle_user_data_input( kb = build_admin_back_kb() if not message.text: - await message.reply( + await message.answer( text="🚫 Пожалуйста, отправьте текстовое сообщение.", reply_markup=kb ) @@ -101,7 +101,7 @@ async def handle_user_data_input( ) if not user: - await message.reply( + await message.answer( text="🚫 Пользователь с указанным Username не найден!", reply_markup=kb, ) @@ -124,7 +124,7 @@ async def handle_key_name_input( kb = build_admin_back_kb() if not message.text: - await message.reply( + await message.answer( text="🚫 Пожалуйста, отправьте текстовое сообщение.", reply_markup=kb ) @@ -134,7 +134,7 @@ async def handle_key_name_input( key_details = await get_key_details(key_name, session) if not key_details: - await message.edit_text( + await message.answer( text="🚫 Пользователь с указанным именем ключа не найден.", reply_markup=kb ) @@ -239,7 +239,7 @@ async def handle_new_balance_input( tg_id = user_data.get("tg_id") if not message.text.isdigit() or int(message.text) < 0: - await message.edit_text( + await message.answer( text="❌ Пожалуйста, введите корректную сумму для изменения баланса.", reply_markup=build_editor_kb(tg_id), ) @@ -253,8 +253,8 @@ async def handle_new_balance_input( tg_id, ) - await message.edit_text( - text=f"✅ Баланс успешно изменен на {new_balance}.", + await message.answer( + text=f"✅ Баланс успешно изменен на {new_balance}", reply_markup=build_admin_back_kb() ) await state.clear() diff --git a/middlewares/delete.py b/middlewares/delete.py index 52d4d7ae..b3ccdd37 100644 --- a/middlewares/delete.py +++ b/middlewares/delete.py @@ -18,13 +18,6 @@ pass_callbacks = [ AdminUserEditorCallback, ] -pass_states = [ - "UserEditorState", - "AdminServersEditor", - "AdminSender", - "AdminCouponsState" -] - class DeleteMessageMiddleware(BaseMiddleware): async def __call__( @@ -35,9 +28,8 @@ class DeleteMessageMiddleware(BaseMiddleware): ) -> Any: if isinstance(event, Message): if ( - not event.text or - not event.text.startswith("/start") or - not self._check_user_state(event) + not event.text + or not event.text.startswith("/start") ): try: await event.bot.delete_message( @@ -55,17 +47,6 @@ class DeleteMessageMiddleware(BaseMiddleware): return await handler(event, data) - @staticmethod - async def _check_user_state(event: CallbackQuery) -> bool: - from bot import dp - context = dp.fsm.get_context( - bot=event.bot, - user_id=event.from_user.id, - chat_id=event.chat.id - ) - state = await context.get_state() - return state.split(":")[0] in pass_states - @staticmethod async def _check_callbacks(event: CallbackQuery) -> bool: for callback in pass_callbacks: