From adf3b044da662a042e96b9ee45571481e6e21f6e Mon Sep 17 00:00:00 2001 From: stevefoxru <53931856+stevefoxru@users.noreply.github.com> Date: Tue, 22 Apr 2025 17:13:14 +0300 Subject: [PATCH] Update bot_manager.py --- awg/bot_manager.py | 48 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/awg/bot_manager.py b/awg/bot_manager.py index aebb470..89cab84 100644 --- a/awg/bot_manager.py +++ b/awg/bot_manager.py @@ -87,6 +87,7 @@ def get_main_menu_markup(user_id): InlineKeyboardButton("πŸ’Ύ Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π΅ΠΊΠ°ΠΏ", callback_data="create_backup"), InlineKeyboardButton("🎟️ Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄Π°ΠΌΠΈ", callback_data="manage_promocodes") ) + markup.add(InlineKeyboardButton("πŸ”„ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ обновлСния", callback_data="check_updates")) return markup user_main_messages = {} @@ -733,11 +734,9 @@ async def select_period_callback(callback_query: types.CallbackQuery): discount = user_main_messages.get(user_id, {}).get('promocode_discount', 0) final_price = price * (1 - discount / 100) - # Π—Π°Π³Π»ΡƒΡˆΠΊΠ° для создания ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° payment_id = str(uuid.uuid4()) db.add_payment(user_id, payment_id, final_price, 'pending') - # ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ здСсь Π±ΡƒΠ΄Π΅Ρ‚ интСграция с ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΠΎΠΉ систСмой payment_url = f"https://example.com/pay/{payment_id}" # Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ URL ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΠΎΠΉ систСмы keyboard = InlineKeyboardMarkup().add( @@ -841,6 +840,31 @@ async def remove_promocode_callback(callback_query: types.CallbackQuery): await callback_query.answer(f"ΠŸΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄ {code} Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½.", show_alert=True) await manage_promocodes_callback(callback_query) +@dp.callback_query_handler(lambda c: c.data == "check_updates") +async def check_updates_callback(callback_query: types.CallbackQuery): + user_id = callback_query.from_user.id + if user_id not in admins: + await callback_query.answer("НСт ΠΏΡ€Π°Π².", show_alert=True) + return + try: + process = await asyncio.create_subprocess_exec( + '/root/install.sh', '--check-update', + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE + ) + stdout, stderr = await process.communicate() + output = stdout.decode().strip() + stderr.decode().strip() + await bot.send_message(user_id, f"Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ:\n```\n{output}\n```", parse_mode="Markdown") + except Exception as e: + await bot.send_message(user_id, f"Ошибка ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ: {str(e)}") + await bot.edit_message_text( + chat_id=callback_query.message.chat.id, + message_id=callback_query.message.message_id, + text="Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ дСйствиС:", + reply_markup=get_main_menu_markup(user_id) + ) + await callback_query.answer() + async def check_expired_keys(): now = datetime.now(pytz.UTC) for user, expiration, _ in db.get_users_with_expiration(): @@ -851,12 +875,9 @@ async def check_expired_keys(): logger.info(f"ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ {user} Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠ·-Π·Π° истСчСния срока дСйствия.") async def check_payment_status(): - # Π—Π°Π³Π»ΡƒΡˆΠΊΠ° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ статуса ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ° - # Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ систСмС здСсь Π±ΡƒΠ΄Π΅Ρ‚ запрос ΠΊ API ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΠΎΠΉ систСмы payments = db.get_all_payments() for payment in payments: if payment['status'] == 'pending': - # ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Π΅ΠΆ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ (Π·Π°Π³Π»ΡƒΡˆΠΊΠ°) db.update_payment_status(payment['payment_id'], 'completed') user_id = payment['user_id'] if user_id in user_main_messages and 'pending_payment' in user_main_messages[user_id]: @@ -865,7 +886,6 @@ async def check_payment_status(): months = {'1_month': 1, '3_months': 3, '6_months': 6}[period] expiration = datetime.now(pytz.UTC) + timedelta(days=30 * months) - # ГСнСрация ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ username = f"user_{user_id}_{uuid.uuid4().hex[:8]}" success = db.root_add(username, ipv6=False) if success: @@ -880,6 +900,21 @@ async def check_payment_status(): user_main_messages[user_id].pop('pending_payment', None) user_main_messages[user_id].pop('promocode_discount', None) +async def auto_check_updates(): + try: + process = await asyncio.create_subprocess_exec( + '/root/install.sh', '--check-update', + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE + ) + stdout, stderr = await process.communicate() + output = stdout.decode().strip() + stderr.decode().strip() + if "Доступно ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅" in output: + for admin_id in admins: + await bot.send_message(admin_id, f"ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅:\n```\n{output}\n```", parse_mode="Markdown") + except Exception as e: + logger.error(f"Ошибка ΠΏΡ€ΠΈ автоматичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ: {str(e)}") + def parse_transfer(transfer_str): if not isinstance(transfer_str, str) or not transfer_str.strip(): logger.error(f"НСкоррСктный transfer_str: {transfer_str}") @@ -932,6 +967,7 @@ async def on_startup(dp): scheduler.add_job(db.ensure_peer_names, IntervalTrigger(minutes=1)) scheduler.add_job(check_expired_keys, IntervalTrigger(minutes=5)) scheduler.add_job(check_payment_status, IntervalTrigger(minutes=1)) + scheduler.add_job(auto_check_updates, IntervalTrigger(hours=24)) async def on_shutdown(dp): scheduler.shutdown()