From 16c776bf829e07b1d5e09fca3a0fe499aa6b4eb3 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 2 Oct 2024 01:19:48 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=BB=D0=B0=D1=82=D0=B5=D0=B6=D0=B5=D0=B9?= =?UTF-8?q?,=20=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D1=84=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/start.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/handlers/start.py b/handlers/start.py index d6d8b725..c47f7e0a 100644 --- a/handlers/start.py +++ b/handlers/start.py @@ -60,10 +60,11 @@ async def handle_about_vpn(callback_query: CallbackQuery): info_message = ( "*О VPN*\n\n" - "Мы используем VLESS для обеспечения безопасного и надежного подключения к интернету. " - "Каждому пользователю предоставляется индивидуальный ключ для подключения. " - "Этот ключ необходим для использования нашего VPN-сервиса." + "Мы используем высокоскоростные серверы в разных локациях и выдаём ключ каждому индивидуально. " + "Также мы применяем новейшие протоколы шифрования для обеспечения безопасности ваших данных.\n\n" + "Ваш ключ — ваша безопасность! Не передавайте своё шифрование сторонним лицам." ) + button_back = InlineKeyboardButton(text='⬅️ Назад', callback_data='back_to_menu') inline_keyboard_back = InlineKeyboardMarkup(inline_keyboard=[[button_back]]) From 3937cb105c9d9de7edaeb070d3a3b2b405001b3c Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 2 Oct 2024 01:35:39 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B2=20=D1=81=D1=82=D1=83=D1=80=D0=BA=D1=82=D1=83=D1=80?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0,=20isort,?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 7 +++---- handlers/balance.py | 10 ---------- .../key_management.py | 1 - handlers/keys.py | 13 ------------- handlers/notifications.py | 18 ++---------------- handlers/pay.py | 13 +++++++------ handlers/profile.py | 2 -- handlers/start.py | 6 +++--- 8 files changed, 15 insertions(+), 55 deletions(-) delete mode 100644 handlers/balance.py rename key_management.py => handlers/key_management.py (99%) diff --git a/bot.py b/bot.py index 7c18c5d8..0e93fb3b 100644 --- a/bot.py +++ b/bot.py @@ -9,15 +9,14 @@ storage = MemoryStorage() dp = Dispatcher(bot=bot, storage=storage) router = Router() -from handlers import balance, keys, notifications, pay, profile, start -from key_management import router as key_management_router +from handlers import key_management, keys, notifications, pay, profile, start +from handlers.key_management import router as key_management_router # Регистрация обработчиков dp.include_router(start.router) dp.include_router(profile.router) dp.include_router(keys.router) -dp.include_router(balance.router) -dp.include_router(key_management_router) +dp.include_router(key_management.router) dp.include_router(pay.router) dp.include_router(notifications.router) diff --git a/handlers/balance.py b/handlers/balance.py deleted file mode 100644 index 1ee5eb8c..00000000 --- a/handlers/balance.py +++ /dev/null @@ -1,10 +0,0 @@ -import aiosqlite -from aiogram import Router, types - -router = Router() - -@router.callback_query(lambda c: c.data == 'view_balance') -async def process_callback_view_balance(callback_query: types.CallbackQuery): - tg_id = callback_query.from_user.id - - diff --git a/key_management.py b/handlers/key_management.py similarity index 99% rename from key_management.py rename to handlers/key_management.py index 0b181b10..4a1b54fd 100644 --- a/key_management.py +++ b/handlers/key_management.py @@ -1,4 +1,3 @@ -import asyncio import re import uuid from datetime import datetime, timedelta diff --git a/handlers/keys.py b/handlers/keys.py index 07bd5d30..10a12eee 100644 --- a/handlers/keys.py +++ b/handlers/keys.py @@ -11,19 +11,6 @@ from database import get_balance, update_balance router = Router() -from datetime import datetime, timedelta - -import asyncpg -from aiogram import Router, types - -from auth import login_with_credentials -from bot import bot -from client import delete_client, extend_client_key -from config import ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL -from database import get_balance, update_balance - -router = Router() - # Обработка запроса на просмотр ключей @router.callback_query(lambda c: c.data == 'view_keys') async def process_callback_view_keys(callback_query: types.CallbackQuery): diff --git a/handlers/notifications.py b/handlers/notifications.py index e2ebddb0..31dc7bf0 100644 --- a/handlers/notifications.py +++ b/handlers/notifications.py @@ -1,33 +1,19 @@ from datetime import datetime, timedelta import asyncpg -from aiogram import Bot, Router, types -from aiogram.filters import Command -from aiogram.fsm.context import FSMContext +from aiogram import Bot, Router from aiogram.fsm.state import State, StatesGroup from aiogram.types import ( # Импортируем необходимые классы InlineKeyboardButton, InlineKeyboardMarkup) from bot import bot -from config import ADMIN_ID, DATABASE_URL -from database import get_all_users +from config import DATABASE_URL router = Router() class NotificationStates(StatesGroup): waiting_for_notification_text = State() -from datetime import datetime, timedelta - -import asyncpg -from aiogram import Bot, Router, types -from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup - -from bot import bot -from config import DATABASE_URL - -router = Router() - async def notify_expiring_keys(bot: Bot): try: conn = await asyncpg.connect(DATABASE_URL) diff --git a/handlers/pay.py b/handlers/pay.py index a9e19620..901cf5b7 100644 --- a/handlers/pay.py +++ b/handlers/pay.py @@ -1,17 +1,18 @@ +import logging +import uuid + import asyncpg from aiogram import Router, types from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup -from yookassa import Configuration, Payment # Импортируем ЮKассу from aiohttp import web -import logging -import uuid +from yookassa import Configuration, Payment # Импортируем ЮKассу from bot import bot -from config import YOOKASSA_SECRET_KEY, YOOKASSA_SHOP_ID -from database import (add_connection, check_connection_exists, get_balance, - get_key_count, update_balance) +from config import YOOKASSA_SECRET_KEY, YOOKASSA_SHOP_ID +from database import (add_connection, check_connection_exists, get_key_count, + update_balance) from handlers.profile import process_callback_view_profile router = Router() diff --git a/handlers/profile.py b/handlers/profile.py index 260d47cb..e3643d2b 100644 --- a/handlers/profile.py +++ b/handlers/profile.py @@ -1,5 +1,3 @@ -from datetime import datetime - from aiogram import Router, types from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup diff --git a/handlers/start.py b/handlers/start.py index c47f7e0a..8888d894 100644 --- a/handlers/start.py +++ b/handlers/start.py @@ -1,14 +1,14 @@ import os -from aiogram import Router, types +from aiogram import Router from aiogram.filters import Command -from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup from aiogram.types import (BufferedInputFile, CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup, Message) from bot import bot -from config import ADMIN_ID, CHANNEL_URL, SUPPORT_CHAT_URL # Добавьте SUPPORT_CHAT_URL +from config import (ADMIN_ID, CHANNEL_URL, # Добавьте SUPPORT_CHAT_URL + SUPPORT_CHAT_URL) router = Router() From 60d7e89452992d6aee93b0656fefccba02a3312b Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 2 Oct 2024 02:06:42 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=B5=D0=BA=D1=88=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=20=D0=B0=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D1=8F=D1=8E=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 5 ----- handlers/notifications.py | 22 +++++++++++++++++----- handlers/solo_pic.png | Bin 1740 -> 0 bytes 3 files changed, 17 insertions(+), 10 deletions(-) delete mode 100644 handlers/solo_pic.png diff --git a/bot.py b/bot.py index 0e93fb3b..0c12b0f8 100644 --- a/bot.py +++ b/bot.py @@ -19,8 +19,3 @@ dp.include_router(keys.router) dp.include_router(key_management.router) dp.include_router(pay.router) dp.include_router(notifications.router) - - - -async def on_startup(dispatcher: Dispatcher): - await login_with_credentials() diff --git a/handlers/notifications.py b/handlers/notifications.py index 31dc7bf0..510886f4 100644 --- a/handlers/notifications.py +++ b/handlers/notifications.py @@ -7,7 +7,9 @@ from aiogram.types import ( # Импортируем необходимые к InlineKeyboardButton, InlineKeyboardMarkup) from bot import bot -from config import DATABASE_URL +from config import DATABASE_URL, ADMIN_PASSWORD, ADMIN_USERNAME +from client import delete_client +from auth import login_with_credentials router = Router() @@ -48,21 +50,31 @@ async def notify_expiring_keys(bot: Bot): # Обрабатываем истекшие ключи expired_records = await conn.fetch(''' - SELECT tg_id, email FROM keys + SELECT tg_id, email, client_id FROM keys WHERE expiry_time <= $1 ''', datetime.utcnow().timestamp() * 1000) for record in expired_records: tg_id = record['tg_id'] email = record['email'] + client_id = record['client_id'] + + # Удаляем ключ из базы данных + await conn.execute('DELETE FROM keys WHERE client_id = $1', client_id) + + # Создаем сессию с использованием учетных данных + session = login_with_credentials(ADMIN_USERNAME, ADMIN_PASSWORD) + + # Удаляем клиента из панели + delete_client(session, client_id) keyboard = InlineKeyboardMarkup(inline_keyboard=[ - [InlineKeyboardButton(text='1 месяц (100 руб.)', callback_data=f'renew_plan|1|{record["client_id"]}')], - [InlineKeyboardButton(text='3 месяца (250 руб.)', callback_data=f'renew_plan|3|{record["client_id"]}')], + [InlineKeyboardButton(text='1 месяц (100 руб.)', callback_data=f'renew_plan|1|{client_id}')], + [InlineKeyboardButton(text='3 месяца (250 руб.)', callback_data=f'renew_plan|3|{client_id}')], [InlineKeyboardButton(text='Пополнить баланс', callback_data='replenish_balance')] ]) - message = f"Ваш ключ {email} уже истек. Пожалуйста, продлите его." + message = f"Ваш ключ {email} уже истек и был удален. Пожалуйста, продлите его." await bot.send_message(chat_id=tg_id, text=message, parse_mode='HTML', reply_markup=keyboard) finally: diff --git a/handlers/solo_pic.png b/handlers/solo_pic.png deleted file mode 100644 index 484f1bdc73ce9f94c7158e394f5080da08e70381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1740 zcmbVNYd8}M7@kCOzm)4}QmNcFcEV6D&81U@h{~Dz{W}iW72( z6B9xXGS|7ar5yK>*kNNF=kNJ>zUO(r_j$kP`}O{K-!u<*7X?{uSpWc_;O2VKYoELJ zVIw2Gzx#cPpY78@vZI@~%>LY#2~XYETG4R7=&J;DbZiI-1;F45Q798~7zu^Kld**8 zRmqm~`%k7gZ@*|K5-KDbN5F%;aZ#xKBLKiIW!HerA)o;|yN=xqG6$POL0}6Q!~zDk zw$=ae5CD)q;dar%`&J?UQxNt#NB7XTs`NY{U2f0=WI3ZRtGk>cn!c-jR!XCCy4BnN z*I=ar4r64&32pxEca}FQ@iD5pgZA((<8!3PtZn#MqP#HVVbS#ELD!z6&m5@Vn9@=a zpOv+MOjR8gt@`R-D`TSIlU4VoBy~VoRFe5#Oj^xKI&!OegZUF3kg2E82DCe%f>c|U zJ*aH%LY#5^hO2_lcr3uE&|ia7mqGT~2%5@qh9_qzF#bbG88OxGH1N2(EF(3!O+U2s zf65Mt^QdP50BxxEQnC@E$GidS{=hXTv*;6 zl6L9vX>Ho05r-E65~4xZ*zE_b@hRACo(t-H!c4^qSKYu&aiw-t-~j6kdo|2$48BR1 z%PTGNd5F;bV^w3bo_Vyyx}Uv0E^o-vDW#ALJ`LC2Bp;b$ z>2{^L%9Q52f4(d#e<0eN!16g56-vZ`KE{w$tZ}?OC|+&V{i!4c&);su-b`t{!vLh> z8Tg<_P6m`rgzvcjc)%EXEi^kT=gjP@qeyYn$HnO4g|8_!Sz6~CiE9^#IO=-kZqWK- z(-daD$=6SZpkZ|+15Ex+07vXu;yS73y$E5YS^e0{qYtiVIu{3Inr!zP%7@L#1^7kQ z)QyGy=O6^tE}VwmybsB|GHl?-*A1@+)EwGfp|1s_QJNH5p-Fb3F1pgDqo!Z!i&S>| ze1%XMJP#5yLql87RZmE;?fHRnSp;fo)S1X9q^dNwk!h#{AXoKl1^2nQb7f9gWc8(a zIz!bgd81nzy?4#AF~H%&Jp;XfC1fKffy|0ObWf?Cn>Tq2{6i8re&WI<>>UI8%$g)E zcZNCMMTC0(fvm-QM8vfuJ6mOJyql1il!zbsm?v@<8U&cwZ0*|MGy!#S*VyS)A_D(% zyrXHh90h%%r)owxD|;$y@&4n#^F1&BGD%cB96A1l7u5FLvbG-SxR9gmSoMB-k*6I9 z-2Pe7zc~0*toZ~2q@)IAQL9j4)x4!2X}jcq+E-D3Tyb_EjKj%oHptx+=< zuBuQCEN+t^-aGG3ww;;9R8;az1_{5%LaO?@V~;}#i0ZniH2w<*=LAp!1U+|dWz&ob zJ=NJ;=B6GIGrFpd+_LI#r5npdeedRWZJ?12*D-b8;W0EaWo0?Y>Y9J0`+bYec4&?r z1Qy~nq+2?a6OIl~x5$Xn8UHy~O~Whte$_|^)uMNo%cI(JI<3c+*asC140C$>_@UfO zSx638Siyg*`f4@AKIxEkV-tlhXB?m%{$~s};c;5$yn?(rt!xX+-#sB~S