Комментарии 9
Не знаком с тонкостями программирования на питоне, но бросилось в глаза - это нормально когда в одном файле куча функций с одинаковым названием 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
Пивет! Спасибо за обстоятельную статью.
Уже реализовал не одного бота 143215354 раз использовал FSM, но все же нашел кое-что интереное в статье.
Вопросец:
Если делать несколько экземпларов бота (для быстродействия), то только через решение типа Redis и можно организовать общее хранилище состояний? Сейчас планирую к разработке высоконагрженного бота, разбираюсь в этом вопросе.
Вообще было бы круто увидеть аналогичной глубины статью про высоконагруженных распределенных взрослых ботов=) с FastAPI, вебхуками, nginx, docker=)
Telegram Боты на Aiogram 3.x: Все про FSM простыми словами