如何在python-telegram-api中的ConversationHandler中管理当前状态

问题描述 投票:1回答:1

我想在我的机器人中使用ConversationHandler。至少,它需要三个参数:

class telegram.ext.ConversationHandler(entry_points, states, fallbacks)

AFAIK,入口点是会话处理程序的触发器,然后每个状态可以执行自己的处理程序,并且based on fallbacks definition,如果来自状态的所有处理程序返回false,则触发回退。

好吧,处理程序返回一些东西。但是处理程序是一个对象,一个类的实例。

基于this example,以new_alarm_handler为例。

所以我怀疑

  1. 怎样,处理程序返回一个值? (它们似乎返回其回调函数结果)。
  2. 谈话的当前状态在哪里?它似乎不可访问,但是是最后一个执行处理程序的最后结果。是吗?如果没有,那么我需要做些什么才能改变对话中的当前状态?
  3. 因此,当达到状态时,执行它们的处理程序列表(字典states中的值作为arg传递)。但作为一个列表,它可能不止一个,因此可能有多个返回状态。它是如何管理的?
python python-telegram-bot
1个回答
0
投票

ConversationHandler将对话的当前state存储在dict中,称为conversations,密钥是一个名为conversation_key的实体。它是一个元组,由聊天ID,用户ID和消息ID组成(其中一些可能缺失,这由per_chatper_userper_message bool属性定义)。

在这里qazxsw poi可以通过qazxsw poi方法获得qazxsw poi(进一步解释): conversations 无法手动访问会话状态。

当用户向机器人发送消息时,state从Telegram接收check_update对象并将其传递给https://github.com/python-telegram-bot/python-telegram-bot/blob/2cde878d1e5e0bb552aaf41d5ab5df695ec4addb/telegram/ext/conversationhandler.py#L248Updater有一个注册的Update对象列表,他们的Dispatcher方法按照添加的顺序调用。如果不应该处理更新,Dispatcher要么返回Handler,要么返回check_update,或者返回一些然后传递给check_update方法的对象。

False继承自None本身,它有其他handle_update对象作为其ConversationHandler字典中的值。它还覆盖了HandlerHandler。它的states得到它当前的对话check_update(见上面的链接)并调用handle_update的所有处理程序的check_update方法。如果所有这些都返回state,它对check_update列表中的处理程序也是如此。如果所有他们的支票也返回state它什么都不做。

如果其中一个处理程序应该处理该事件,则其False返回的对象将传递给fallbacksFalse方法。它调用了被激活的check_updateConversationHadler方法,该方法又调用了在其创建时定义的回调函数。它的结果将成为handle_update dict中这次谈话的新Handler

根据ConversationHandler文档字符串:

handle_update

© www.soinside.com 2019 - 2024. All rights reserved.