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: