From 9c2b732d55a330872cf543e730e3d41ac977dbb8 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 21 Sep 2024 02:59:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/__pycache__/keys.cpython-310.pyc | Bin 9025 -> 9040 bytes handlers/__pycache__/pay.cpython-310.pyc | Bin 8680 -> 8628 bytes handlers/__pycache__/start.cpython-310.pyc | Bin 5584 -> 5250 bytes handlers/keys.py | 6 +++-- handlers/pay.py | 11 +++++---- handlers/start.py | 14 ------------ key_management.py | 25 +++++++++++++++------ 7 files changed, 29 insertions(+), 27 deletions(-) diff --git a/handlers/__pycache__/keys.cpython-310.pyc b/handlers/__pycache__/keys.cpython-310.pyc index cebee691462da035fdc74c4d6f5a4f3ba4e29513..f4b2f054414f9405281d8bc7ed7a59b6bc58d22e 100644 GIT binary patch delta 2596 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 B7%Tt) diff --git a/handlers/__pycache__/pay.cpython-310.pyc b/handlers/__pycache__/pay.cpython-310.pyc index 1dfa390509e5daae35e1216151c21ac9c9adab83..8cf0dcc0314b7f3cc24099965415699984628c85 100644 GIT binary patch delta 1154 zcmZvZ%WE4~6vpRVNi(B)Xr!@5engTb*(P!8hJ>_`rj+WlcCxkFiR3}FgmNjxS zmY@YWYLU8WYeG0F>C#@9v~*Pz=%z2|U(l_0rBGU^`^ciZK<^zQN?H$`kB>9I`<Jxq~=?CdRtp4wX`S!)Rf=EA0a&N>Cj^ zyQGxEIDpA+xC3tcM1VNQASoOSkaR!{9YYM`NI+x);>0mT8Z!Zr4T$XjiDz&Wa{)5S zksRiqAO-%d`7*;X91q?WFiLw+Ba^)aE4>{i1DL&TXe zZGS^;rO-ax2qD7|hIiRcnEMFIfsZu8t#B(+VHH4S7k1>9RE<<+R9iAeciC(FI$o8; zqOV9T*i#y6HM$S|ZbKyTm5Zbb{F_>V3VSNen0Pv_CGBbZQa?t7Pns(}(BJ9|{S-av zdQ`eC%}Z+XS$cF8|v8|a&KRl5iZ z-P6uQ^c(9pH|Z;FK7UH=V2TTSS7kA#g24=kgUlE(W;_l@D6c!PMBiCS`b}0f|1@VO z*^2)Xy`kq}k=pv()}jar2O&x3U*d3@3dR~N_nO8Xpd;0wXsiI|X)1PFzQ8$t`pww> z__VMyLLx#$fICE{N~ ze2x2GK{T##X}(N%%ooVCC*WG|oP87EeDD5%2lBKaW=M0U^m$=)y30R=2 za{*@Qz*&M#`pdbM=#Q4y(c7r^Cm)DotG$m?KQsB7@N4wmuq%tv{#E*Mc!AG5IWo`s z^KPYY^Xxy<58!}4$vlGB>BDT=JmUB^<6`r_r-#`O_@XY3ex05cG5^`lbG$bh;@D8` z6*!_|ZVbk#lS6ux^GBA%flES)Lh3>~LT2f9{(1cjw{a;B{C?@%d}<(@0wcmJ!|O#} Hiz)aAcr^~2 delta 1281 zcmZvaPiP}m9LMMPGBcS>GL!#F(Z>MJ*l9JFsdy0UKtsYF#L zE9R|fPTY-KanA>wgqyUIo>!cdm9oi!WTi_I)oJihqCs0f@L6N@3^k~E2v){UAC1#6 zjT}nHK%+M7OwgF^ugY{kP7{an0a#fNNuGkFXxbxk9x-+bk)h)rG3gN#rx011^N74h zOg<#$A9RwZ1rI48GDWBEBh%RHbd}Hqq{Me|rC^wy#Sl=>qjpxhKDbV}4NrsV!55s?^^j*X6d-m1|G~ zs`cQy(v^199X}0p6{`2hh^NxF)P*Ch9oW&2VYJ#-FegYuBBuuEaqL51Bg3@$`*Gp_ z$91Kn;ITA{5#e)@4F=eD=L3FQ`!GL9yluZ%wi#=(vTL_mm6~0y(_4g{MTR}XpVKan z-GV{5-f-#-yNvLg%?hKP4SdZn1wP?>+FAZf;K_7o5U8@ITkf=MHXwD%3=wdiXY}Vm z<*)0H^H23>pP9qO);SdNzD7)=geXEp2wN5+GTE$Bjn9H-o< zxHbz2ro@+$i?Gc1l50@sKPPviqlVN9b?c2$KQ{%u)o-MJBWh9jZEj^O^{TM1@!Odd zSp0f?nT)!5IlBiX{!{h~xXE{O{{%LXn}Y$k{7yJw+{339L5X3Lyf^s~PH`;%UG}um zoflvF5c@m73io)iFaxvvjRMsJm3p(a>(tve|Gv-~Uq_Bz5mFY?5ON@7nXgY>e0m;j iM2g@Mh=7Kb7#;^aA`zl1p%fmN2`mLGhqZuJO2L25%OzU? diff --git a/handlers/__pycache__/start.cpython-310.pyc b/handlers/__pycache__/start.cpython-310.pyc index e27b2c4f3b408ecf926ff65bdb87e5d12e958f49..63472a324a77a9a5aca15b29e0bfc86132ff731e 100644 GIT binary patch delta 1678 zcmaJ?O=u)V6t3#&>7JhH?&(R-O#Wt)$*!*3Mv`@ZRCZ%DoBfH0tb(vgLl`=#o^@i^ z%u>@)R{{|eM8Q2sfmijo2Vo&s4}u^f2%h^Q9v5K|yom?jt4TBo;xzrud+&Qy^?s_V zf1dp?aQlu^B=GyieB7C7eC9TG&Qn4dVKgC}hLmfeMp4(29M?l#$+;xYjnLp`X!1f> z;8tkyVp!y*u%viBvAGjEO3o)PFNbCBg`U!lq{2tS5$=b+(#@pGt6`OrnC_CWc5{cY z0<-oAvtn;I7uH!Z);6t<#!AfI)5FoY_T?CJn7c>5qO2Sjfbm#mPv52CxZ*~RaXzam zZbEUje>ql4-Bcnnu?odQ?HX? z`Vkf~(B$XzV>z##qMBUO#weBVYdvbqM_R+EgM+BcQf}U_fLMZepaT?0k&233&5gSz zs0O^>At&UoR$b0H*P3KAziDh!W^WtJxv#$hEmw_Z|dFLNE1e6xh;`Apjo-w zOS(PzquHWO`J37F15@OI7i9#TUwCq@(8!r$Ol}v#vrnOE7#>Qa0GTsLBayZ@`kY5S z=7MQ(M!HthHB5tQ>hb;(7v-uo|9lHrSXXCJ8o@u^I5}BiA&K}pixy|W^A8Q6NW|s+ zeQQy>+5k-0jWEPwdn5y8PO1p1XvTYq!KAuJjzj3kb)j5SPKWjP@(?Py36V zaTF&ICJ|KF(BKP`Mh|Tjs^Hhq z^LRJ1@AI@4TFz3D<3<%L z@>74jbYvO%(67;Z@_Rp^x8?8t)t!qlLqLTZeZ&u}nYFBMqL?&1>R>{NxTRj5i-Ej>=B!`s7*b1Y-(tp=H=`r$fNL1RcWza Jr?y|Ee*;ADS%?4t delta 2113 zcmaJ?O>Epm6!zE~+x!2U|K0qxX)!5n0hN|0L~WYVMs2oH+HkN?-A%@uZtB@h$KIAy zK`BjyKqyGm*N7hp4n3g~B9#Li;Ec36A$;Y8gt)*B5WF{=v`r4|%Aeo7?|Ek4_r}ln zjmA)-7LP|H_#OWKxALEbj}rNnB9SC2QQ}C9n1sou%oI~$Au~kKFFP$vHC16Nj>dFT zXJIqUB4&g|%_xhRF%~!Df)6Qzf0~U;*&P3@ue$XjhE(a|93KIC_(tl)P!~Q^2Kw-KtD4+IZ?DG#)IhD z3ulVObC;}{=}U$j$aK+vL9UXdzai(F2AiUOA9RvDxkKYFN3(tDowA4Cg4O|kcjjwOEb$F z&8{oE9F-vd+~&thMHwG}WdfznorfeyR;o^=YFjt$rP*4E(>m^@vC-ISe7pUjK{&=< zg_QK&fFQ|jw{q9-)cVMPKdcpI>KM~_u>C>fQDbZSUgPoh{l->b<7=4Xo9%aC@Kxh+ zV{6z@_;CmnGxC?fGQwO#M-~B>bK&{)0)nT7U50FXN zbK&@FFqa`0`RlmSD8gxky;JZp@J*xttp7{&la(GcdlC8&#I_Hjh1v5%2!|1#Log7Y zB*o9e&`|f64O8M55GIh<_&D0HAe=-vh43l@$TlQ#Ea$#W2HBlFXG?Q8Ew5%VyIP<2 zkHn9W;+|B+*8VruTR8jK&4=+xvT_b>q0ZjwG!r3#R(EY~Rj3i&S0Ry35O!_Pf^!9( z0pDES1rS8*i*P<{3lB*UF7q0*a29?7BZL4gO#v=TBX};$woRK^LAm)wjJkxdw@N{B zM}Xb%TmGZuAer%hO8!WuHor){OIqo6)BhXSossm=2erj6H*=kW?YGT$$%- z3D$4wESi+iJ|`l$_+B)R1xnN``6OCJgc$@O8Xg*c4dFV%Qw@cc2VbC%uo|s9_9%Sx qCHHxN4kk^cawlkC_4 diff --git a/handlers/keys.py b/handlers/keys.py index 21f8dc55..64875e1e 100644 --- a/handlers/keys.py +++ b/handlers/keys.py @@ -38,12 +38,14 @@ async def process_callback_view_keys(callback_query: types.CallbackQuery): # Редактируем сообщение с клавиатурой await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=inline_keyboard) else: - # Если нет ключей, добавляем кнопку "Создать ключ" + # Если нет ключей, добавляем кнопку "Создать ключ" и "Назад" response_message = "У вас нет ключей." # Кнопка "Создать ключ" create_key_button = types.InlineKeyboardButton(text='Создать ключ', callback_data='create_key') - keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[create_key_button]]) + back_button = types.InlineKeyboardButton(text='Назад', callback_data='view_profile') # Измените на правильное значение для кнопки "Назад" + + keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[create_key_button], [back_button]]) await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=keyboard) diff --git a/handlers/pay.py b/handlers/pay.py index 5cf2db2e..0e1e5101 100644 --- a/handlers/pay.py +++ b/handlers/pay.py @@ -43,12 +43,14 @@ async def process_callback_replenish_balance(callback_query: types.CallbackQuery key_count = await get_key_count(tg_id) if key_count <= 0: - await send_message_with_deletion(tg_id, "У вас нет ключей. Пополнение баланса возможно только при наличии ключа.", state=state, message_key='key_error_message_id') + # Создаем кнопки "Создать ключ" и "Назад" create_key_button = InlineKeyboardButton(text='Создать ключ', callback_data='create_key') - keyboard = InlineKeyboardMarkup(inline_keyboard=[[create_key_button]]) - + back_button = InlineKeyboardButton(text='⬅️ Назад', callback_data='back_to_profile') + keyboard = InlineKeyboardMarkup(inline_keyboard=[[create_key_button, back_button]]) + await callback_query.message.edit_text( - text="Пожалуйста, создайте ключ для продолжения.", + text="У вас нет ключей. Пополнение баланса возможно только при наличии ключа.\n" + "Пожалуйста, создайте ключ для продолжения.", reply_markup=keyboard ) return @@ -65,6 +67,7 @@ async def process_callback_replenish_balance(callback_query: types.CallbackQuery ) await callback_query.answer() + @router.callback_query(lambda c: c.data == 'back_to_profile') async def back_to_profile_handler(callback_query: types.CallbackQuery, state: FSMContext): await process_callback_view_profile(callback_query, state) diff --git a/handlers/start.py b/handlers/start.py index 40ae355f..b7e0fc55 100644 --- a/handlers/start.py +++ b/handlers/start.py @@ -33,26 +33,12 @@ async def start_command(message: types.Message): [button_channel] ]) - reply_keyboard = ReplyKeyboardMarkup( - keyboard=[ - [KeyboardButton(text="Меню")], - # [KeyboardButton(text="Мой профиль")] - ], - resize_keyboard=True - ) - await message.bot.send_message( chat_id=message.chat.id, text=welcome_text, parse_mode='Markdown', reply_markup=inline_keyboard ) - - await message.bot.send_message( - chat_id=message.chat.id, - text="Выберите действие:", - reply_markup=reply_keyboard - ) @router.callback_query(lambda c: c.data == 'about_vpn') async def handle_about_vpn(callback_query: CallbackQuery): diff --git a/key_management.py b/key_management.py index d10d57fb..95b35bfa 100644 --- a/key_management.py +++ b/key_management.py @@ -42,7 +42,7 @@ async def process_callback_create_key(callback_query: CallbackQuery, state: FSMC if trial_status == 1: await callback_query.message.edit_text( - "У вас уже есть активный ключ. Вы можете создать новый ключ за дополнительную плату в размере 100 рублей. " + "У вас уже был пробный ключ. Вы можете создать новый за 100 рублей. " "Хотите продолжить?", reply_markup=InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text='Да, создать новый ключ', callback_data='confirm_create_new_key')], @@ -105,12 +105,12 @@ async def handle_text(message: Message, state: FSMContext): async def handle_key_name_input(message: Message, state: FSMContext): tg_id = message.from_user.id + key_name = sanitize_key_name(message.text) if not key_name: - await message.reply("Имя ключа не указано. Введите имя на английском языке.") - await state.clear() - return + await message.bot.send_message(tg_id, "Назовите профиль на английском языке.") + return # Прерываем выполнение функции data = await state.get_data() creating_new_key = data.get('creating_new_key', False) @@ -122,11 +122,21 @@ async def handle_key_name_input(message: Message, state: FSMContext): expiry_time = int((current_time + timedelta(days=1)).timestamp() * 1000) if creating_new_key: + # Проверяем, занято ли имя ключа + conn = await asyncpg.connect(DATABASE_URL) + try: + existing_key = await conn.fetchrow('SELECT * FROM keys WHERE email = $1', email) + if existing_key: + await message.bot.send_message(tg_id, "Это имя уже занято. Пожалуйста, выберите другое имя.") + return # Прерываем выполнение функции + finally: + await conn.close() + balance = await get_balance(tg_id) if balance < 100: replenish_button = InlineKeyboardButton(text='Перейти в профиль', callback_data='view_profile') keyboard = InlineKeyboardMarkup(inline_keyboard=[[replenish_button]]) - await message.reply("Недостаточно средств на балансе для создания нового ключа.", reply_markup=keyboard) + await message.bot.send_message(tg_id, "Недостаточно средств на балансе для создания нового ключа.", reply_markup=keyboard) await state.clear() return @@ -157,12 +167,13 @@ async def handle_key_name_input(message: Message, state: FSMContext): ]) key_message = f"Ключ создан:\n
{connection_link}
" - await message.reply(key_message, parse_mode="HTML", reply_markup=keyboard) + await message.bot.send_message(tg_id, key_message, parse_mode="HTML", reply_markup=keyboard) except Exception as e: - await message.reply(f"Ошибка при создании ключа: {e}") + await message.bot.send_message(tg_id, f"Ошибка при создании ключа: {e}") await state.clear() + @dp.callback_query(F.data == 'instructions') async def handle_instructions(callback_query: CallbackQuery): instructions_message = (