对话状态的二元性。如何强制机器人仅检查子 ConversationHandler 中的更新?

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

我对ConversationHandler有一个问题,这可能是因为我不太了解如何使用它。我在 PTB 中使用父级和子级 ConversationHandler,如下所示:

...
child_conv_handler = ConversationHandler(
entry_points=[CommandHandler("start_child", start_child_func)],
states={
    CHILD_STATE:  [
        CommandHandler("search", search),
        CommandHandler("add", add),
        CommandHandler("exit", exit),
    ],
},
fallbacks=[MessageHandler(filters.TEXT, fallback_message),],
)


parent_conv_handler = ConversationHandler(
entry_points=[CommandHandler("start_parent", start_parent_func)],
states={
    PARENT_STATE:  [
        CommandHandler("stats", stats),
        child_conv_handler,
    ],
},
fallbacks=[CommandHandler("stop", stop)],
)

application.add_handler(parent_conv_handler)

application.run_polling(allowed_updates=Update.ALL_TYPES)

我采取以下行动:

  1. 发送 /start_parent 来启动父级 ConversationHandler;
  2. start_parent_func回调函数返回对话框状态PARENT_STATE;
  3. 发送 /start_child 来启动子 ConversationHandler;
  4. start_child_func回调函数返回对话框状态CHILD_STATE;

(注意!)

  1. 发送 /stats 命令并触发
    CommandHandler("stats", stats)
    (统计回调函数完成其工作!)。

看起来所有更新都首先由 PARENT_STATE 的处理程序检查。这意味着 BOT 同时处于两种状态 PARENT_STATE 和 CHILD_STATE。 由于某种原因 PARENT_STATE 具有优先权。但我需要 CHILD_STATE 具有优先级并首先检查。

是的,我可以将本示例中的children_conv_handler放在列表中的第一个位置并获得我想要的结果(触发

MessageHandler(filters.TEXT, fallback_message)
),但是如果我需要两个child_conv_handler1和child_conv_handler2怎么办?在这种情况下我不知道该怎么办。 如何使 CHILD_STATE 成为主要状态,或者如何在 child_conv_handler 启动时将parent_conv_handler 置于某种类型的“死胡同状态”?

python telegram python-telegram-bot
1个回答
0
投票

引用ConversationHandler

文档:

将使用 check_update() 方法返回 True 的 first 处理程序。

切换

PARENT_STATE
中处理程序的顺序应该可以解决您的问题。


免责声明:我目前是

python-telegram-bot

的维护者
© www.soinside.com 2019 - 2024. All rights reserved.