如何在 discord.py 中使用高级命令处理

Posted

技术标签:

【中文标题】如何在 discord.py 中使用高级命令处理【英文标题】:How can I use advanced command handling in discord.py 【发布时间】:2021-04-30 06:58:13 【问题描述】:

所以我的机器人开始有很多命令,并且在 main.py 上变得有点混乱。我知道有一种方法可以将命令存储在其他文件中,然后在 discord.js 上触发它们时将它们应用到 main.py。 discord.py 上也可以吗?

【问题讨论】:

这能回答你的问题吗? How do I use cogs with discord.py? 【参考方案1】:

这些东西叫做“cogs”,你可以有一个 cog 用于事件和一些用于其他类别。 这是一个例子:

import discord
from discord.ext import commands, tasks

class ExampleCog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
    
    @commands.command() # You use commands.command() instead of bot.command()
    async def test(self, ctx): # you must always have self, if not it will not work.
        await ctx.send("**Test**")

    @commands.Cog.listener() # You use commands.Cog.listener() instead of bot.event
    async def on_ready(self):
        print("Test")

def setup(bot):
    bot.add_cog(ExampleCog(bot))

每当您使用 bot 时,请在使用 cogs 时将其替换为 self.bot。 当您使用 cogs 时,您需要将 cog 文件放在单独的文件夹中。 您应该创建一个名为“./cogs/examplecog.py”的文件夹

在您的主 bot 文件中,您应该有下面编写的代码,以便 bot 读取 cog 文件。

for file in os.listdir("./cogs"): # lists all the cog files inside the cog folder.
    if file.endswith(".py"): # It gets all the cogs that ends with a ".py".
        name = file[:-3] # It gets the name of the file removing the ".py"
        bot.load_extension(f"cogs.name") # This loads the cog.

使用 cogs 的一个好处是,您无需在每次希望新代码正常工作时都重新启动机器人,只需执行 !reload <cogname>!unload <cogname>!load <cogname> 即可让这些命令正常工作需要下面的代码。

重新加载下方的齿轮

@bot.command()
@commands.is_owner()
async def reload(ctx, *, name: str):
    try:
        bot.reload_extension(f"cogs.name")
    except Exception as e:
        return await ctx.send(e)
    await ctx.send(f'"**name**" Cog reloaded')

卸载下方的齿轮

@bot.command()
@commands.is_owner()
async def unload(ctx, *, name: str):
    try:
        bot.unload_extension(f"cogs.name")
    except Exception as e:
        return await ctx.send(e)
    await ctx.send(f'"**name**" Cog unloaded')

在下方加载齿轮

@bot.command()
@commands.is_owner()
async def load(ctx, *, name: str):
    try:
        bot.load_extension(f"cogs.name")
    except Exception as e:
        return await ctx.send(e)
    await ctx.send(f'"**name**" Cog loaded')

我希望你明白这一切。 我花了大约一个小时来写这篇文章。

您可以在此Discord Server 上从 Senarc 获得更多帮助

最后,祝你有美好的一天,祝你的机器人好运。

【讨论】:

以上是关于如何在 discord.py 中使用高级命令处理的主要内容,如果未能解决你的问题,请参考以下文章

Discord Py - 如何使用文本命令向公会的所有成员添加多个角色

如何在 discord.py 中进行更改前缀命令?

Discord.py 如何在另一个命令中调用另一个命令?

如何获取在 discord.py 中引发错误的命令名称?

如何将 discord.py 帮助命令放入嵌入中?

如何在 discord.py 中使用多词别名