我正在设置一个新命令,我想对其进行很好的嵌入。如果每个参数都为1个字长,则此方法有效。但是,对于dark red
和dark magenta
之类的颜色,它将“深色”作为颜色,将“洋红色”作为标题,然后将其后的所有值作为值。
我认为我可以使用它的唯一方法是该命令让您执行k!embed <colour>, <title>, <value>
之类的操作,但都用逗号隔开,但是我不知道执行此操作的方法。我尝试使用谷歌搜索,但是很可能是由于缺乏术语而没有发现。另外,添加更多的星号似乎也无济于事……这是我最后的绝望努力。
@client.command(name='embed',
aliases=['e'],
pass_ctx=True)
async def embed(ctx, colour, name, *, value):
# making paramater match dictionary
colour = colour.lower()
colour.replace(' ', '_')
# checking if colour is valid
if colour not in colours:
await ctx.send('Invalid colour')
return
else:
colour = colours[colour]
# sets colour
embed = discord.Embed(
color = colour()
)
# adds other paramaters
embed.add_field(name='{}'.format(name), value="{}".format(value), inline=False)
# final product
await ctx.send(embed=embed)
print('Embed executed\n- - -')
正如我所提到的,键入k!embed dark magenta title this is the value
之类的内容会完全丢失,我更喜欢k!embed dark magenta, title, this is the value
之类的内容。谢谢!
edit:对于上下文,这是colours
字典和标题错字:
colours = { "red" : discord.Color.red,
"dark_red" : discord.Color.dark_red,
"blue" : discord.Color.blue,
"dark_blue" : discord.Color.dark_blue,
"teal" : discord.Color.teal,
"dark_teal" :discord.Color.dark_teal,
"green" : discord.Color.green,
"dark_green" : discord.Color.dark_green,
"purple" : discord.Color.purple,
"dark_purple" :discord.Color.dark_purple,
"magenta" : discord.Color.magenta,
"dark_magenta" : discord.Color.dark_magenta,
"gold" :discord.Color.gold,
"dark_gold" : discord.Color.dark_gold,
"orange" :discord.Color.orange,
"dark_orange" :discord.Color.dark_orange
}
答案 0 :(得分:1)
这是一个自定义转换器,即使不引用颜色,也可以使用未解析的参数中的另一个单词来识别颜色:
from discord.ext.commands import Converter, ArgumentParsingError
from discord import Color, Embed
class ColorConverter(Converter):
async def convert(self, ctx, argument):
argument = argument.lower()
if argument in ('dark', 'darker', 'light', 'lighter'):
ctx.view.skip_ws()
argument += "_" + ctx.view.get_word().lower()
if not hasattr(Color, argument):
ctx.view.undo()
raise ArgumentParsingError(f"Invalid color {argument}")
return getattr(Color, argument)()
@bot.command()
async def test(ctx, color: ColorConverter, *, text):
await ctx.send(embed=Embed(color=color, description=text))