我想要获取消息中提到的用户并向他发送私有(private)消息。这工作没有问题,但现在我想为该情况添加一条消息,即提到的成员不在同一服务器上。
我进行了很多搜索,现在尝试了 3 个多小时才找到解决方案。
问题展示: https://youtu.be/PYZMVXYtxpE
这是我的代码:
@bot.event
async def on_message(message):
if len(message.mentions) == 1:
membe1 = message.mentions[0].id
membe2 = bot.get_user(membe1)
guild = bot.get_guild(message.author.guild.id)
if guild.get_member(membe1) is not None:
await membe2.send(content=f"you was mentioned in the server chat")
else:
embed2 = discord.Embed(title=f"» :warning: | PING not possible", description=f"not possible")
await message.channel.send(content=f"{message.author.mention}", embed=embed)
await message.delete()
return
第一部分工作正常,但在“else
”部分,机器人什么也没做。他仍然在聊天中发布带有“无效”ping 的消息,并且只是忽略它。我可以做什么来解决这个问题?
最佳答案
您尝试执行的操作存在设计错误。 在 Discord 中,如果用户不在同一台服务器上,您将无法提及一个用户,因此您正在检查的内容根本不会起作用,目前您的代码非常漂亮大量检查所提到的用户是否存在,除非他在执行命令的同时离开公会,否则这种情况总是会发生。
例如,为了使命令正常工作,您想要提及服务器中的用户 user123,请执行以下操作:
@user123 blablabla
这是有效的,因为 Discord 内部缓存可以在您的服务器中找到user123,并且提到,这意味着点击“@user123”将向我们显示一个目标他的头像,他的角色或者其他什么。
但是,如果您尝试对无效用户执行相同的操作,假设notuser321:
@notuser321 blablabla
这不是一个提及,例如您知道notuser321是谁,但他与机器人位于同一服务器中。 Discord 无法从缓存中检索此用户,并且不会将其视为提及,而只是单个字符串,因此不是代码的一部分将会被触发,因为 len(message.mentions)
将为 0
。
您可以尝试使用 regular expressions在 message.content
中查找标记尝试。一个例子是这样的:
import re
message = "I love @user1 and @user2"
mention_attempt = re.findall(r'[@]\S*', message) # ['@user1', '@user2']
关于python - 不和谐 py - message.mentions "else"没有任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65800974/