Как удалить целые сообщения в текстовом канале в Discord с библиотекой discord python - PullRequest
0 голосов
/ 05 августа 2020

Я использовал код из заданного вопроса при переполнении стека, но функции, используемые в нем, похоже, изменены.

Код:

from discord.ext.commands import 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(ctx.message.channel, limit = number):
        mgs.append(x)
    await client.delete_messages(mgs)

Ошибка:

asyn c для x в клиенте (ctx.message.channel, limit = number): TypeError: объект 'Bot' не вызывается

и

discord.ext.commands.errors.CommandInvokeError: команда вызвала исключение: TypeError: объект 'Bot' не вызывается

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Действительно простой способ сделать это в новых версиях discord.py, вероятно, будет выглядеть примерно так:

@client.event
async def on_message(message):
    if '-clear all' in message.content and message.author.permissions_in(message.channel).manage_messages:
        deleted = await message.channel.purge(limit=10000, check=is_not_pinned)
    await message.channel.send('All messages deleted.'.format(deleted))
    await client.process_commands(message)

Вы также можете использовать для этого обычную команду, поэтому вам не понадобится await client.process_commands(message), но функция, которая вам нужна, по-прежнему будет await message.channel.purge(limit=amount, check=is_not_pinned) Таким образом, только люди с разрешением на управление сообщениями смогут использовать эту команду, и она не будет удалять закрепленные сообщения.

Вы можете установить сумму равной невероятно большое число, поэтому он просто удалит почти все, если не все. Я пробовал его только около 300, и он работал отлично (хотя может занять некоторое время).

0 голосов
/ 05 августа 2020

Похоже, вы используете старую версию discord.py

Если вы хотите удалить сообщения в канале в последней версии, это очень просто. Вам просто нужно использовать метод discord.TextChannel.purge ().

@client.command()
async def clear(ctx, amount=None):
    if amount is None:
        await ctx.channel.purge(limit=5)
    elif amount == "all":
        await ctx.channel.purge()
    else:
        await ctx.channel.purge(limit=int(amount))

Вы можете заметить разницу в том, что вам больше не нужно использовать pass_context в client.command () 'decorator.

Кроме того, в верхней части кода вы не должны напрямую импортировать Bot, вместо этого замените оператор from на

from discord.ext import commands

и создайте экземпляр своего клиента с помощью

client = commands.Bot(command_prefix="!")
...