Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Discord.py重写邮件系统_Python 3.x_Discord.py_Discord.py Rewrite - Fatal编程技术网

Python 3.x Discord.py重写邮件系统

Python 3.x Discord.py重写邮件系统,python-3.x,discord.py,discord.py-rewrite,Python 3.x,Discord.py,Discord.py Rewrite,我正在尝试为服务器制作一个modmail机器人。这是代码 @client.event async def on_message(message): modmail_channel = discord.utils.get(client.get_all_channels(), name="bot-log") if message.author == client.user: return if str(message.channel.ty

我正在尝试为服务器制作一个modmail机器人。这是代码

@client.event
async def on_message(message):
    modmail_channel = discord.utils.get(client.get_all_channels(), name="bot-log")

    if message.author == client.user:
        return
    if str(message.channel.type) == "private":
        embed = discord.Embed(color=0x00FFFF)
        embed.set_author(name=f"Olympia Gaming Modmail System", icon_url="https://cdn.discordapp.com/icons/690937143522099220/34fbd058360c3d4696848592ff1c5191.webp?size=1024")
        embed.add_field(name='Report a member:', value=f"React with 1️⃣ if you want to report a member.")        
        embed.add_field(name='Report a Staff Member:', value=f"React with 2️⃣ if you want to report a Staff Member.")    
        embed.add_field(name='Warn Appeal:', value=f"React with 3️⃣ if you would like to appeal a warning.")
        embed.add_field(name='Question:', value=f"React with 4️⃣ if you have a question about our moderation system or the server rules.")
        embed.set_footer(text="Olympia Gaming | Modmail")
        msg = await message.author.send(embed=embed)
        await msg.add_reaction("1️⃣")
        await msg.add_reaction("2️⃣")
        await msg.add_reaction("3️⃣")
        await msg.add_reaction("4️⃣")
    def check(reaction, user):
       return user == message.author and str(reaction.emoji) in ["1️⃣", "2️⃣", "3️⃣", "4️⃣"]


    while True:
        try:
            reaction, user = await client.wait_for("reaction_add", timeout=60, check=check)

            if str(reaction.emoji) == "1️⃣":
                embed = discord.Embed(color=0x00FFFF)
                embed.set_author(name=f"Olympia Gaming Modmail System", icon_url="https://cdn.discordapp.com/icons/690937143522099220/34fbd058360c3d4696848592ff1c5191.webp?size=1024")
                embed.add_field(name='How to Report:', value="Send the ID of the person you are reporting and attach add a screen shot of them breaking a rule (can be ToS or a server rule).")        
                embed.set_footer(text="Olympia Gaming | Report a member ")
                await message.author.send(embed=embed)
                message, user = await client.wait_for("on_message", timeout=60, check=check)
                embed = discord.Embed(title=f"{message.content}", color=0x00FFFF)
                await modmail_channel.send(embed=embed)

               
        except asyncio.TimeoutError:
            await message.delete()
            break

这段代码唯一的问题是它不会将消息发送到modmail频道,并且会不断重复原始消息。有人能解释一下我如何解决这个问题吗?

我有几个建议给你

首先,我强烈建议将以下内容作为您的
on\u消息中的第一句话:

if message.guild:
    return
如果str(message.channel.type)=“private”:
,这将替换您的
,并确保立即丢弃未在DM中发送的任何消息

第二,我建议使用而不是
discord.utils.get(client.get\u all\u channels(),name=“bot log”)
,它将搜索bot所在的每个频道,直到找到一个名为
bot log
的频道。这是低效的

现在,您的bot每次都会发送初始消息的原因是,每当向bot发送消息时,都会调用主
on_message
。您需要跟踪用户在初始消息中已发送的内容,以便不再发送。最简单的实现就是将用户ID添加到一个列表中,并在主消息的
中选中该列表

另外,您的第二个
wait_for
将不起作用,它应该是“message”,您正在使用第一个检查功能,它正在寻找反应

这是一次完成的大量工作,因此这是我的完整
on_message
,包含所有更改,希望您不要只是复制粘贴它而不了解任何内容:

sent_users = []

@client.event
async def on_message(message):
    if message.guild: # ensure the channel is a DM
        return

    if message.author == client.user:
        return

    if message.author.id in sent_users: # Ensure the intial message hasn't been sent before
        return

    modmail_channel = client.get_channel(CHANNEL_ID)

    embed = discord.Embed(color=0x00FFFF)
    embed.set_author(name=f"Olympia Gaming Modmail System", icon_url="https://cdn.discordapp.com/icons/690937143522099220/34fbd058360c3d4696848592ff1c5191.webp?size=1024")
    embed.add_field(name='Report a member:', value=f"React with 1️⃣ if you want to report a member.")
    embed.add_field(name='Report a Staff Member:', value=f"React with 2️⃣ if you want to report a Staff Member.")
    embed.add_field(name='Warn Appeal:', value=f"React with 3️⃣ if you would like to appeal a warning.")
    embed.add_field(name='Question:', value=f"React with 4️⃣ if you have a question about our moderation system or the server rules.")
    embed.set_footer(text="Olympia Gaming | Modmail")
    msg = await message.author.send(embed=embed)
    await msg.add_reaction("1️⃣")
    await msg.add_reaction("2️⃣")
    await msg.add_reaction("3️⃣")
    await msg.add_reaction("4️⃣")

    sent_users.append(message.author.id) # add this user to the list of sent users

    try:
        def check(reaction, user):
            return user == message.author and str(reaction.emoji) in ["1️⃣", "2️⃣", "3️⃣", "4️⃣"]

        reaction, user = await client.wait_for("reaction_add", timeout=60, check=check)

        if str(reaction.emoji) == "1️⃣":
            embed = discord.Embed(color=0x00FFFF)
            embed.set_author(name=f"Olympia Gaming Modmail System", icon_url="https://cdn.discordapp.com/icons/690937143522099220/34fbd058360c3d4696848592ff1c5191.webp?size=1024")
            embed.add_field(name='How to Report:', value="Send the ID of the person you are reporting and attach add a screen shot of them breaking a rule (can be ToS or a server rule).")
            embed.set_footer(text="Olympia Gaming | Report a member ")
            await message.author.send(embed=embed)

            message = await client.wait_for("message", timeout=60, check=lambda m: m.channel == message.channel and m.author == message.author)
            embed = discord.Embed(title=f"{message.content}", color=0x00FFFF)
            await modmail_channel.send(embed=embed)


    except asyncio.TimeoutError:
        await message.delete()