From aa3a8096de67939a8d0dbc459a803967f4194bec Mon Sep 17 00:00:00 2001 From: Vladless Date: Wed, 5 Feb 2025 05:58:03 +0300 Subject: [PATCH] fixes: float_stats/delete_user/message_errors --- bot.py | 27 ++++++++++++++++++++++++++- database.py | 7 ++++--- handlers/admin/admin_stats.py | 18 +++++++++++------- handlers/start.py | 9 ++++++--- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/bot.py b/bot.py index b4a303e4..f6d2f928 100644 --- a/bot.py +++ b/bot.py @@ -32,8 +32,33 @@ async def errors_handler( bot: Bot, ) -> bool: if isinstance(event.exception, TelegramForbiddenError): - logger.info(f"User {event.update.message.from_user.id} blocked the bot.") + logger.info(f"User {event.update.message.from_user.id} заблокировал бота.") return True + + if isinstance(event.exception, TelegramBadRequest): + error_message = str(event.exception) + + if ( + "query is too old and response timeout expired or query ID is invalid" in error_message + or "message can't be deleted for everyone" in error_message + ): + logger.warning("Отправляем стартовое меню.") + + try: + from handlers.start import handle_start_callback_query, start_command + + if event.update.message: + await start_command( + event.update.message, state=dp.storage, session=None, admin=False, captcha=False + ) + elif event.update.callback_query: + await handle_start_callback_query( + event.update.callback_query, state=dp.storage, session=None, admin=False, captcha=False + ) + except Exception as e: + logger.error(f"Ошибка при показе стартового меню после ошибки: {e}") + + return True logger.exception(f"Update: {event.update}\nException: {event.exception}") if not ADMIN_ID: return True diff --git a/database.py b/database.py index c3fb4741..25222bf9 100644 --- a/database.py +++ b/database.py @@ -1303,15 +1303,16 @@ async def delete_key(identifier, session): Удаляет ключ из базы данных по client_id или tg_id Args: - identifier (str): client_id или tg_id для удаления + identifier (int | str): client_id или tg_id для удаления session: Сессия базы данных Raises: Exception: В случае ошибки при удалении ключа """ try: - # Проверяем, является ли идентификатор числом (tg_id) или строкой (client_id) - if identifier.isdigit(): + identifier_str = str(identifier) + + if identifier_str.isdigit(): query = "DELETE FROM keys WHERE tg_id = $1" else: query = "DELETE FROM keys WHERE client_id = $1" diff --git a/handlers/admin/admin_stats.py b/handlers/admin/admin_stats.py index 48ad79bb..09dde769 100644 --- a/handlers/admin/admin_stats.py +++ b/handlers/admin/admin_stats.py @@ -23,16 +23,20 @@ async def handle_stats(callback_query: CallbackQuery, session: Any): total_keys = await session.fetchval("SELECT COUNT(*) FROM keys") total_referrals = await session.fetchval("SELECT COUNT(*) FROM referrals") - total_payments_today = await session.fetchval( - "SELECT COALESCE(SUM(amount), 0) FROM payments WHERE created_at >= CURRENT_DATE" + total_payments_today = int( + await session.fetchval("SELECT COALESCE(SUM(amount), 0) FROM payments WHERE created_at >= CURRENT_DATE") ) - total_payments_week = await session.fetchval( - "SELECT COALESCE(SUM(amount), 0) FROM payments WHERE created_at >= date_trunc('week', CURRENT_DATE)" + total_payments_week = int( + await session.fetchval( + "SELECT COALESCE(SUM(amount), 0) FROM payments WHERE created_at >= date_trunc('week', CURRENT_DATE)" + ) ) - total_payments_month = await session.fetchval( - "SELECT COALESCE(SUM(amount), 0) FROM payments WHERE created_at >= date_trunc('month', CURRENT_DATE)" + total_payments_month = int( + await session.fetchval( + "SELECT COALESCE(SUM(amount), 0) FROM payments WHERE created_at >= date_trunc('month', CURRENT_DATE)" + ) ) - total_payments_all_time = await session.fetchval("SELECT COALESCE(SUM(amount), 0) FROM payments") + total_payments_all_time = int(await session.fetchval("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( diff --git a/handlers/start.py b/handlers/start.py index 7f1b8da4..28a8eed3 100644 --- a/handlers/start.py +++ b/handlers/start.py @@ -66,7 +66,6 @@ async def start_command(message: Message, state: FSMContext, session: Any, admin try: member = await bot.get_chat_member(CHANNEL_ID, message.chat.id) if member.status not in ["member", "administrator", "creator"]: - await state.update_data(start_text=message.text) builder = InlineKeyboardBuilder() builder.row(InlineKeyboardButton(text="✅ Я подписался", callback_data="check_subscription")) await message.answer( @@ -184,13 +183,17 @@ async def process_start_logic(message: Message, state: FSMContext, session: Any, return await show_start_menu(message, admin, session) if gift_info["recipient_tg_id"] is not None: - logger.warning(f"Подарок {gift_id} уже привязан к другому пользователю ({gift_info['recipient_tg_id']}).") + logger.warning( + f"Подарок {gift_id} уже привязан к другому пользователю ({gift_info['recipient_tg_id']})." + ) await message.answer("❌ Этот подарок уже был активирован другим пользователем.") return await show_start_menu(message, admin, session) if not connection_exists: await add_referral(recipient_tg_id, gift_info["sender_tg_id"], session) - logger.info(f"Пользователь {recipient_tg_id} теперь является рефералом отправителя {gift_info['sender_tg_id']}.") + logger.info( + f"Пользователь {recipient_tg_id} теперь является рефералом отправителя {gift_info['sender_tg_id']}." + ) selected_months = gift_info["selected_months"] expiry_time = gift_info["expiry_time"].replace(tzinfo=None)