@R0dya4

Как в aiogram сделать параллельный цикл с отправлением сообщений?

Хочу разобраться как сделать параллельный цикл так чтобы он мог отправить сообщение, находился в машинном состоянии и реагировал на нажатие кнопки "Отмена" останавливая при этом цикл. Пробовал библиотеки *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)
  • Вопрос задан
  • 740 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы