Discord.py : attendre réaction entrée par utilisateur préci

Fermé
PacoFesk - Modifié le 2 sept. 2022 à 12:23
 Utilisateur anonyme - 1 janv. 2023 à 18:58

Bonjour,

Voici mon code :

@bot.command()
async def war(ctx, user):
    userID = ctx.message.author.id
    VerifPlayer(userID)
    rivalID = user.split("@")
    rivalID = rivalID[1].split(">")
    rivalID = rivalID[0]
    VerifPlayer(rivalID)

    message = await ctx.send(user + ", veux-tu tenter ta chance contre <@" + str(userID) + "> ?")
    await message.add_reaction("✅")
    await message.add_reaction("❌")
    def checkEmoji(reaction, rival):
        return ctx.message.author == rival and message.id == reaction.message.id and str(reaction.emoji) == "✅" or str(reaction.emoji) == "❌"
    reaction, rival = await bot.wait_for("reaction_add", timeout = 10, check = checkEmoji)
    if reaction.emoji == "✅":
        await ctx.send("Duel accepté.")
    else:
        await ctx.send("Le duel a bien été abandonné.")

Je voudrais que l'utilisateur pouvant répondre soit le rival (user dans les paramètres de la commande), mais je ne trouve pas comment obtenir une variable équivalente à ctx.message.author (qui donne est au format : username#0000)

C'est un brouillon, ne faites pas attention à la syntaxe qui à certains endroits doit clairement être revue.

Sauriez-vous m'aiguiller ?

Merci d'avance.

1 réponse

Utilisateur anonyme
1 janv. 2023 à 18:58

Pour obtenir une variable similaire à ctx.message.author mais qui représente le rival plutôt que l'auteur du message, vous pouvez utiliser la méthode get_member de la classe Guild de Discord.

Voici comment vous pouvez obtenir un objet Member représentant le rival dans votre code :

# Récupération de l'ID du rival à partir de la mention
rivalID = user.split("@")
rivalID = rivalID[1].split(">")
rivalID = rivalID[0]

# Récupération de l'objet Member correspondant au rival
guild = ctx.guild
rival = guild.get_member(int(rivalID))

Vous pouvez ensuite utiliser rival comme une variable similaire à ctx.message.author dans votre code. Par exemple, vous pouvez l'utiliser dans la fonction checkEmoji de la manière suivante :

def checkEmoji(reaction, rival):
    return rival == reaction.user and message.id == reaction.message.id and str(reaction.emoji) == "✅" or str(reaction.emoji) == "❌"

reaction, rival = await bot.wait_for("reaction_add", timeout = 10, check = checkEmoji)

Voici comment vous pourriez procéder pour obtenir la réaction d'un utilisateur spécifique (ici, le "rival") :

Stockez l'objet Member du rival dans une variable, que vous pouvez obtenir en utilisant la méthode discord.utils.get et en passant en paramètres le serveur et l'ID du rival :

rival = discord.utils.get(ctx.guild.members, id=rivalID)

Modifiez la fonction de callback checkEmoji pour qu'elle prenne en paramètre l'objet Member du rival au lieu de rival :

def checkEmoji(reaction, member):

Modifiez la condition de la fonction pour vérifier si l'auteur de la réaction est le rival plutôt que l'auteur du message original :

return member == reaction.user and message.id == reaction.message.id and str(reaction.emoji) == "✅" or str(reaction.emoji) == "❌"

Modifiez la ligne où vous appelez bot.wait_for pour passer l'objet Member du rival en tant que deuxième paramètre de la fonction de callback :

reaction, member = await bot.wait_for("reaction_add", timeout = 10, check = checkEmoji)

Vous devriez maintenant être en mesure d'obtenir la réaction du rival et de la traiter correctement. N'oubliez pas de mettre à jour votre code en conséquence.

-1