@MegaEdwards

Не понимаю, как исправить?

@bot.command(name="nick", aliases=["ник"])
@commands.has_role("⚡Technical Administrator Discord⚡")
async def nick(ctx, arg1 = None, *, arg2 =None):
    if arg1 != None and arg2 != None:
        member = disnake.utils.get(ctx.guild.members, mention=arg1)
        newnick = arg2
        await member.edit(nick = newnick)
        await ctx.send (f">>> Для {member.mention} установлен ник {newnick}.")
    elif arg1 != None and arg2 == None:
        member = ctx.message.reference.resolved.author
        newnick = arg1
        await member.edit(nick=newnick)
        await ctx.send(f">>> Для {member.mention} установлен ник {newnick}.")

Это код, позволяющий менять никнейм человеку и через упоминание (/nick @упоминание новыйник), либо же ответив на сообщение (/nick новыйник). Казалось бы - все работает, но, если у человека ник длиннее одного слова, либо же новый ник длиннее одного слова - выдает ошибку. Я понимаю что можно в кавычках, но они мне не нужны, а звездочку одновременно для двух аргументов установит нельзя. Что делать?
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Вообще задумайся: если у тебя два многословных ника простым текстом подряд, как программа поймёт, где начинается первый ник, и где кончается второй?
Я бы или упростил команду (убрал механизм "ответ на сообщение"), или наоборот, опирался бы на этот механизм в первую очередь.

Вообще discord.py позволяет указывать тип аргумента. Почитай секции "Basic converters", "Discord Converters" и "typing.Union".

Используя это, ты можешь попробовать схитрить вот так:
# discord.py попытается сначала интерпретировать первый аргумент как пользователя. 
# Если не получится - будет просто строка
async def nick(ctx, arg1: typing.Union[discord.Member, str], *, arg2: str = None):
    if ctx.message.reference is not None and isintance(arg1, str):  # сообщение - это ответ
        member = ctx.message.reference.resolved.author
        # arg1 будет содержать первое слово ника - доклеиваем к нему остальные.
        newnick = f'{arg1} {arg2}' if arg2 is not None else arg1  
    elif ctx.message.reference is None and isintance(arg1, discord.Member) and arg2 is not None:  # сообщение - не ответ
        member, newnick = arg1, arg2
    else:
        ...  # выводим сообщение о неправильном использовании команды
    await member.edit(nick = newnick)


Не факт что сработает. В этом случае либо требуй ввода упоминания, либо вообще сделай слэш-команду и не парься.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы