Discord.py, Обязательный аргумент отсутствует - PullRequest
0 голосов
/ 21 апреля 2020
from discord.utils import get
import discord


TOKEN = '########' #Taken out
BOT_PREFIX = '!'
ROLE = 'Bot'

bot = commands.Bot(command_prefix=BOT_PREFIX)


@bot.event
async def on_ready():
    print("Logged in as: " + bot.user.name + "\n")


@bot.command(pass_context=True)
@commands.has_role("Sergeant") # This must be exactly the name of the appropriate role
async def addrole(ctx, members):
    member = ctx.message.author
    role = get(member.server.roles, name="Test")
    await bot.add_roles(member, role)


bot.run(TOKEN) 

Итак, приведенный выше код - это то, что я использую.

Traceback (most recent call last):
  File "C:\Users\Joshua\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\bot.py", line 892, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\Joshua\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\core.py", line 790, in invoke
    await self.prepare(ctx)
  File "C:\Users\Joshua\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\core.py", line 751, in prepare
    await self._parse_arguments(ctx)
  File "C:\Users\Joshua\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\core.py", line 670, in _parse_arguments
    transformed = await self.transform(ctx, param)
  File "C:\Users\Joshua\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\core.py", line 516, in transform
    raise MissingRequiredArgument(param)
discord.ext.commands.errors.MissingRequiredArgument: author is a required argument that is missing.

И это ошибка, я верю, что это связано с переписыванием, но, честно говоря, я не могу справиться с этим. Если бы кто-нибудь мог пролить свет на это, я был бы очень признателен.

1 Ответ

0 голосов
/ 21 апреля 2020

Хорошо, поэтому сначала вам нужно импортировать команды с разногласий вверху вашего файла. Ваша переменная бота вызывает это при получении префикса:

from discord.ext import commands

Далее вам больше не нужно pass_content=True в @bot.command(), так как контекст теперь всегда передается. Документация с указанием здесь .

Я заметил, что вы проверяете, есть ли у автора роль по имени. Хотя это работает, лучшим методом является проверка, имеет ли автор полномочия на управление ролями или он / она является администратором. Это набирается так:

@commands.has_permissions(administrator=True)

Полный список различных аргументов, которые вы можете передать этому декоратору, находится здесь .

Теперь относительно вашего сообщения об ошибке , у вас есть параметр с именем members в вашей командной функции. Поскольку это позиционный параметр, вы должны указать его при вводе команды в разногласиях. Однако в вашем коде ничего не происходит, поэтому вы можете удалить его:

async def addrole(ctx):

Более подробную информацию о параметрах команды можно найти здесь .

В вашей переменной именованный участник, вы можете изменить ctx.message.author на ctx.author.

В переменной роли при попытке получить роли на вашем сервере мы больше не используем member.server.roles. Он был изменен на guild, как показано в документах. Вот как вы его напечатаете:

role = get(member.guild.roles, name="Test")

И последнее изменение - добавление роли к члену. Перезаписанная версия discord.py удалила много функций из bot. Функция add_roles теперь вызывается из объекта-члена, поэтому это можно записать так:

await member.add_roles(role)

Мы берем переменную-член (ctx.author, которая является объектом-членом) и добавляем роль (переменная роли, которая выбирает объект роли с именем Test) для этого члена. Документы по нему находятся здесь .

Итак, ваш код должен выглядеть примерно так:

from discord.ext import commands
from discord.utils import get
import discord


TOKEN = '########'  # Taken out
BOT_PREFIX = '!'
ROLE = 'Bot'

bot = commands.Bot(command_prefix=BOT_PREFIX)


@bot.event
async def on_ready():
    print(f"Logged in as: {bot.user.name}")


@bot.command()
@commands.has_permissions(administrator=True)
async def addrole(ctx):
    member = ctx.author
    role = get(member.guild.roles, name="Test")
    await member.add_roles(role)


bot.run(TOKEN)

Надеюсь, это поможет с вашей проблемой :-) Вот несколько ссылок это поможет вам лучше понять, как работает discord.py-rewrite:

Миграция в ветвь перезаписи

Discord.py Rewrite API

...