discord.py 我想让机器人对你好、你好等做出反应

时间:2021-01-22 16:18:28

标签: python python-3.x discord discord.py discord.py-rewrite

我知道如何让它对你好、你好等做出反应。问题是,即使“你好”在一个词中,例如“寒意”,它也会做出反应,我如何阻止它对“寒意”之类的消息做出反应。我尝试使用空格,但他们最终只会破坏它更多

@bot.listen() #react to messages
async def on_message(message):
if message.guild is not None:
    content = message.content
    reaction = "?"
    if 'hi' in content.lower():
        try:
            await asyncio.sleep(1)
            await message.add_reaction(f"<{reaction}>")
            print(f'added reaction {reaction} {content}')
        except Exception as e:
            print(f'error adding reaction {reaction} {content}')

enter image description here

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为使用 if 'hi' in content.lower() 您正在查看是否在字符串 hi 中找到了字符串 message.content。解决此问题的最佳方法是使用 regex (regular expressions)。

您可以创建一个如下所示的函数,该函数将检查作为参数传递的字符串是否在另一个字符串中找到。与您所做的不同的是,此方法包含 \b 正则表达式标记中的单词,这些标记用于单词边界,这使我们可以仅搜索整个单词。

import re

def findCoincidences(w):
    return re.compile(r'\b({0})\b'.format(w)).search

您可以简单地将其添加到您的代码中并像这样使用它:

# ...
if findCoincidences('hi')(content.lower()):
        try:
            await asyncio.sleep(1)
            await message.add_reaction(f"<{reaction}>")
            print(f'added reaction {reaction} {content}')
        except Exception as e:
            print(f'error adding reaction {reaction} {content}')

基本上这个新的 findCoincidences() 函数会返回一个 re.Match 对象,如果他在消息的内容中找到单词“hi”,那么它就会进入 try 语句。