为什么我的mod-mail不起作用,但是删除消息在discord.py Python编程中起作用?

时间:2020-09-20 05:24:20

标签: python discord bots discord.py

我很难弄清楚为什么我的代码的一部分可以工作,而另一部分却不能。这两段代码可以完美地分开工作,但是,当放在同一个文件中时,只有一个可以工作。

我正在用discord.py制作Discord Bot,其中一部分代码(顶部)应该是mod-mail,收到一条消息,告诉您DM僵尸程序,然后将其中继到服务器中的某个频道。然后,例如,主持人可以通过获取其用户ID并使用<@userid>对其进行ping操作来回复此人,然后,该机器人将接收该消息并将其发送给DM机器人的人。 <-这部分代码不起作用

文件的第二部分基本上监视了一个仅称为img的通道,并删除了没有空字符串的任何消息,这意味着没有图像/文件的消息就不能被删除。 <-此功能有效,它将删除仅img频道中的所有字符串

这是我的代码:

import discord

client = discord.Client()

#mod-mail
@client.event
async def on_message(message):
    empty_array = []
    modmail_channnel = discord.utils.get(client.get_all_channels(), name = "mod-mail")
    
    if message.author == client.user:
        return 
    if str(message.channel.type) == "private":
        if message.attachments != empty_array:
            files = message.attachments
            await modmail_channnel.send("[" + message.author.display_name + "] ")
    
            for file in files:
                await modmail_channnel.send(file.url)
        else:
            await modmail_channnel.send("[" + message.author.display_name + "] " + message.content)
    
    elif str(message.channel) == "mod-mail" and message.content.startswith("<"):
        member_object = message.mentions[0]
        if message.attachments != empty_array:
            files = message.attachments
            await member_object.send("[" + message.author.display_name + "] ")
    
            for file in files:
                await member_object.send(file.url)
        else:
            index = message.content.index(" ")
            string = message.content
            mod_message = string[index:]
            await member_object.send("[" + message.author.display_name + "] " + mod_message)

#img-only moderation
@client.event
async def on_message(message):
    if str(message.channel) == "img-only" and message.content != "":
        await message.channel.purge(limit=1)
    

client.run('Bot Token')

我使用Python 3.8.5,Discord.py 1.4.1,Visual Studio Code是我的代码编辑器

谢谢:)

1 个答案:

答案 0 :(得分:1)

首先,使用on_message实例只能有一个Client;由于您有多个,因此仅会调用最后一个on_message。解决此问题的一种方法是将两个on_message事件合并为一个on_message

@client.event
async def on_message(message):
    # Mod-mail
    empty_array = []
    modmail_channnel = discord.utils.get(client.get_all_channels(), name="mod-mail")

    if message.author == client.user:
        return
    if str(message.channel.type) == "private":
        if message.attachments != empty_array:
            files = message.attachments
            await modmail_channnel.send("[" + message.author.display_name + "] ")

            for file in files:
                await modmail_channnel.send(file.url)
        else:
            await modmail_channnel.send("[" + message.author.display_name + "] " + message.content)

    elif str(message.channel) == "mod-mail" and message.content.startswith("<"):
        member_object = message.mentions[0]
        if message.attachments != empty_array:
            files = message.attachments
            await member_object.send("[" + message.author.display_name + "] ")

            for file in files:
                await member_object.send(file.url)
        else:
            index = message.content.index(" ")
            string = message.content
            mod_message = string[index:]
            await member_object.send("[" + message.author.display_name + "] " + mod_message)

    # img-only moderation
    if str(message.channel) == "img-only" and message.content != "":
        await message.channel.purge(limit=1)

另一种方法是切换到Bot实例并使用listeners。在下面的示例中,仅img审核是主listener的{​​{1}}

on_message