Как решить проблему глобальных переменных при написании телеграмм бота

Я написал такую оболочку для парсера в виде телеграмм бота(прошу прощения за отступы, при вставке текста не получилось их отладить).

    import asyncio import logging import sys from os import getenv from aiogram import  Dispatcher, html, Bot, F from aiogram.client.default import DefaultBotProperties from aiogram.enums import ParseMode from aiogram.filters import CommandStart, Command from aiogram.types import Message from aiogram.fsm.state import State, StatesGroup from aiogram.fsm.context import FSMContext import time import random
        
        from keyboards import reply  from main import find_items
        
        
        TOKEN = getenv("BOT_TOKEN") 
        bot = Bot(token=TOKEN) 
        dp = Dispatcher() 
        cont = True
        
        class parameter(StatesGroup):
            max_price = State()
            min_price = State()
            show_broken = State()
        
        #Получаем нужную информацию с помощью машины состояний
        @dp.message(CommandStart()) async def command_start_handler(message: Message, state: FSMContext):
            """
            This handler receives messages with `/start` command
            """
            await message.answer(f"""Привет, {message.from_user.full_name}!\n Для начала отправки обьявлений укажите максимальную цену. """)
            await state.set_state(parameter.max_price)
        
        @dp.message(lambda message: message.text.isdigit(), parameter.max_price) 
        async def set_max_price(message: Message, state: FSMContext):
            await state.update_data(max_price=message.text)
            await message.answer(f"Установлена максимальная цена: {message.text}")
            await message.answer("Напишите минимальную цену...")
            await state.set_state(parameter.min_price)
        
        
        @dp.message(lambda message: message.text.isdigit(), parameter.min_price) 
        async def set_min_price(message: Message, state: FSMContext):
            await state.update_data(min_price=message.text)
            await message.answer(f"Установлена минимальная цена: {message.text}")
            await message.answer("Показывать обьявления с предположительно нерабочими компьютерами?", reply_markup=reply.show_kb)
            await state.set_state(parameter.show_broken)
        
        @dp.message(F.text == "Да" or "Нет", parameter.show_broken) 
        async def set_show_broken(message: Message, state: FSMContext): 
            if message.text == "Да":
                await state.update_data(show_broken=True)
            elif message.text == "Нет":
                await state.update_data(show_broken=False)
            data = await state.get_data()
            await message.answer(f"Установлены настройки:\nМаксимальная цена:{data['max_price']}\nМинимальная цена:{data['min_price']}\nПоказывать предположительно  сломаннае ПК:{data['show_broken']}")
            await state.clear()
            await message.answer("Принято. Бот начал анализ обьявлений, обычно это занимает около 5-ти минут...")
    #Теперь с полученной информацией, по одной странице, анализируем объявления и отправляем подходящие под требования.
            startP = 1
            global cont
            while cont == True:
                
                founded_items = find_items(max_price=int(data["max_price"]), min_price=int(data["min_price"]), show_broken=data["show_broken"], finish_page=startP+1, start_page=startP)
        
                for item in founded_items:
                    time.sleep(0.1)
                    await message.answer(f"""
                                            Ссылка: {item["Link"]}\nНазвание: {item["Tittle"]}\nЦена:{item["Prise"]}\nОписание:{item["Description"]}\nДоставка:{item["Delivery"]}\nДата публикации: {item["Date of application"]}\nМесто: {item["Geoposition"]}\nСтраница на которой найден: {item["Page"]}
                                        """)
                startP += 1
                if startP == 100:
                    time.sleep(random.randint(300, 900))
        
        @dp.message(Command("/stop")) 
        async def stop(message: Message, state: FSMContext):
            global cont 
            cont = False
            print("Отправка обьявлений приостановлена")
        
        
        
        async def main():
            await bot.delete_webhook(drop_pending_updates=True)
            await dp.start_polling(bot)
        
        asyncio.run(main())

Проблема в том что прекращение рассылки осуществлено через глобальную переменную cont(типа continue), по умолчанию она всегда равна True, по команде /stop ей задаётся значение False и цикл заканчивается. Во 1-х само использование глобальных переменных не рекомендуется. И если ботом будет пользоваться более одного человека, получается команда /stop от одного пользователя будет останавливать рассылки вообще всех пользователей? Могу ли я как-нибудь сделать так чтоб у каждого пользователя эта переменная была своя? Или какие есть другие способы прерывания отсылки сообщений?


Ответы (0 шт):