我目前正在使用discord.py库编写一个discord机器人,我希望我的机器人在检测到消息中的单词而无需检查大写字母时做出某些反应。
我已经找到了一个可以做到这一点的类,但是由于一个未知的原因,当我使用该类时,机器人不会检测到消息内部的字符串,他仅在消息本身时才检测到它。 ..
这是我找到的课程:
class CaseInsensitively(object):
def __init__(self, s):
self.__s = s.lower()
def __hash__(self):
return hash(self.__s)
def __eq__(self, other):
try:
other = other.__s
except (TypeError, AttributeError):
try:
other = other.lower()
except:
pass
return self.__s == other
这是该类的用法:
@client.event
async def on_message(message):
test = "Test"
if CaseInsensitively(test) in {CaseInsensitively(message.clean_content)}:
await discord.Message.add_reaction(message, "?")
await client.process_commands(message)
我正在ubuntu 16.04上使用python 3.7.1。
答案 0 :(得分:3)
问题是这些大括号
{CaseInsensitively(message.clean_content)}
这不再是字符串,而是set
。因此,它正在检查您的确切字符串是否包含在该集合中,因此不再进行子字符串检查
>>> 'foo' in 'foobar' # substring check
True
>>> 'foo' in {'foobar'} # set containment
False
>>> 'foo' in {'foo'} # set containment
True
我认为,该类还是不必要的,这应该足够了
if test.lower() in message.clean_content.lower():
答案 1 :(得分:1)
我同意您收到的评论。您添加的大小写不敏感有点过大。 .lower()
就足够了:
if "test" in message.content.lower():
此外,在添加反应时,您需要发送的消息对象,而不仅仅是一些“空”的任意消息对象:
@client.event
async def on_message(message):
if "test" in message.content.lower():
await message.add_reaction("?")
await client.process_commands(message) # in the same way here you've referenced message
discord.Message
只是基类,当您可以引用已经存在的实例时,不需要创建该实例的新实例; message
参考: