web-dev-qa-db-fra.com

python Discord.py supprimer tous les messages d'un canal de texte

je suis donc en train de faire en sorte que mon discord bot supprime tous les messages du canal de texte parce que j'aime bien quand c'est clair, mais je n'arrive pas à comprendre comment le faire. C'est ce que j'ai essayé. 

@CLIENT.command()
async def Clear(message):
    return await CLIENT.delete_message(message)

je n'arrive pas à comprendre comment quelqu'un peut-il m'aider merci <3 J'ai essayé d'autres choses et jeté un œil à d'autres articles, mais je viens de découvrir que le bot va supprimer le message à chaque fois que je tape (pas ce que je cherche)

5
Tyrell

Si vous souhaitez supprimer des messages en bloc (c’est-à-dire, supprimer plusieurs messages à la fois, utilisez await Client.delete_messages(list_of_messages). Voici un exemple.

import asyncio
import discord
from discord.ext.commands import Bot

Client = Bot('!')


@Client.command(pass_context = True)
async def clear(ctx, number):
    mgs = [] #Empty list to put all the messages in the log
    number = int(number) #Converting the amount of messages to delete to an integer
    async for x in Client.logs_from(ctx.message.channel, limit = number):
        mgs.append(x)
    await Client.delete_messages(mgs)

Client.run(Token)

NOTE: Cela ne fonctionnera que pour les messages de 14 jours et sous et vous ne pouvez pas supprimer plus de 100 messages à la fois, ce qui signifie que taper this !clear 120 provoquerait une erreur. Cependant, ce n'est pas impossible. Vous pouvez y ajouter une boucle while si vous le voulez vraiment, mais cela peut produire des résultats inattendus.

Maintenant, si vous avez des messages plus vieux que 14 jours? Vous ne pouvez pas utiliser Client.delete_messages(list_of_messages). Au lieu de cela, vous pouvez utiliser Client.delete_message(Message) pour ne supprimer qu'un message à la fois. Oui, je sais lentement mais pour l'instant, c'est tout ce que nous avons. Ainsi, vous pouvez modifier le code d'origine pour le supprimer à chaque boucle dans la fonction logs_from().

Quelque chose comme ça:

import asyncio
import discord
from discord.ext.commands import Bot

Client = Bot('!')

@Client.command(pass_context = True)
async def clear(ctx, number):
    number = int(number) #Converting the amount of messages to delete to an integer
    counter = 0
    async for x in Client.logs_from(ctx.message.channel, limit = number):
        if counter < number:
            await Client.delete_message(x)
            counter += 1
            await asyncio.sleep(1.2) #1.2 second timer so the deleting process can be even

Client.run(Token)
8
Wright

Vous pouvez obtenir une liste de tous les messages d'un canal à l'aide de client.logs_from(someChannel). A partir de là, utilisez simplement client.delete_message(msg).

En utilisant l’exemple cité dans le fichier readme de discord.py repo comme base, voici une méthode qui devrait fonctionner pour Python 3.5. Déclenchez ceci avec "! Clear":

client = discord.Client()

@client.event
async def on_message(message):
    if message.content.startswith('!clear'):
        tmp = await client.send_message(message.channel, 'Clearing messages...')
        async for msg in client.logs_from(message.channel):
            await client.delete_message(msg)
1
Peter G