Хочу разобраться как сделать параллельный цикл так чтобы он мог отправить сообщение, находился в машинном состоянии и реагировал на нажатие кнопки "Отмена" останавливая при этом цикл. Пробовал библиотеки *threading*, но что-то не пошло.
Пишу бота для себя чтобы разобраться получше с *Aiogram*
from aiogram import Bot, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import Dispatcher, FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.utils import executor
from pyautogui import *
from pyqiwip2p import QiwiP2P
from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime
import Qiwi_Token
import random
p2p = QiwiP2P(auth_key=Qiwi_Token.P2P_Qiwi_Token) #Токен Киви кошелька
file = "GTA5 game.jpg"
bot = Bot(token="#####", parse_mode=types.ParseMode.HTML)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
class BuyState(StatesGroup): #Машинное состояние
Buy_CM = State()
@dp.message_handler(commands=["start"])
async def start_message(message: types.Message):
await message.answer("Привет, вы попали в магазин\n<b>Telegram Games</b>\n"
"Где вы можете купить игру GTA5 Online\nнажав команду <b>/buy</b> ")
@dp.message_handler(commands=["help"])
async def help_message(message: types.Message):
await message.answer("Наберите команду <b>/buy</b>\nЧтобу купить товар")
@dp.message_handler(commands=['buy'])
async def cmd_buy(message: types.Message):
await BuyState.Buy_CM.set() #Запуск состояния оплаты
new_bill = p2p.bill(bill_id=random.choice(range(100,99999999)), amount=150, lifetime=0.1)
print(new_bill.bill_id, new_bill.pay_url)
button1 = types.InlineKeyboardButton(text="К оплате 150,00 RUB", url=new_bill.pay_url)
button2 = types.InlineKeyboardButton(text="Отменить", callback_data="Отменить")
markup = types.InlineKeyboardMarkup(row_width=1)
markup.add(button1,button2)
file = "GTA5 game.jpg"
photo = types.InputFile(file)
await bot.send_photo(message.chat.id,photo=photo,caption=""
"<b>Epic Games аккаунт с игрой GTA 5</b>\n"
"ПРЕДОСТАВЛЯЕСТЯ смена данных аккаунта + Доступ к почте\n"
"Банов в онлайне нет\n"
"<u>100% Гарантией Безопасности</u> (Пожизненно)интересуйтесь на все вопросы отвечу.",
reply_markup=markup)
while True: #Создание цикла
#Проверка статуса оплаты
if p2p.check(new_bill.bill_id).status == 'PAID': #Проверка, на то - дошла ли оплата до бота. Вслучае положительного ответа, он выполняет данный if.
await message.answer("544")
break #Завершение цикла
elif p2p.check(new_bill.bill_id).status == "EXPIRED": #Делаем проверку, на время оплаты. То есть в случае неоплаты в течении 7-ми минут, цикл прекращается.
await message.answer('Мужик, ты че не оплатил?')
break #Завершение цикла
if p2p.check(new_bill.bill_id).status == 'REJECTED': #Проверка, на то - дошла ли оплата до бота. Вслучае положительного ответа, он выполняет данный if.
break #Завершение цикла
sleep(5)
sleep(0.1) #Спим некое время, чтобы бот не крашнулся.
@dp.callback_query_handler(text="Отменить", state=BuyState.Buy_CM)
async def photo_update(call: types.CallbackQuery, state: FSMContext): #При нажатии инлайн кнопки отмены срабатывает код
photo_update = types.InputMedia(media=types.InputFile(file), caption=""
"<b>Epic Games аккаунт с игрой GTA 5</b>\n"
"ПРЕДОСТАВЛЯЕСТЯ смена данных аккаунта + Доступ к почте\n"
"Банов в онлайне нет\n"
"<u>100% Гарантией Безопасности</u> (Пожизненно)интересуйтесь на все вопросы отвечу.")
await call.message.edit_media(photo_update)
await bot.send_message(call.from_user.id,'Вы отменили заказ')
p2p.reject(bill_id=new_bill.bill_id)
await state.finish()
if __name__ == "__main__":
executor.start_polling(dp, skip_updates=True)