@Alexsey566

Disnake в команде temprole возникла ошибка, в чём здесь ошибка?

@bot.command()
async def temprole(ctx, member:disnake.Member=None, role:disnake.Role=None, time=None):
    if not ctx.author.guild_permissions.administrator:
        return await ctx.send("У вас недостаточно прав чтобы использовать эту команду")
    time_letter=time[-1:]
    time_numbers=int(time[:-1])
    duration=t(time_letter) * time_numbers

    def t(time_letter):
        if time_letter == 's':
            return 1
        if time_letter == 'm':
            return 60
        if time_letter == 'h':
            return 60*60*24
        if time_letter == 'd':
            return 60*60*24*7
    if member is None:
       return await ctx.send(
       "Укажите пользователя")
    if role is None:
       return await ctx.send(
       "Укажите роль")
    if time is None:
       return await ctx.send(
       "Укажите время")
    await member.add_roles(role)
    await ctx.send(
    f"Роль {role.name} была временно назначена участнику {member.name} на {duration}")
    await asyncio.sleep(duration)
    await member.remove_roles(role)
    await ctx.send(
    f"У пользователя {member.mention} была убрана роль {role.mention}")


Но в этом коде есть такие ошибки:

Первая ошибка:

Object of type "None" is not subscriptable в строке 1207, часть кода: time_letter=time[-1:] ошибка жалуется на "time"

Вторая ошибка:

Object of type "None" is not subscriptable в строке 1208, часть кода: time_numbers=int(time[:-1]) ошибка также жалуется на "time"

Третья ошибка:

"t" is unbound в строке 1209, часть кода: duration=t(time_letter) * time_numbers ошибка жалуется на "t" и выдаёт такую ошибку: "t" is unbound, помогите пожалуйста сделать команду temprole для моего бота на библиотеке disnake в версии библиотеки disnake 2.9.1
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Если коротко.
"Object of type "None" is not subscriptable" - если при вызове команды не указан параметр времени, он будет None (так как ты указал значение None по умолчанию). Решения два.
а) замени значение по умолчанию None на какое-то другое, например, "15m". Тогда, если срок не указан, то будет дан срок по умолчанию.
б) Перед обращением к time проверяй, не None ли он. ЛЮБЫЕ обращения к переменной time допустимо производить, только если там не None.

"t(time_letter)" - ты вызываешь некую функцию t. Судя по окружающему коду, она должна преобразовывать название интервала времени ("s", "m", "h" и т.п.) в длину этого интервала времени в секундах. "t" is unbound означает, то ты не объявил такую функцию в области видимости этого кода (например, выше по коду в том же файле). Эту функцию нужно объявить, тогда её можно будет использовать.

Обе ошибки достаточно простые, если есть хоть какое-то знакомство с языком. А потому повторю актуальнейший совет: не учить язык по ботам. Боты - это НЕ просто. Начни с чего-то более простого.
Ответ написан
Ваш ответ на вопрос

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

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