Как реализовать переход к беседе из функции и возврат обратно в функцию после завершения беседы?
Делаю небольшой телеграм-бот (использую библиотеку python-telegram-bot), который генерирует анонимные опросы и отправляет их в чат с пользователем. При ответе на вопрос пользователь может выбирать один или несколько вариантов ответа. Некоторые ответы предполагают дополнительный комментарий от пользователя (определяется по признаку у ответа), т.е. бот должен ожидать комментария от пользователя и только после того, как он его даст и ответ с комментарием будет сохранен в БД отправлять следующий опрос. Погуглив и изучив тему пришел к выводу, что то, что мне нужно, реализуется посредством беседы. Вот моя функция, которая получает ответ на опрос и сохраняет его в БД:
async def receive_poll_answer(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
global QUESTION_INDEX
votes_id_list = []
update_poll = update.poll
answers = update_poll.options
answered_poll = context.bot_data.get(update_poll.id)
if answered_poll is None:
return
for option in range(len(answers)):
if answers[option].voter_count == 0:
continue
votes_id_list.append(option)
selected_options = [answered_poll['answer_options'][i] for i in votes_id_list]
try:
async for session in get_session():
answers_list = []
for answer in selected_options:
if answer['is_comment_required']:
# переходим в беседу
answers_list.append(Answer(
id=uuid4(),
user_id=answered_poll['user_id'],
question_id=answered_poll['question_id'],
answer_id=answer['id'],
comment=''))
session.add_all(answers_list)
await session.commit()
QUESTION_INDEX += 1
await poll(update, context)
except Exception as e:
await session.rollback()
await context.bot.send_message(
chat_id=answered_poll['chat_id'],
text=f'error saving poll answer: {e}'
)
finally:
await session.close()
Как я могу перейти к беседе с пользователем, если будет выполняться условие if answer['is_comment_required']
? Попробовал вот так
if answer['is_comment_required']:
return
Код работает. ConversationHandler активируется: срабатывает функция начала беседы (в ней вежливо прошу пользователя добавить комментарий), срабатывает функция первого (и, похоже, что единственного) шага беседы, которая должна получить и обработать комментарий. Но как мне завершить беседу и вернуться обратно в функцию, из которой она была вызвана, чтобы сохранить ответ и комментарий и не дублировать в беседе код для записи ответа на опрос в БД?