Добавлены состояния для вывода средств и реализована логика обработки запроса на вывод. Пользователь теперь может вводить сумму для вывода, а также обрабатываются ошибки ввода и подключения к API.

This commit is contained in:
Redsandyg 2025-06-13 14:12:56 +03:00
parent 6d9b018231
commit bc138e00d0

85
main.py
View File

@ -175,6 +175,9 @@ class LinkStates(StatesGroup):
waiting_for_description = State() waiting_for_description = State()
link_created = State() link_created = State()
class WithdrawStates(StatesGroup):
waiting_for_amount = State()
@dp.callback_query(F.data == 'create_link') @dp.callback_query(F.data == 'create_link')
async def create_link(callback: types.CallbackQuery, state: FSMContext): async def create_link(callback: types.CallbackQuery, state: FSMContext):
sent = await callback.message.edit_text( sent = await callback.message.edit_text(
@ -242,8 +245,86 @@ async def back_to_links_from_success(callback: types.CallbackQuery, state: FSMCo
await callback.answer() await callback.answer()
@dp.callback_query(F.data == 'withdraw') @dp.callback_query(F.data == 'withdraw')
async def not_implemented_withdraw(callback: types.CallbackQuery): async def withdraw_funds(callback: types.CallbackQuery, state: FSMContext):
await callback.answer('Функция вывода средств пока не реализована.', show_alert=True) """
Запрашивает сумму для вывода средств.
"""
sent = await callback.message.edit_text(
'Введите сумму для вывода:',
reply_markup=InlineKeyboardMarkup(
inline_keyboard=[[InlineKeyboardButton(text='Назад', callback_data='back_to_main_from_withdraw')]]
)
)
await state.set_state(WithdrawStates.waiting_for_amount)
await state.update_data(withdraw_msg_id=sent.message_id)
await callback.answer()
@dp.callback_query(F.data == 'back_to_main_from_withdraw', WithdrawStates.waiting_for_amount)
async def back_to_main_from_withdraw(callback: types.CallbackQuery, state: FSMContext):
await callback.message.edit_text(WELCOME_TEXT, reply_markup=main_keyboard)
await state.clear()
await callback.answer()
@dp.message(WithdrawStates.waiting_for_amount)
async def process_withdraw_amount(message: types.Message, state: FSMContext):
try:
amount = float(message.text.strip())
if amount <= 0:
await message.answer('Сумма для вывода должна быть положительной.')
return
except ValueError:
await message.answer('Пожалуйста, введите корректное число для суммы.')
return
tg_id = message.from_user.id
token = user_tokens.get(tg_id)
if not token:
await message.answer('Ошибка авторизации. Пожалуйста, перезапустите бота командой /start.')
await state.clear()
return
headers = {"Authorization": f"Bearer {token}"}
data = await state.get_data()
withdraw_msg_id = data.get('withdraw_msg_id')
if withdraw_msg_id:
try:
await message.bot.edit_message_reply_markup(
chat_id=message.chat.id,
message_id=withdraw_msg_id,
reply_markup=None
)
except Exception:
pass
async with aiohttp.ClientSession() as session:
try:
async with session.post(f'{API_URL}/withdraw', json={'tg_id': tg_id, 'amount': amount}, headers=headers) as resp:
if resp.status == 200:
response_data = await resp.json()
transaction_id = response_data.get('transaction_id')
await message.answer(
f'Запрос на вывод средств успешно создан!\nСумма: {amount:.2f}\nID транзакции: {transaction_id}',
reply_markup=InlineKeyboardMarkup(
inline_keyboard=[[InlineKeyboardButton(text='Назад', callback_data='back_to_main')]]
)
)
else:
error_detail = 'Неизвестная ошибка'
try:
error_json = await resp.json()
if 'detail' in error_json:
error_detail = error_json['detail']
except Exception:
pass
await message.answer(f'Ошибка при создании заявки на вывод средств: {error_detail}')
except aiohttp.ClientConnectorError:
await message.answer('Не удалось подключиться к серверу API. Пожалуйста, попробуйте позже.')
except Exception as e:
await message.answer(f'Произошла непредвиденная ошибка: {e}')
await state.clear()
@dp.callback_query(F.data == 'question') @dp.callback_query(F.data == 'question')
async def not_implemented_question(callback: types.CallbackQuery): async def not_implemented_question(callback: types.CallbackQuery):