@0asd1337

Что делать при данной ошибке?

пишу бота для дискорд сервера, добавил ban и unban, ban работает исправно, unban не работает вообще, в консоли появляется ошибка(ниже прикреплю), подскажите, что делать, пожалуйста.
Код:
import discord
import asyncio
from discord.ext import commands


bot = commands.Bot(command_prefix='>', intents = discord.Intents.all(), case_insensitive = True)
bot.remove_command('help')

@bot.event
async def on_ready():
    print('Started')


@bot.command()
async def clear(ctx, count: int):
    await ctx.channel.purge(limit=count + 1)
    await ctx.send(f"Было удаленно {count} сообщений")


@bot.command()
async def ban(ctx, member: discord.Member,time=None, *, reason=None):
    async def unb(member):
        users = await ctx.guilde.bans()
        for ban_user in users:
            if ban_user.user == member:
                await ctx.guilde.unban(ban_user.user)

    if member:
        if time:
            time_letter = time[-1:]
            time_numbers = int(time[:-1])

            def t(time_letter):
                if time_letter == 's':
                    return 1
                if time_letter == 'm':
                    return 60
                if time_letter == 'h':
                    return 3600
                if time_letter == 'd':
                    return 3600 * 24
            if reason:
                await member.ban(reason=reason)
                await ctx.send(
                    embed=discord.Embed(description=f'Пользователь {member.mention} был забанен \nНа время:{time} \n Причина: {reason}'))

                await asyncio.sleep(time_numbers * t(time_letter))

                await unb(member)
                await ctx.send(f'Пользователь {member.mention} был разбанен по истечению срока бана!')
            else:
                await member.ban()
                await ctx.send(embed = discord.Embed(description=f'Пользователь {member.mention} был забанен \nНа время: {time}'))

                await asyncio.sleep(time_numbers * t(time_letter))

                await unb(member)
                await ctx.send(f'Пользователь {member.mention} был разбанен по истечению срока бана!')
        else:
            await member.ban()
            await ctx.send(
                embed=discord.Embed(description=f'Пользователь {member.mention} был забанен \nНа время: не указано'))
    else:
        await ctx.send('Введите имя пользователя')

@bot.command()
async def unban(ctx, id: int = None):
    if id:
        banned_users = await ctx.guild.bans()
        member_full = bot.get_user(id=id)
        for ban in banned_users:
            if ban.user == member_full:
                await ctx.guild.unban(ban.user)
        await ctx.send('Пользователь разбанен!')
    else:
        await ctx.send('Введите id пользователя')


bot.run('тут мой токен')


Ошибка:
65046bb04d3dc612503997.png
  • Вопрос задан
  • 126 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Вместо
member_full = bot.get_user(id=id)
banned_users = await ctx.guild.bans()
for ban in banned_users: ...

Нужно
member_full = bot.get_user(id=id)
async for ban in ctx.guild.bans(): ...

async for x in y - это не то же самое, что и for x in await y. Асинхронный генератор (первый случай) каждый элемент запрашивает асинхронно, а во втором случае - асинхронно запрашивается вся коллекция, которая потом синхронно итерируется. Разные подходы, разные методы, так что объект вполне может поддерживать только один из них.
Ответ написан
Комментировать
AshBlade
@AshBlade
Просто хочу быть счастливым
banned_users = await ctx.guild.bans() возвращает не список. Это асинхронный генератор, его использовать с for надо.

banned_users = []
async for user in ctx.guild.bans():
      banned_users.append(user)


Как-то так
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы