Способ добавления команд в 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()
, который сделан для структурирования кода. Надеюсь кому-то помогут мои разработки.