2017-04-18 110 views
1

所以我想让我的不和谐机器人删除文本通道中的所有消息,因为我喜欢它时,它是干净的,但我无法弄清楚如何做到这一点,这就是我试图python Discord.py删除文本通道中的所有消息

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

似乎无法弄清楚有人可以帮助谢谢我曾尝试其他的东西,看着其他职位,但我只发现了机器人将每次我键入删除邮件(不是我在找什么)

回答

4

如果你想批量删除的消息(也就是,一次删除多条消息,使用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天前的邮件和下的,并且您无法一次删除100条以上的邮件,这意味着输入此!clear 120会引发错误,但这并非不可能,您可以将while循环添加到如果你真的在那里但可能会产生意想不到的结果。

现在,如果您有邮件比14天?你不能使用Client.delete_messages(list_of_messages)。相反,您可以使用Client.delete_message(Message)这样一次只能删除一条消息。是的,我知道速度缓慢,但现在,这就是我们所拥有的一切。因此,您可以修改原始代码,使其每次在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) 
+0

只是为了我的理解...我使用Python和'@client.event's(用'async def some_event')开发了一个完整的Discord bot,我完全不知道你在导入Bot和传递'!'作为参数。 '@ Client.command'与'message.content.startswith'使用'async def on_message'相同吗?请赐教,因为它看起来只有通过查看你的简短例子,我可以删除100行代码,并让我的代码呼吸更好,同时得到确切的结果... – dnLL

+0

@dnLL所有'@ Client.command()'基本上只是一个命令处理程序,所以它仍然只是一个'on_message'事件侦听器,只不过它解析出消息内容以确保它甚至是一个命令,解析出参数和所有爵士乐,因此您可以使用@ Client.command( )'。你仍然只能使用'on_message',但是你可能会使用'if'语句来分割每个命令,除非你编写自己的命令处理程序,否则它们可能会被填充,直到你。 – Wright

+0

迄今为止使用if语句。 2之间是否存在任何性能差异,或者没有其他区别而不易于阅读? – dnLL

1

你可以使用获得一个频道中所有消息的列表。从那里,只需使用client.delete_message(msg)

readme of discord.py's repo中列出的示例为基础,下面是一个适用于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) 
+0

林不知道怎么回事,现在,这是第一次与discord.py编码,当我运行它的IM告诉“‘从收益率’异步函数内部”不知道是什么即时消息假设要做 – Tyrell

+0

哦,是的,我搞砸了,它应该'等待'不从'产生',因为'delete_message()'不是一个生成器。不知道我从哪里得到。 –

相关问题