向不和谐机器人命令添加可选的关键字参数

时间:2021-01-13 11:39:16

标签: discord.py

我有一个 bot 命令,我想向其中添加一个可选的关键字参数,我想得到一些建议。

命令是:

@bot.command(name='repeat', help='help me to understand bots')
async def repeat(ctx, *lines):
    print("repeating")
    await asyncio.gather(*[ctx.send(line) for line in lines])

到目前为止,如果你输入 !repeat "1" "2" "3",它会响应: 1 2 3

我想添加可选的关键字参数“repeats”,您可以将其添加在初始命令之后,它会告诉机器人将其响应重复指定的次数。

例如如果你输入 !repeat "1" "2" "repeat=2",它会响应: 1 2 1 2

但如果您不包含关键字,它将正常工作


编辑: 这只是一个玩具示例。经常使用功能 - 您希望让高级用户使用 kwargs 做一些不寻常的事情,而不会让所有用户都与这些功能进行交互。我有兴趣找到一种方法,可以使用已经接受任意数量参数的 discord 命令来完成此操作。

有没有办法在不唤醒它的情况下添加额外功能,以便每个用户都必须通过将其作为第一个变量或类似变量传递来与之交互?

2 个答案:

答案 0 :(得分:1)

不幸的是,kwargs 不适用于 discord.py,您需要将其作为第一个参数

async def repeat(ctx, repeats: commands.Greedy[int] = 1, *lines):
    print("Repeating...")

    for i in range(repeats):
        for line in lines:
            await ctx.send(line) # You can also use your method with `asyncio.gather`

我正在使用 commands.Greedy,因此错误会被默默忽略

调用它:

!repeat 10 hello there!
# or
!repeat hello there!

此外,如果您希望它在一条消息中重复整个 lines

async def repeat(ctx, repeats: commands.Greedy[int] = 1, *, message: str):
    print("Reperating...")

    for i in range(repeats):
        await ctx.send(message)

编辑:

所以基本上当你像这样调用命令时会发生什么

!repeat 2 5 apples

commands.Greedy 会将其转换为这样的列表:[2, 5]

我们不想那样,这是一个解决方案

async def repeat(ctx, repeats: commands.Greedy[int] = 1, *, message):
    if isinstance(repeats, list):
        repeats = repeats[0]
        message = ' '.join(repeats[1:]) + message

    for i in range(repeats):
        await ctx.send(message)

# Another solution using `typing`
import typing

async def repeat(ctx, repeats: typing.Optional[int] = 1, *, message):
    for i in range(repeats):
        await ctx.send(message)

参考:

答案 1 :(得分:-1)

为此,您必须在 lines 参数之前添加此参数。此外,您不必使用 asyncio.gather。你可以只使用字符串。

@bot.command(name='repeat', help='help me to understand bots')
async def repeat(ctx, repeat=1, *lines):
    print("repeating")
    msg = ' '.join(lines)*repeat
    await ctx.send(msg)