@TheMixRay

Как получить объект Member, зная id?

Хочу сделать команду !info, которая будет показывать дату создания аккаунта, с телефона/с пк и (то что как раз не работает) дату входа на сервер
@client.command(pass_context = True)
async def info(ctx):
    args = ctx.message.content.lstrip('{}info '.format(config.get('config.prefix')))
    if len(args) > 0:
        try:
            print(int(args.split('<@')[1].split('>')[0]))
            user = await client.fetch_user(int(args.split('<@')[1].split('>')[0]))
            member = await Guild.fetch_member(int(args.split('<@')[1].split('>')[0])) # Вот как я сделал
            emb = discord.Embed(
                title = f'Информация о {user.name}',
                colour = discord.Colour.from_rgb(
                    color_neutral[0],
                    color_neutral[1],
                    color_neutral[2]),
                timestamp = ctx.message.created_at)
            emb.add_field(name = 'Дата создания аккаунта:', value = str(user.created_at).split(' ')[0], inline = True)
            emb.add_field(name = 'Дата входа на сервер:', value = str(member.joined_at).split(' ')[0], inline = True)
            if member.is_on_mobile():
                emb.add_field(name = 'С телефона', value = str(' '), inline = True)
            else:
                emb.add_field(name = 'С пк', value = str(' '), inline = True)
            emb.set_thumbnail(url=user.avatar_url)
            await ctx.send(
                embed = emb,
                delete_after=float(config.get('config.time_before_delete'))
            )
        except:
            await ctx.send(
                embed = discord.Embed(
                    title = f'Ошибка',
                    colour = discord.Colour.from_rgb(
                        color_negative[0],
                        color_negative[1],
                        color_negative[2]),
                    timestamp = ctx.message.created_at),
                delete_after=float(config.get('config.time_before_delete')))
    else:
        print(ctx.message.author.id)
        user = await client.fetch_user(ctx.message.author.id)
        member = await Guild.fetch_member(ctx.message.author.id) # Нуу это тоже самое
        emb = discord.Embed(
            title = f'Информация о {ctx.message.author.name}',
            colour = discord.Colour.from_rgb(
                color_neutral[0],
                color_neutral[1],
                color_neutral[2]),
            timestamp = ctx.message.created_at)
        emb.add_field(name = 'Дата создания аккаунта:', value = str(user.created_at).split(' ')[0], inline = True)
        emb.add_field(name = 'Дата входа на сервер:', value = str(member.joined_at).split(' ')[0], inline = True)
        if member.is_on_mobile():
            emb.add_field(name = 'С телефона', value = str(' '), inline = True)
        else:
            emb.add_field(name = 'С пк', value = str(' '), inline = True)
        emb.set_thumbnail(url=ctx.message.author.avatar_url)
        await ctx.send(
            embed = emb,
            delete_after=float(
                config.get('config.time_before_delete')
            )
        )

Выводит ошибку:
624301440973668352
Ignoring exception in command info:
Traceback (most recent call last):
  File "C:\Users\               \AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "D:\               \               \               \bot.py", line 789, in info
    member = await Guild.fetch_member(ctx.message.author.id)
TypeError: fetch_member() missing 1 required positional argument: 'member_id'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Максим\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\Максим\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\Максим\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: fetch_member() missing 1 required positional argument: 'member_id'

Говорит что я не написал аргумент member_id, но это ложь
member = await Guild.fetch_member(ctx.message.author.id)

Не предлагайте Guild.get_member, не работает
  • Вопрос задан
  • 1898 просмотров
Решения вопроса 1
Help on function fetch_member in module discord.guild:
async fetch_member(self, member_id)


Guild - класс, и вы пытаетесь вызвать его метод. Посмотрите в сторону ООП в питоне.
Кратко: Классы - типы объектов, Объекты - определённые объекты указанного типа
class Horse:  # тип - лошадь
     ...
     def send_to_space(self, encapsulate: bool):
         # Функция позволяющая отправить лошадь в космос
         self.move(Place("Space"))

special_horse_in_vacuum = Horse(...) # Один определенный сферический конь
special_horse_in_vacuum.send_to_space(True) # Отправляем определенного коня в вакуум

special_horse_in_vacuum = Horse # Определение лошади
special_horse_in_vacuum.send_to_space(True) # Пытаемся отправить определение "лошадь" в космос
# Получаем TypeError: send_to_space() missing 1 required positional argument: 'encapsulate'


Вы пытаетесь взять слово "Сервер", и получить конкретного участника из определения "Сервер", не конкретного сервера.

Вам необходимо получать сервер из контекста: https://discordpy.readthedocs.io/en/stable/ext/com...
@bot.command()
async def test(ctx, member_id: int):
    print(await ctx.guild.fetch_member(member_id))  # Получить пользователя через API
    print(ctx.guild.get_member(member_id))  # Получить пользователя из кэша бота


Но в данном случае всё может быть намного проще, не нужно изобретать велосипед, достаточно разок почитать документацию, а не устаревшие туториалы (привет pass_context): https://discordpy.readthedocs.io/en/stable/ext/com...

В discord.py существует понятие "конвертеры", которые значительно упрощают написание команд:
@bot.command()
async def info(ctx, *, member: discord.Member):
    await ctx.send(f"Вас называют: {member.display_name}. Ваш ID: {member.id}. etc...")


Это, к слову, позволит вызывать команду не только по упоминанию пользователя, но и по его никнейму, ID, и полному тегу: https://discordpy.readthedocs.io/en/stable/ext/com...
9rL1N4x.png

Получать объект пользователя (User) нет смысла в данном случае, так как класс Member все методы класса User путём наследования.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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