Discord.py - ошибка UserNotFound после попытки забанить пользователя

Я пытаюсь создать бота Discord, который может банить пользователя на двух моих серверах, если я забаню его на основном сервере. При тестировании прогресса все, казалось, работало, пока не дошло до фактического бана пользователя. Ошибок не возникло, но пользователя не забанили. При повторной попытке тестирования я продолжаю получать ошибки UserNotFound. Я перезапустил бота, повторно добавил его и тестируемого пользователя на оба сервера и попытался очистить кеш, но бот по-прежнему не распознает, что пользователь больше существует.

Это код команды запрета:

async def totalban(ctx, userID):
    if ctx.message.author.guild_permissions.administrator: # check if admin
        if ctx.guild.id == GUILD_ID: # if admin, check if right guild
            await ctx.send('Confirmed administrator on proper server.')
            time.sleep(1)
            global TARGET_ID
            TARGET_ID = int(userID) # record target user ID
            converter = UserConverter()
            user = await converter.convert(ctx, userID) # convert arg to User
            username = user.name + '#' + user.discriminator # easy reference in Name#1234 format
            global TARGET_USERNAME
            TARGET_USERNAME = username
            await ctx.send('User ID ' + userID + ' corresponds to ' + username + '.')
            time.sleep(1)
            await ctx.send('To confirm ban of ' + username + ', type **!confirmtotalban ' + username + '** now.')
            global CANCONFIRMBAN
            CANCONFIRMBAN = True # allow !confirmtotalban command to function
        else:
            await ctx.send('Cannot run command from this server.')
    else:
        await ctx.send('User unauthorized to run command.')

И это функция, которую я запускал при попытке заблокировать тестовую учетную запись:

(Если это поможет, у меня никогда не было ошибок UserNotFound до запуска этого кода.)

async def banloop(ctx):
    global TARGET_ID
    for guild in ctx.bot.guilds:
        await guild.ban(TARGET_ID)

А вот и обратная связь:

Traceback (most recent call last):
  File "...\Programs\Python\Python38\lib\site-packages\discord\ext\commands\bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "...\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "...\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "...\example_bot.py", line 41, in totalban
    user = await converter.convert(ctx, userID) # convert arg to User
  File "...\Programs\Python\Python38\lib\site-packages\discord\ext\commands\converter.py", line 194, in convert
    raise UserNotFound(argument)
discord.ext.commands.errors.UserNotFound: User "165995850303012864" not found.

Заранее благодарим за любую помощь, которую вы можете предложить, и дайте мне знать, если вам понадобится дополнительная информация от меня.


person yellowlightgreen    schedule 14.10.2020    source источник
comment
Я не изучал ваш код подробно, но вы удостоверились, что у бота есть разрешения на их бан, потому что это беспокоило меня полнедели   -  person Evorage    schedule 14.10.2020
comment
Да, бот был добавлен на оба сервера с привилегиями бана.   -  person yellowlightgreen    schedule 14.10.2020
comment
Является ли ранг этого игрока выше, чем у бота в ролях сервера, это еще одна проблема, с которой я столкнулся   -  person Evorage    schedule 14.10.2020
comment
Нет, вообще-то я думаю, что они такие же.   -  person yellowlightgreen    schedule 14.10.2020
comment
Использование глобальных переменных может быть частью проблемы, поскольку глобальные переменные имеют тенденцию усложнять отладку кода. Это единственное место, где изменяется TARGET_ID?   -  person Cho'Gath    schedule 14.10.2020
comment
Он инициируется как 0 в верхней части программы, но кроме этого, это единственная модификация.   -  person yellowlightgreen    schedule 14.10.2020
comment
Не рекомендуется создавать отдельную команду подтверждения с теми же переменными, потому что вы можете получить состояние гонки, когда два администратора выполняют команду, а подтверждение блокирует только второго пользователя. Попробуйте использовать wait_for, чтобы получить подтверждение реакции или что-то в этом роде   -  person Eric Jin    schedule 15.10.2020


Ответы (2)


 TARGET_ID = int(userID) # record target user ID

Если я правильно понимаю, вы конвертируете здесь userID в целое число. Тем не мение,

discord.ext.commands.errors.UserNotFound: User "165995850303012864" not found.

Идентификатор цели отображается в виде строки ошибки. Вы можете проверить это.

person artoria    schedule 14.10.2020
comment
К сожалению, это не похоже на проблему. Программа явно распознает любых других пользователей, но только не того, которого я изначально пытался забанить. - person yellowlightgreen; 14.10.2020
comment
Вы пробовали использовать Discord. member в качестве аргумента и пытаться таким образом выполнить свою команду запрета? - person artoria; 14.10.2020

Ошибка в трассировке связана с вызовом UserConverter.convert() в вашей функции totalban(), который вызывает ошибку UserNotFound. Поскольку этот вызов функции вызывает ошибку, это означает, что для CANCONFIRMBAN никогда не будет установлено значение true, что объясняет, почему никого не забанят.

Согласно документации , UserConverter.convert() принимает строковый аргумент. Вы уверены, что аргумент userID в totalban() является строкой, а не целым числом?

Также есть это примечание о том, как UserConverter может преобразовывать значения в объект User:

Все поиски выполняются через глобальный пользовательский кеш.

  • Вы уверены, что внутренний кеш бота готов?

  • Для fetch_offline_members установлено значение "Ложь"? Это сильно ограничивает функциональность ботов и может сделать многие вещи невозможными.

  • Вы пробовали вызывать функцию с name#discrim вместо идентификатора пользователя?

Без дополнительной информации трудно помочь решить проблему с уверенностью.

person Cho'Gath    schedule 14.10.2020
comment
Спасибо за вашу помощь. Как бы вы посоветовали проверить, готов ли внутренний кеш? - person yellowlightgreen; 15.10.2020
comment
@yellowlightgreen Попробуйте вызвать ctx.bot.is_ready () и распечатать перед преобразованием. - person Cho'Gath; 15.10.2020
comment
Кроме того, попробуйте сделать так, чтобы у вашего друга были чуть более низкие привилегии, чем у бота, и проверьте, устраняет ли это ошибку. - person Cho'Gath; 15.10.2020