我想使用正则表达式查看并接受用户的任何传入消息,并为他们分配一个角色。但是只有在该用户尚未分配角色的情况下才可以。运行代码时没有出现任何错误,但是它不起作用。
这就是我所拥有的:
@client.event
async def on_message(message):
match = re.search(r'(.*?)', message.content)
member = message.author
role = discord.utils.get(member.guild.roles, name="Creators")
if message.author == client.user:
return
if role not in member.roles:
if match and message.channel.id == target_channel:
# add member to role
# send message to to users
await message.channel.send(
f'Hi {message.author}, welcome to the server! Don\'t forget to choose your #roles'
)
await discord.Member.add_roles(member, role)
答案 0 :(得分:1)
您写道:
await discord.Member.add_roles(member, role)
https://discordpy.readthedocs.io/en/latest/api.html?highlight=add_role#discord.Member.add_roles
从文档中可以看到,传递的参数为*roles, reason=None, atomic=True
。您必须指定roles
,reason
和atomic
是可选的。
您尝试传递无效的参数member
。
discord.Member
是一门课。您需要获得该课程的instance
。 ctx.author
是discord.Member
的实例。
因此,最终通话应为:
await ctx.author.add_roles(role)
答案 1 :(得分:0)
要从Member
获取on_message
对象,可以使用member = message.author
。
然后只需member.add_roles(role)
。
答案 2 :(得分:-1)
感谢帮助人员,事实证明这是非常微小的事情(对我而言是愚蠢的)阻止了它的工作。
在将message.channel.id
。id与target_channel
进行比较时,我忘记了通道ID对象不是作为字符串输入的,但是target_channel被设置为字符串,因此无法将它们视为等于。只需将message.channel.id
转换为字符串即可。