Je crée un bot pour mon serveur Discord en utilisant discord.py. J'essaie de créer une commande qui donne à un utilisateur un rôle nommé "Muet". Mais quand j'essaye de couper le son de l'utilisateur (en envoyant "0mute @ user # 0000"), j'obtiens des erreurs. Mon code pour donner le rôle est le suivant:

@client.command(pass_context=True)
@commands.has_any_role("Admin")
async def mute(ctx, user: discord.Member):
  await user.add_roles("Muted", atomic=False)

Remarque: j'utilise la réécriture régulière discord.py, PAS discord.py.

Edit: Récemment découvert, je ne suis pas autorisé à publier des images d'erreurs ou de code, en tant que tel, je vais passer les erreurs ici sous forme de texte au lieu d'une image.

Ignoring exception in command mute:
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "main.py", line 43, in mute
    await user.add_roles("Muted", atomic=False)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/member.py", line 669, in add_roles
    new_roles = utils._unique(Object(id=r.id) for s in (self.roles[1:], roles) for r in s)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/utils.py", line 287, in _unique
    return [x for x in iterable if not (x in seen or adder(x))]
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/utils.py", line 287, in <listcomp>
    return [x for x in iterable if not (x in seen or adder(x))]
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/member.py", line 669, in <genexpr>
    new_roles = utils._unique(Object(id=r.id) for s in (self.roles[1:], roles) for r in s)
AttributeError: 'str' object has no attribute 'id'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 902, in invoke
    await ctx.command.invoke(ctx)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 864, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'id'
1
MemeSkeleton 21 févr. 2021 à 04:51

1 réponse

Meilleure réponse

Member.add_roles prend discord.Role instances comme arguments, vous passez une chaîne.

@client.command()
@commands.has_any_role("Admin")
async def mute(ctx, user: discord.Member):
    role = discord.utils.get(ctx.guild.roles, name="Muted") # Getting the role
    await user.add_roles(role, atomic=False)

De plus, le kwarg pass_context n'est pas nécessaire dans la réécriture discord.py, le contexte est toujours passé

Référence:

0
Łukasz Kwieciński 21 févr. 2021 à 10:36