Python 如何在收到特定消息时停止telethon对话

Python 如何在收到特定消息时停止telethon对话,python,telethon,Python,Telethon,我使用telethon库制作了一个电报机器人,它使用按钮.inline和按钮.text方法接收用户的响应。但我想在用户输入特定消息(如bye)后立即停止对话 @bot.on(events.NewMessage(incoming=True, pattern='Hi')) async def main(event): global SENDER MSG = event.raw_text SENDER=event.chat_id async with bot.conv

我使用telethon库制作了一个电报机器人,它使用
按钮.inline
按钮.text
方法接收用户的响应。但我想在用户输入特定消息(如bye)后立即停止对话

@bot.on(events.NewMessage(incoming=True, pattern='Hi'))
async def main(event):
    global SENDER
    MSG = event.raw_text
    SENDER=event.chat_id

    async with bot.conversation(SENDER) as conv:
        await conv.send_message('choose', buttons=[[Button.inline('Yes'), Button.inline('No')] ])

        await conv.send_message('<b> Want More ? </b>', parse_mode='html', buttons=[ [Button.text('Yes', resize=True,single_use=True), Button.text('No', resize=True,single_use=True)], [Button.text('More', resize=True,single_use=True)] ] )
       ...
       ...
@bot.on(events.NewMessage(incoming=True,pattern='Hi'))
异步def主(事件):
全局发送方
MSG=event.raw_text
发件人=event.chat\u id
将bot.conversation(发送方)作为conv进行异步:
等待conv.send_消息('choose',buttons=[[Button.inline('Yes'),Button.inline('No')]))
等待conv.send_message('Want More',parse_mode='html',buttons=[[Button.text('Yes',resize=True,single_use=True]),Button.text('No',resize=True,single_use=True)],[Button.text('More',resize=True,single_use=True)])
...
...
每当用户发送“Hi”时,bot就开始使用按钮进行查询


在中,提供了,
cancel()
cancel\u all()
方法。但是我如何实现它们,以便在收到“再见”消息时结束对话?

根据文档,
conv.cancel\u all()
取消该聊天的所有对话。我注意到我无法打开多个对话,因为设置了默认值
exclusive=True

所以,我所做的是:

@client.on(events.NewMessage(func=lambda e: e.is_private))
async def handler(event):
    try:
        rawmsg = event.message.message
        if rawmsg == "/cancel":
            # set exclusive=False so we can still create a conversation, even when there's an existing (exclusive) one.
            async with client.conversation(await event.get_chat(), exclusive=False) as conv:
                await conv.cancel_all()
                await event.respond("Operation is cancelled.")
                return


        async with client.conversation(await event.get_chat(), exclusive=True) as conv:
            await conv.send_message("Hey, I'll send you back whatever you write! To cancel, do /cancel")
            while True:
                resp = (await conv.get_response()).raw_text
                await conv.send_message(resp)

#   except telethon.errors.common.AlreadyInConversationError:
#       pass
    except:
        traceback.print_exc()

当有一条新消息的文本为“/取消”时,它将打开一个对话,并调用
.cancel\u all()
取消旧对话。

根据文档,
conv.cancel\u all()
取消该聊天的所有对话。我注意到我无法打开多个对话,因为设置了默认值
exclusive=True

所以,我所做的是:

@client.on(events.NewMessage(func=lambda e: e.is_private))
async def handler(event):
    try:
        rawmsg = event.message.message
        if rawmsg == "/cancel":
            # set exclusive=False so we can still create a conversation, even when there's an existing (exclusive) one.
            async with client.conversation(await event.get_chat(), exclusive=False) as conv:
                await conv.cancel_all()
                await event.respond("Operation is cancelled.")
                return


        async with client.conversation(await event.get_chat(), exclusive=True) as conv:
            await conv.send_message("Hey, I'll send you back whatever you write! To cancel, do /cancel")
            while True:
                resp = (await conv.get_response()).raw_text
                await conv.send_message(resp)

#   except telethon.errors.common.AlreadyInConversationError:
#       pass
    except:
        traceback.print_exc()

当有一条新消息的文本为“/取消”时,它将打开一个对话,并调用
.cancel\u all()
来取消旧的对话。

您将有一个
'Bye'
模式,该模式创建一个
机器人对话(发送方)
,并在其上调用
cancel\u all()
。除了非常简单的场景之外,对话并不是真正为任何事情而进行的,如果您继续使用它们,您将遇到更多类似这样的限制。我使用
对话
,因为很容易从用户那里获得最新的消息/响应,然后根据它采取行动。到目前为止,我从telethon文档中读到并理解到,我知道如果我使用了事件,就不可能在与用户的聊天中继续进行下去。因为在收到新消息时,我要么进入
event NewMessage
功能的开始,要么移动到新事件
NewMessage
。你能告诉我如何在函数/代码中间得到最新的消息/响应而不使用<代码>对话< /代码>吗?你将有一个模式,用于<代码>再见>代码>,创建一个<代码> BOT.Talk(发送者),并在上面调用<代码> CopyLelAL()/<代码>。除了非常简单的场景之外,对话并不是真正为任何事情而进行的,如果您继续使用它们,您将遇到更多类似这样的限制。我使用
对话
,因为很容易从用户那里获得最新的消息/响应,然后根据它采取行动。到目前为止,我从telethon文档中读到并理解到,我知道如果我使用了事件,就不可能在与用户的聊天中继续进行下去。因为在收到新消息时,我要么进入
event NewMessage
功能的开始,要么移动到新事件
NewMessage
。你能告诉我,如果不使用<代码>会话< /代码>,在函数/代码中间怎么得到最新的消息/响应?