I am writing a request handler in a telegram bot. I am having difficulty processing the waiting for pressing the inline button, can you tell me if this can be implemented? I have a ticket monitoring start handler, get them in json, then process each ticket in the list.
class MonitoringStatus(StatesGroup):
monitoring_active = State()
monitoring_pending = State()
waiting_for_ticket_action = State()
def get_ticket_keyboard():
builder = InlineKeyboardBuilder()
builder.add(
InlineKeyboardButton(
text="assign",
callback_data="assign"),
InlineKeyboardButton(
text="resolve",
callback_data="resolve"),
)
return builder.as_markup()
@router.message(None or MonitoringStatus.monitoring_pending, F.text == 'Start Monitoring')
async def start_monitoring(message: Message, state: FSMContext):
await state.set_state(MonitoringStatus.monitoring_active)
await state.update_data(is_monitoring_active=True)
await asyncio.sleep(3)
await message.answer('Monitoring started')
while True:
is_monitoring_active = data.get('is_monitoring_active', False)
if not is_monitoring_active:
break
tickets = await fetch_tickets_from_file()
for ticket in tickets:
await message.answer(f'Ticket: {ticket["ticket_number"]}\n'
f'Reporter: {ticket["reporter"]}\n'
f'Description: {ticket["description"]}',
reply_markup=get_ticket_keyboard())
await MonitoringStatus.waiting_for_ticket_action.set()
await asyncio.sleep(10)
And I get an error AttributeError: 'State' object has no attribute 'set'.
If I don't use the set() function, all requests from "tickets" in cycle instantly leave messages in telegram, but I need to process each ticket sequentially.
UPD I did a status check in an infinite loop and it works for me. But I don't know how right it is.
for ticket in tickets:
...
while True:
updated_state = await state.get_state()
if updated_state != current_state:
break
await asyncio.sleep(1)