Как в aiogram сделать параллельный цикл с отправлением сообщений?
Хочу разобраться как сделать параллельный цикл так чтобы он мог отправить сообщение, находился в машинном состоянии и реагировал на нажатие кнопки "Отмена" останавливая при этом цикл. Пробовал библиотеки threading, но что-то не пошло.
Пишу бота для себя чтобы разобраться получше с Aiogram
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
import threading, time
p2p = QiwiP2P(auth_key=Qiwi_Token.P2P_Qiwi_Token) #Токен Киви кошелька
bot = Bot(token="#####", parse_mode=types.ParseMode.HTML)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
class BuyState(StatesGroup): #Машинное состояние
Buy_CM = State()
async def funct(state=BuyState.Buy_CM): #функция проверки платежа
global a
a = 0
while True: #Создание цикла
#Проверка статуса оплаты
if p2p.check(new_bill.bill_id).status == 'PAID': #Проверка, на то - дошла ли оплата до бота. В случае положительного ответа, он выполняет данный if.
await message.answer("Вы оплатили")
break #Завершение цикла
elif p2p.check(new_bill.bill_id).status == "EXPIRED": #Делаем проверку
await message.answer('Мужик, ты че не оплатил?')
break #Завершение цикла
if p2p.check(new_bill.bill_id).status == 'REJECTED': #Проверка, на то - дошла ли оплата до бота. В случае положительного ответа, он выполняет данный if.
break #Завершение цикла
time.sleep(5)
time.sleep(0.1) #Спим некое время, чтобы бот не крашнулся.
@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() #Запуск состояния оплаты
global new_bill
global file
new_bill = p2p.bill(bill_id=random.choice(range(100,99999999)), amount=150, lifetime=10)
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)
await funct()
@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)```