我想在机器人中使用ConversationHandler。至少,它需要三个参数:
class telegram.ext.ConversationHandler(entry_points, states, fallbacks)
AFAIK,入口点是会话处理程序的触发器,然后每个状态都可以执行自己的处理程序,based on fallbacks definition,如果状态中的所有处理程序都返回false
,则触发回退。
好吧,因此处理程序返回一些东西。但是处理程序是对象,是类的实例。
基于this example,以new_alarm_handler
为例。
处理程序返回值是怎么回事? (它们似乎返回其回调函数结果)。
对话的当前状态在哪里?它似乎不可访问,但它是最后执行的处理程序的最后结果。是吗如果没有,那么我该怎么做才能更改对话中的当前状态?
因此,当达到某种状态时,将执行其处理程序列表(以arg形式传递的字典states
中的值)。但是作为一个列表,它可能不止一个,因此返回状态可能不止一个。如何管理?
答案 0 :(得分:0)
ConversationHandler将会话的当前state
存储在称为conversations
的字典中,并且键是名为conversation_key
的实体。它是一个元组,由Chat的ID,User的ID和Message的ID组成(其中有些可能会丢失,这由per_chat
,per_user
和per_message
bool属性定义)。 / p>
在conversations
方法中访问state
以获得check_update
(进一步说明):
https://github.com/python-telegram-bot/python-telegram-bot/blob/2cde878d1e5e0bb552aaf41d5ab5df695ec4addb/telegram/ext/conversationhandler.py#L248
对话状态不能手动访问。
当用户向机器人发送消息时,Updater
从Telegram接收Update
个对象并将其传递到其Dispatcher
。 Dispatcher
有一个已注册的Handler
对象的列表,它们的check_update
方法的添加顺序被调用。如果不应该处理更新,则check_update
返回False
或None
,或者返回某个对象,然后将该对象传递给handle_update
方法。
ConversationHandler
继承自Handler
本身,并且在其Handler
字典中还有其他states
个对象作为值。它还覆盖了check_update
和handle_update
。它的check_update
获取其当前对话state
(请参见上面的链接),并为该check_update
调用所有处理程序的state
方法。如果它们全部返回False
,则对fallbacks
列表中的处理程序将执行相同的操作。如果他们所有的支票也返回False
,则它什么都不做。
如果其中一个处理程序应处理该事件,则其check_update
返回的对象将传递给ConversationHadler
的{{1}}方法。它调用触发的handle_update
的{{1}}方法,该方法又调用在其创建时定义的回调函数。其结果被设置为Handler
字典中此对话的新handle_update
。
根据ConversationHandler文档字符串:
state