Résolue

Erreur sur la fonction flatten()

# Correction de code # Scripting

Bonjour,

J'ai suivi et jusqu’à présent mon bot en ligne répond correctement à tout ( j'ai du rajouter qq details) .

Simplement je n'arrive pas à trouver de solutions pour effacer les messages.

sur mes 2 scripts, l'erreur est la même :


File "/home/jee/Bureau/DocBot/bot.py", line 14, in delete
    messages = await ctx.channel.history(limit=number_of_messages + 1).flatten()
AttributeError: 'async_generator' object has no attribute 'flatten'


 File "/home/jee/Bureau/DocBot/client.py", line 37, in on_message
    messages = await message.channel.history(limit=number + 1).flatten()
AttributeError: 'async_generator' object has no attribute 'flatten'


les scripts :


from discord.ext import commands
import discord

bot = commands.Bot(command_prefix="!", intents=discord.Intents.default())



@bot.event
async def on_ready():
    print("Le bot est prêt!")



@bot.command(name='del')
async def delete(ctx, number_of_messages: int):
    messages = await ctx.channel.history(limit=number_of_messages + 1).flatten()
    for each_message in messages:
        await each_message.delete()



bot.run(XXX)


mport discord

default_intents = discord.Intents.default()
default_intents.members = True


client = discord.Client(intents=default_intents)



@client.event
async def on_ready():
    print("Ready!")



@client.event
async def on_message(message):
    if message.content.lower() == "ping":
        await message.channel.send("Pong!", delete_after=5)



@client.event
async def on_member_join(member):
    general_channel: discord.TextChannel = client.get_channel(
        913464637947805728)
    await general_channel.send(content=f"Bienvenue a toi, ceci est un texte personnalisé!! Le vois-tu {member.display_name}?")



@client.event
async def on_message(message):
    if message.content.startswith("bonjour"):
        await message.channel.send("Bonjour a toi!")



@client.event
async def on_message(message):
    if message.content.startswith("!del"):
        number = int(message.content.split()[1])
        messages = await message.channel.history(limit=number + 1).flatten()


        for each_message in messages:
            await each_message.delete()



client.run(ZZZZZ]


J'ai fait quelques recherches mais je n'ai pas trouver de solutions correspondantes. Merci ^^

( je suis sous python 3.9.13 )

Thibault houdon

Mentor

Salut Julien,


Il semble que cela soit dû à un changement dans la bibliothèque :

https://discordpy.readthedocs.io/en/latest/migrating.html?highlight=flatten#moving-away-from-custom-asynciterator


Ils conseillent désormais d'utiliser une compréhension de liste :

# before
users = await reaction.users().flatten()

# after
users = [user async for user in reaction.users()]

Impeccable merci, ça fonctionne.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.