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.
这是错误,我相信这是重写操作,但老实说我无法处理。如果有人能对此有所启发,我将不胜感激。
答案 0 :(得分:0)
好的,因此首先需要从文件顶部的discord导入命令。您的bot变量在获取前缀时会调用此变量:
from discord.ext import commands
接下来,您将不再需要pass_content=True
中的@bot.command()
,因为现在总是传递上下文。可以找到here.
我注意到您正在按作者名称检查作者。尽管这样做确实可行,但是更好的方法是检查作者是否具有管理角色的权限,或者他/她是否是管理员。键入如下:
@commands.has_permissions(administrator=True)
找到可以传递给该装饰器的不同参数的完整列表,here.
现在关于错误消息,您在命令功能中有一个称为成员的参数。由于这是一个位置参数,因此在discord中键入命令时必须提供它。但是,它在您的代码中没有执行任何操作,因此您可以将其删除:
async def addrole(ctx):
有关命令参数的更多信息,请参见here.
在名为member的变量中,您可以将ctx.message.author
更改为ctx.author
。
在角色变量中,当尝试在您的服务器上获取角色时,我们不再使用member.server.roles
。如docs.所示,它已更改为guild
。输入方法如下:
role = get(member.guild.roles, name="Test")
最后的更改是将角色添加到成员。重写版本的discord.py从bot
中删除了许多功能。现在从成员对象中调用add_roles
函数,因此其编写方式如下:
await member.add_roles(role)
我们要使用您的成员变量(ctx.author,这是一个成员对象),然后向该成员添加一个角色(角色变量,该角色获取名称为Test的角色对象)。已找到here.
上的文档因此您的代码应如下所示:
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的工作方式: