Как стать автором
Обновить

Комментарии 7

Не знаком с тонкостями программирования на питоне, но бросилось в глаза - это нормально когда в одном файле куча функций с одинаковым названием start_questionnaire_process и одинаковыми аргументами?

В случае декораторов да. Для чистоты кода, конечно, можно указывать разные и замечание верное, но на работу ботов это не влияет.

Приветствую
Осваиваю ботостроение, и вот с чем столкнулся
Как сделать FSM персонализированным?
Например у меня есть код(ниже), он запускает цикл при получении от пользователя сообщения с текстом "петля", бот спамит случайными цифрами с интервалом в 1 секунду, раз в 15 секунд просит его остановить, если пользователь напишет боту "остановись", бот прекращает это безобразие о чём уведомляет пользователя, НО!
Если у нас есть 2 пользователя с запущенным циклом, до достаточно одному остановить цикл, чтобы у 2 он тоже прервался, проще говоря, если 2 человека написали боту "петля", а потом один из них отправил боту "остановись", то бот прерывает цикл у обоих, как этого избежать?

class spamloop(StatesGroup):

    spamlooping = State()

   

@HF_router.message(F.text.lower().contains('петля'))

async def loop_step1(message: Message,state: FSMContext):

    global looping

    await message.answer_photo(photo='https://memchik.ru//images/memes/603d2831b1c7e31af5729491.jpg')

    await asyncio.sleep(1)

    await message.answer('СКАЖИ МНЕ ОСТАНОВИТЬСЯ')

    looping = True

    iteration = 1

    await state.set_state(spamloop.spamlooping)

    while looping:        

        iteration = iteration+1

        if iteration % 15 == 0:

            await message.answer('ПОЖАЛУЙСТА СКАЖИ МНЕ ОСТАНОВИТЬСЯ')

        number = random.randint(100000000, 999999999)

        await asyncio.sleep(1)

        if looping == True:

            await message.answer(f'{number}')

    await state.clear()

   

@HF_router.message(spamloop.spamlooping)

async def loop_step2(message: Message, state: FSMContext):

    global looping

    if message.text.lower() == "остановись":

        await state.update_data(name=message.text)

        await message.answer_photo(photo='https://www.meme-arsenal.com/memes/a0867fa07d80080b0dbc828cb58f8017.jpg')

        looping = False    

Приветствую
Осваиваю ботостроение, и вот с чем столкнулся
Как сделать FSM персонализированным?
Например у меня есть код(ниже), он запускает цикл при получении от пользователя сообщения с текстом "петля", бот спамит случайными цифрами с интервалом в 1 секунду, раз в 15 секунд просит его остановить, если пользователь напишет боту "остановись", бот прекращает это безобразие о чём уведомляет пользователя, НО!
Если у нас есть 2 пользователя с запущенным циклом, до достаточно одному остановить цикл, чтобы у 2 он тоже прервался, проще говоря, если 2 человека написали боту "петля", а потом один из них отправил боту "остановись", то бот прерывает цикл у обоих, как этого избежать?

class spamloop(StatesGroup):

    spamlooping = State()

   

@HF_router.message(F.text.lower().contains('петля'))

async def loop_step1(message: Message,state: FSMContext):

    global looping

    await message.answer_photo(photo='https://memchik.ru//images/memes/603d2831b1c7e31af5729491.jpg')

    await asyncio.sleep(1)

    await message.answer('СКАЖИ МНЕ ОСТАНОВИТЬСЯ')

    looping = True

    iteration = 1

    await state.set_state(spamloop.spamlooping)

    while looping:        

        iteration = iteration+1

        if iteration % 15 == 0:

            await message.answer('ПОЖАЛУЙСТА СКАЖИ МНЕ ОСТАНОВИТЬСЯ')

        number = random.randint(100000000, 999999999)

        await asyncio.sleep(1)

        if looping == True:

            await message.answer(f'{number}')

    await state.clear()

   

@HF_router.message(spamloop.spamlooping)

async def loop_step2(message: Message, state: FSMContext):

    global looping

    if message.text.lower() == "остановись":

        await state.update_data(name=message.text)

        await message.answer_photo(photo='https://www.meme-arsenal.com/memes/a0867fa07d80080b0dbc828cb58f8017.jpg')

        looping = False    

Вы сильно усложнили задачу. FSM изначально персонализорован. В этом же его смысл)) В данном случае не нужно спамить. Добавляйте 2 кнолки: случайное число и стоп. По клику на случайное число бот будет отправлять число с интервалом в 1 секунду и кнопку "Остановить". И так до клика на стоп. Тем самым вы не нарушите принцип сложного сценария и, как вы говорите, сделаете его "персональным"

Кнопки не всегда подходят под задачу, если пишем некую пасхалку\мини-игру в боте, где пользователь присылает какую нибудь глупость боту, или превышает лимит запросов, и бот отыгрывает ситуацию крича в чат что нибудь вроде "я перегрелся, требуется перезагрузка" и бесконечно повторяя это сообщение с определённым интервалом, пока пользователь не напишет что нибудь вроде "перезагрузка", как это ещё реализовать, кроме как через цикл while?
Если не затруднит, дайте пример кода как это можно реализовать

У меня вопрос, а если я хочу написать бота, который работает не с пользователем, а скажем у меня бот для группы. Бот к примеру будет крутить рулетку, и мне нужно для каждой группы отдельное состояние, в какой то игра не началась, а в какой-то она проходит в стейте регистрации. Как мне это осуществить при помощи FSM ?

Настройка первого скрипта FSM

Импортируем необходимые модули:

from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup

Либо в тексте ошибка, либо я какой-то особенный, потому что у меня эти модули находятся не в aiogram.dispatcher

from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории