python - 如何在接收到特定消息时停止 Telethon 对话
问题描述
我使用 Telethon 库制作了一个电报机器人,该库从用户使用button.inline
和button.text
方法中获取响应。但我想在用户输入特定消息(如再见)后立即停止对话。
@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)] ] )
...
...
每当用户发送“嗨”时,机器人就会开始使用按钮进行查询。
在telethon docs中,cancel()
提供cancel_all()
了方法。但是我怎样才能实现它们,以便在收到消息时结束对话?
解决方案
根据文档,conv.cancel_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”的新消息时,它会打开一个对话,并调用.cancel_all()
取消旧对话。
推荐阅读
- powerbi - 建模数据仓库多语言
- c++ - 从自动模板参数回调中提取参数
- java - 即使达到超时限制,Zookeeper 也不会过期会话
- javascript - 使用 Javascript 检查文件是否已下载
- javascript - 计算,打印更改项目,不重复
- swift - 无法在子类 FUIAuthPickerViewController 上显示背景
- android - Ionic v4 在物理设备中出现黑屏
- python-3.x - 使用 os.system 在 Python3 中将文件的内容设置为变量
- graphql - 如何根据 frontmatter 对 GraphQL 查询进行排序
- .net - 追加/删除字符串中的字符与追加/删除后的原始字符串不同