ConversationHandler сохраняет текущий state
разговора в диктовке, называемой conversations
, а ключом является сущность с именем conversation_key
. Это кортеж, который состоит из идентификатора чата, идентификатора пользователя и идентификатора сообщения (некоторые из них могут отсутствовать, это определяется атрибутами per_chat
, per_user
и per_message
bool).
Здесь conversations
используется для получения state
в методе check_update
(поясняется далее):
https://github.com/python-telegram-bot/python-telegram-bot/blob/2cde878d1e5e0bb552aaf41d5ab5df695ec4addb/telegram/ext/conversationhandler.py#L248
Состояние разговора не предназначено для ручного доступа.
Когда пользователь отправляет сообщение боту, Updater
получает Update
объекты от Telegram и доставляет их на Dispatcher
. У Dispatcher
есть список зарегистрированных Handler
объектов, их методы check_update
вызываются в том порядке, в котором они были добавлены. check_update
либо возвращает False
, либо None
, если обновление не должно обрабатываться, либо возвращает некоторый объект, который затем передается методу handle_update
.
ConversationHandler
наследуется от самого Handler
и имеет другие Handler
объекты в качестве значений в его states
dict. Кроме того, check_update
и handle_update
перезаписаны. Его check_update
получает текущий разговор state
(см. Ссылку выше) и вызывает check_update
методы всех обработчиков для этого state
. Если все они возвращают False
, это делает то же самое для обработчиков в списке fallbacks
. Если все их проверки также возвращают False
, то ничего не происходит.
Если один из обработчиков должен обработать событие, объект, который возвращает check_update
, передается методу ConversationHadler
handle_update
. Он вызывает метод Handler
, запущенный *1047*, который, в свою очередь, вызывает функцию обратного вызова, определенную при его создании. Его результатом будет новый state
этого разговора в conversations
dict.
В соответствии с цепочкой документов ConversationHandler:
To change the state of conversation, the callback function of a handler must return the new state after responding to the user. If it does not return anything (returning ``None`` by default), the state will not change.