diff --git a/main.py b/main.py index 02eaa70..c201b1b 100644 --- a/main.py +++ b/main.py @@ -418,6 +418,7 @@ DECODE_PRICE = getenv("DECODE_PRICE",1) CHECK_PRICE = getenv("CHECK_PRICE",10) IMG_PRICE = getenv("IMG_PRICE",100) +ADMIN_USER_ID = int(getenv("ADMIN_USER_ID", "0")) # ID администратора из переменных окружения if is_windows(): image_path = "D:\\SALVAGEDB\\salvagedb_bot\\images" @@ -466,7 +467,13 @@ async def command_start_handler(message: Message, db: OracleDatabase = None) -> builder.button(text="Help", callback_data="help") builder.button(text="Prices", callback_data="prices") builder.button(text="Go Salvagedb.com", url="https://salvagedb.com") - builder.adjust(3, 2) + + # Добавляем кнопку администратора только для админа + if message.from_user.id == ADMIN_USER_ID: + builder.button(text="📊 Admin Stats", callback_data="admin_stats") + builder.adjust(3, 3, 1) + else: + builder.adjust(3, 2) await message.answer(welcome_text, reply_markup=builder.as_markup()) @@ -625,6 +632,52 @@ async def prices_callback(callback: CallbackQuery, db: OracleDatabase = None): await callback.answer() +@dp.callback_query(lambda c: c.data == "admin_stats") +async def admin_stats_callback(callback: CallbackQuery, db: OracleDatabase = None): + # Используем переданный db или глобальный oracle_db + database = db or oracle_db + + # Проверяем, является ли пользователь администратором + if callback.from_user.id != ADMIN_USER_ID: + await callback.answer("❌ Access denied. This command is for administrators only.", show_alert=True) + return + + # Сохраняем данные пользователя при нажатии кнопки админки + await database.save_user(callback.from_user, "admin_stats_button") + + try: + # Получаем общую статистику + stats = await database.get_users_summary() + + # Формируем отчет + report = f"""📊 **Bot Users Statistics** + +👥 **Users Overview:** +• Total users: {stats.get('total_users', 0)} +• Premium users: {stats.get('premium_users', 0)} + +💰 **Revenue:** +• Total revenue: {stats.get('total_revenue', 0)} ⭐️ +• Total transactions: {stats.get('total_transactions', 0)} + +📈 **Activity:** +• Active last 24h: {stats.get('active_last_24h', 0)} +• Active last week: {stats.get('active_last_week', 0)} + +📅 **Generated:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}""" + + # Создаем кнопку возврата в главное меню + builder = InlineKeyboardBuilder() + builder.button(text="🏠 Back to Main Menu", callback_data="main_menu") + + await callback.message.answer(report, reply_markup=builder.as_markup(), parse_mode="Markdown") + await callback.answer() + + except Exception as e: + logging.error(f"Error generating admin stats via callback: {e}") + await callback.answer("❌ Error generating statistics. Please try again later.", show_alert=True) + + @dp.callback_query(lambda c: c.data and c.data.startswith("pay_detailed_info:")) async def pay_detailed_info_callback(callback: CallbackQuery, db: OracleDatabase = None): # Используем переданный db или глобальный oracle_db @@ -819,7 +872,7 @@ async def pre_checkout_handler(pre_checkout_query: PreCheckoutQuery, db: OracleD await pre_checkout_query.answer(ok=True) -ADMIN_USER_ID = int(getenv("ADMIN_USER_ID", "0")) # ID администратора из переменных окружения + @dp.message(Command("admin_stats")) async def admin_stats_handler(message: Message, db: OracleDatabase = None):