Способ добавления команд в Discord бота без использования @bot.command

Недавно делал своего бота и столкнулся с надобностью добавления огромного количества команд. Оригинальный метод мне не понравился из-за добавления огромного количества повторяющихся строк. Ниже покажу, как я добился нужного результата.

Код с оригинальным методом добавления команд:

class f_Ds:
    prefix = "!"
    client = commands.Bot(command_prefix=prefix,intents=(discord.Intents.all()))

    @client.command
    async def hello (ctx):
        await ctx.reply("Hello!")


    @client.command
    async def bye (ctx):
        await ctx.reply("Bye bye!")


    def start (token):
        f_Ds.client.run(token)
        
f_Ds.start("-")

Ответы (1 шт):

Автор решения: Роман Копачев

Изучая варианты @client.event, я увидел функцию on_message(), с помощью которой и решил сделать свой метод вызова команд.

Новый код:

class f_Ds:
    prefix = "!"
    commands = []
    client = commands.Bot(command_prefix=prefix,intents=(discord.Intents.all()))

    @client.event
async def on_message(ctx):
    i = 0
    while i < len(f_Ds.command):
        if ctx.content[0:len(f_Ds.command[i][0])+2] == f"{f_Ds.prefix}{f_Ds.command[i][0]} " or (len(ctx.content) == len(f"{f_Ds.prefix}{f_Ds.command[i][0]}") and ctx.content[0:len(f"{f_Ds.prefix}{f_Ds.command[i][0]}")] == f"{f_Ds.prefix}{f_Ds.command[i][0]}"):
            await f_Ds.command[i][1](ctx)
        i += 1
            i += 1


    def add_command(comm,func):
        f_Ds.command.append((comm,func))


    async def hello (ctx):
        await ctx.reply("Hello!")


    async def bye (ctx):
        await ctx.reply("Bye bye!")

    def initialize ():
        f_Ds.add_command("Hello",f_Ds.hello)
        f_Ds.add_command("Bye",f_Ds.bye)


    def start (token):
        f_Ds.initialize()
        f_Ds.client.run(token)

f_Ds.start("-")

Пояснения: В новом примере я использовал ивент on_message(), который вызывается при каждом сообщении, написанном на сервере. Для добавления команд я написал метод f_Ds.add_command(), который добавляет название команды и её поведение в массив f_Ds.commands. Также был добавлен метод f_Ds.initialize(), который сделан для структурирования кода. Надеюсь кому-то помогут мои разработки.

→ Ссылка