discord.ext.commands
первым аргументом в команду всегда передает
commands.Context.
Вся суть расширения commands в отсутствии необходимости работы с обработкой сообщений и аргументов команд в них
Сделайте переменную
users
глобальной.
Например, объявив её после
os.chdir(r'D:\Sublime Text 3\testbot-master')
:
users = {}
В итоге, код команды должен выглядеть примерно так:
@bot.command()
async def Rank(ctx, user: discord.Member):
experience = users[str(user.id)]['experience']
lvl_start = users[str(user.id)]['level']
lvl_end = int(experience ** (1/50))
await ctx.send(':thumbsup: {}, Ваш уровень: {} :thumbsup:'.format(user.mention, lvl_end))
users[str(user.id)]['level'] = lvl_end
Ошибка
MissingRequiredArgument будет возникать в случае, если введенной команде не хватает аргументов:
!Rank
вызовет в данном случае ошибку
!Rank @DiscordTag#0000
- нет
Если вам необходимо чтобы команда срабатывала без аргумента - сделайте его необязательным, задав стандартное значение, например "None" (не забудьте в данном случае обработать это самое None в коде самой команды):
@bot.command()
async def Rank(ctx, user: discord.Member = None):
if not user:
user = ctx.author
...
А так же:
В текущей версии discord.py аргумента
pass_context
у команд нет, аргумент контекста передается первым автоматически всегда
from discord.ext.commands import Bot
- неиспользуемый импорт в этом коде