web-dev-qa-db-ja.com

python Discord.pyテキストチャネルのすべてのメッセージを削除する

私はそれがクリーンであるときにそれが好きだから私はそれを私が試みたものです私はそれが好きであるのでそれが好きなので、私は不調和ボットにテキストチャンネルのすべてのメッセージを削除させようとしています

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

私は他のことを試して他の投稿を調べましたが、ボットが入力するたびにメッセージを削除することがわかりました(探しているものではありません)

4
Tyrell

メッセージを一括削除する(つまり、一度に複数のメッセージを削除する)場合は、await Client.delete_messages(list_of_messages)を使用します。以下に例を示します。

_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)
_

注:これを行うと、14日経過したunderのメッセージに対してのみ機能し、一度に100を超えるメッセージを削除することはできません。時間、つまり、この_!clear 120_を入力するとエラーが発生します。しかし、それは不可能ではありません。本当に必要な場合は、whileループを追加できますが、予期しない結果が生じる可能性があります。

では、メッセージがある場合はどうなりますか古い 14日よりも長いですか? Client.delete_messages(list_of_messages)は使用できません。代わりに、Client.delete_message(Message)を使用できます。これにより、一度に1つのメッセージのみが削除されます。はい、私は遅いことを知っていますが、今のところ、それだけです。したがって、logs_from()でループするたびに削除するように元のコードを変更できます。

このようなもの:

_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

client.logs_from(someChannel)を使用して、チャネル内のすべてのメッセージのリストを取得できます。そこから、client.delete_message(msg)を使用します。

discord.pyのreadme リポジトリに記載されている例をベースとして使用し、Python 3.5。

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