Как изменить название канала, где канал будет указанным каналом или ctx.каналом в зависимости от того, упоминаю я канал или нет

#python-3.x #discord.py

Вопрос:

Название немного сбивает с толку, но я хочу создать команду, в которой пользователь сможет изменить имя канала. Теперь я хочу, чтобы он изменил имя ctx.channel, если в команде не упоминается канал, и указанный канал, если он упоминается. Вот что я пробовал, но это не работает:

   @_channel.command(name="rename",
                    aliases=["re"],
                    brief="Renames channel.",
                    help="Renames the current channel or mentioned channel if argument passed.")
  async def _rename(self, ctx, channel, *, newname=None):
      if not newname:
          newname = channel
          channel = ctx.channel
          current_name = ctx.channel.name
          await ctx.channel.edit(name = newname)
          await ctx.send(f"Changed channel name from **{current_name}** to **{ctx.channel.name}**.")

      elif newname != None:
          current_name = ctx.channel.name
          await ctx.channel.edit(name = newname)
          await ctx.send(f"Changed channel name from **{current_name}** to **{ctx.channel.name}**.")
 

Например, если я выполню команду >ch rename general , я хочу, чтобы она переименовала название ctx.канала в «общее», но если я упомяну канал и >ch rename #bot general хочу ли я, чтобы он изменил название упомянутого канала » бот » на «общее»

Ответ №1:

Вы можете использовать преобразователи диссонанса. Это позволяет вам задать discord.py чтобы попытаться преобразовать аргументы для вас. Необязательно[разногласие.TextChannel] означает попытку преобразовать один аргумент в несогласие.TextChannel и в случае сбоя установите значение Нет.

 from typing import Optional

@commands.command(name='rename')
async def _rename(ctx, channel: Optional[discord.TextChannel] = None, *, new_name = None):
    if channel is None:
        channel = ctx.channel
    await ctx.send(f'Change {channel} to {new_name}')
 

Возможно, вы захотите выдать ошибку, если new_name отсутствует.

Комментарии:

1. Спасибо! я ценю это.

2. о, и у моего бота есть своего рода универсальный обработчик ошибок, настроенный в другом коге, который в основном просто сообщает вам, что вы сделали неправильно, в читаемом тексте, а не в том, что он печатает в консоли

Ответ №2:

Вот последняя команда, измененная в соответствии с моими потребностями благодаря помощи @Nevus!

   @_channel.command(name="rename",
                    aliases=["re"],
                    brief="Renames channel.",
                    help="Renames the current channel or mentioned channel if argument passed.")

  async def _rename(self, ctx, channel: Optional[discord.TextChannel] = None, *, newname):
      if channel is None:
          channel = ctx.channel

      current_name = channel.name
      await channel.edit(name = newname)
      await ctx.send(f"Changed {channel.mention}'s name from **{current_name}** to **{channel.name}**.")