(discord.py) 检查消息是不是包含列表中的元素的正确方法是啥?

Posted

技术标签:

【中文标题】(discord.py) 检查消息是不是包含列表中的元素的正确方法是啥?【英文标题】:(discord.py) What is the correct way of checking if a message contains an element from a list?(discord.py) 检查消息是否包含列表中的元素的正确方法是什么? 【发布时间】:2020-11-07 05:48:04 【问题描述】:

我正在尝试为我的机器人制作脏话过滤器。我允许服务器管理员自己列出我的机器人用于他们服务器的坏词。在on_message 函数中,我使用此代码检查用户的消息是否包含过滤器中的单词:

file = open(f"configs/antiswearvalues/customantiswear/message.guild.id.txt")

res = [ele for ele in file.read() if (ele in message.content)]

if bool(res):
    await message.channel.send("you did a bad. time for the boot.")

问题是机器人仍然说you did a bad. time for the boot.,即使消息包含来自元素而不是整个元素的sn-p。

因此,如果列表是 ['omg', 'crap', 'hell'],如果用户的消息包含 hcr,机器人仍会警告用户,因为 hellcrap 包含这些。

我的问题是:如何让我的机器人正确检查用户的消息是否包含列表中的元素?

【问题讨论】:

您不应该使用返回每行列表的file.readlines(),而不是file.read()吗?实际上,看看这个文本文件会很有帮助。 @dantechguy 文本文件只包含列表(目前,每个不和谐服务器都有自己的文件),所以我使用哪个并不重要。文本文件实际上只是['omg', 'crap', 'hell'] 那么您将需要解析该列表,因为现在file.read() 将整个文件作为字符串返回。但是您可以使用 readlines() 并更改您的文件以将每个单词放在单独的行中:omg\ncrap\nhell 您正在遍历一个字符串。不是清单。它没有看到['omg', 'crap', 'hell'] 它看到"['omg', 'crap', 'hell']"。因此,当您进行迭代时,您不会得到"omg""crap""hell"。你会得到"[""'""o""m"、... @TinNguyen 是的,这就是问题所在。我将字符串转换为正确的列表,现在可以使用。谢谢 【参考方案1】:

您应该考虑使用json。获取单词黑名单将比不使用任何库解析 txt 文件容易得多:

您的 json 文件(例如 blacklist.json):

['omg', 'crap', 'hell']

你的python代码:

from json import loads

@client.event
async def on_message(message):
    with open("blacklist.json", "r"):
        data = loads(file.read())
    for word in data:
        if word in message.content:
            await message.channel.send("you did a bad. time for the boot.")
    return

您的代码没有按预期工作,因为您没有解析文件数据,您正在探索一个字符串,而不是一个列表。

【讨论】:

请注意:如果每个列入黑名单的单词都在新行上,您还可以将文本文件解析为单列 .csv 文件。您仍然需要“导入 csv”,但对最终用户来说可能更简单。

以上是关于(discord.py) 检查消息是不是包含列表中的元素的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

检查消息回复是不是为回复类型消息 discord.py

Discord.py:检查用户是不是具有列表中的角色 ID 不起作用

Discord.py 阅读列表

如何检查用户是不是提供了参数 discord.py

discord.py 如何检查用户是不是在服务器上?

获取消息内容成命令[discord.py]