J'essaie donc de faire en sorte que mon bot discord.py n'accepte que l'exécution de commandes de certains utilisateurs pour certaines commandes. Je sais maintenant que ctx.author.id signifie ID d'auteur du bot. J'ai entendu dire que message.author.id est censé fonctionner, mais l'utilisation de message.author.id génère un retraçage, la tristement célèbre erreur NameError. Pourquoi et comment le réparer ?

@bot.command(description="Restarts The Bot's source file, use if bot freezes etc, [OWNER]")
async def shutdown(ctx):
     if ctx.author.id == 436646726204653589 or 525334420467744768 or 218142353674731520:
        embed = discord.Embed(color = 0xff0000)
        embed.add_field(name="Shutdown Command Sent, Bot Rebooting in 3 seconds", value = str, inline = False)
        await ctx.send(embed=embed)
        await asyncio.sleep(3)
        await bot.close()
        os.execl(sys.executable, sys.executable, * sys.argv)
        os.system("py -3 theBot.py")

bot.run(TOKEN)
1
CodeWritten 6 févr. 2020 à 21:49

1 réponse

Meilleure réponse

Si vous utilisez l'extension de commandes et shutdown est une commande, ctx est un Context objet.
Context.author< /a> est l'auteur du message de commande et est un raccourci pour Message.author.
Les deux sont des User objets à partir desquels vous pouvez utilisez User.id.

Je ne sais pas exactement ce que vous entendez par "ID d'auteur du bot", mais si vous souhaitez obtenir l'ID utilisateur du propriétaire du bot, vous pouvez utiliser Bot.owner_id, ou Bot.owner_ids si l'application de bot est basée sur une équipe, à la place .
Sinon, vous pouvez utiliser Bot.user pour obtenir le ClientUser qui représente le bot puis ClientUser.id pour obtenir son identifiant.

L'"erreur non définie" devrait en fait être une NameError vous indiquant que la variable n'est pas définie, et exactement comme elle le dit, message n'est pas définie et vous devez la définir avant de l'utiliser.
Vous pouvez utiliser Context.message pour obtenir le Message qui a déclenché la commande en cours d'exécution.

Notez que if ctx.author.id == 436646726204653589 or 525334420467744768 or 218142353674731520: entrera toujours l'instruction if comme
ctx.author.id == 436646726204653589 or 525334420467744768 or 218142353674731520 sera toujours True.
or a une priorité inférieure à ==< /a>. Cela signifie que cela s'évalue de manière équivalente comme
(ctx.author.id == 436646726204653589) or 525334420467744768 or 218142353674731520, et l'entier, 525334420467744768, ainsi que 218142353674731520, sera toujours évalué comme True.
Au lieu de cela, vous voulez vérifier l'égalité avec chaque ID. Cela peut être fait en vérifiant l'appartenance à un tuple ou à un ensemble, par exemple
ctx.author.id in (436646726204653589, 525334420467744768, 218142353674731520) ou ctx.author.id in {436646726204653589, 525334420467744768, 218142353674731520}, respectivement.
Voir cette
Comment tester plusieurs variables par rapport à une valeur ? pour plus d'informations.

De plus, si vous ne redéfinissez str nulle part (ce que vous ne devriez pas faire, car il s'agit d'une classe intégrée), vous transmettez la classe elle-même en tant que valeur d'intégration et la sortie sera convertie en une chaîne et afficher comme <class 'str'>.

De plus, je ne sais pas pourquoi vous essayez d'exécuter l'exécutable Python avec lui-même avec os.execl(sys.executable, sys.executable, * sys.argv), mais os.execl remplace immédiatement le processus en cours, donc la ligne suivante ne sera jamais exécutée.

1
Harmon758 6 févr. 2020 à 20:20