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

2024-09-30 16:32:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在用Discord.py制作一个Discord机器人,代码的一部分(顶部)应该是mod mail,将一条消息发送给机器人,然后将其转发到服务器中的一个通道。然后,例如,版主可以通过获取用户ID并用<@用户ID>,然后,bot将接收该消息并将其发送给管理bot的人<;——这部分代码不起作用

我的文件的第二部分基本上监视一个名为img only的频道,并删除任何没有空字符串的消息,这意味着如果不删除,就不能发送任何非图像/文件的消息<;——此功能有效,它删除仅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代码是我的代码编辑器

谢谢:)


Tags: 代码nameclientsendmod消息messageimg
1条回答
网友
1楼 · 发布于 2024-09-30 16:32:35

首先,使用Client实例只能有一个on_message;因为您有多个,所以只会调用最后一个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

import discord
from discord.ext import commands

client = commands.Bot(command_prefix='.')


@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)
    await client.process_commands(message)


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

相关问题 更多 >