命令中的 Discord.py 命令?

Posted

技术标签:

【中文标题】命令中的 Discord.py 命令?【英文标题】:Discord.py Commands within Commands? 【发布时间】:2021-03-26 06:07:34 【问题描述】:

我一直在考虑在我的不和谐机器人中制作二十一点游戏,但遇到了障碍。

我显然有使用命令.blackjack 召唤的游戏,它在生成随机值和发送消息方面工作正常。但是,我不知道如何做到这一点,例如,玩家可以在发牌的消息发送后说击中或站立。

@client.command()
async def blackjack(ctx):
    # (insert all random number gens, etc. here)
    
    await ctx.send(f"dface1dsuit1 (dvalue1), dface2dsuit2 (dvalue2)")
    await ctx.send(f"(Dealer Total: dtotal)")
    
    await ctx.send(f"pface1psuit1 (pvalue1), pface2psuit2 (pvalue2)")
    await ctx.send(f"(Total: ptotal)")

现在呢?我该怎么做才能运行我的下一部分代码,即玩家是否击球或站立,庄家是否击球和站立等。

【问题讨论】:

检查one第76行 你的意思是子命令? 【参考方案1】:

我真的不知道如何玩二十一点,所以恐怕我无法为您的问题提供完整的答案。但是,我会说如何实现您想要的。在我看来,有两种方法可以做到这一点。

方法一

等待用户对你的机器人消息做出反应

为此,您必须使用:

reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check)

例如,假设您正在等待用户的? 或?️(这可能分别表示击中和站立)。代码看起来像这样:

@client.command()
async def start(ctx):
    def check(reaction, user):
        return (user == ctx.author) and (str(reaction.emoji) == '?' or str(reaction.emoji) == '?️')

    async def sendMessage(msg):
        message = await ctx.send(msg)
        await message.add_reaction('?')
        await message.add_reaction('?️')

        try:
            reaction, user = await client.wait_for('reaction_add', timeout = 60.0, check = check)
        except:
            await message.clear_reactions()
            await ctx.send('No reaction received.')
        else:
            await message.clear_reactions()
            return reaction

        return 0

    reaction = str(await sendMessage('This is my message'))

这是一个简单的代码,用于检查用户是否对?或?️做出反应。你必须添加更多的条件和循环才能得到你想要的。

方法二

等待用户发送消息

为此,您必须使用:

msg = await client.wait_for('message', check = check, timeout = 60.0)

然后您必须检查 msg 是否等于 hitstand 或诸如 hs 之类的简短形式。还要确保编写一个在client.wait_for() 函数(check = check) 内部调用的check(author) 函数,以检查作者是否与运行该命令的作者相同。

我希望您在阅读此答案后能够想出您正在寻找的代码。

【讨论】:

【参考方案2】:

discord.py 具有内置的子命令支持,这是一个示例:

@commands.group(invoke_without_subcommand=True)
async def your_command_name(ctx):
    # Do something if there's not a subcommand invoked


@your_command_name.command()
async def subcommand_name(ctx, *args):
    # Do something

# To invoke
# prefixyour_command_name subcommand_name some arguments here

或者你可以简单地等待消息

@client.command()
async def blackjack(ctx):
    # ...
    def check(message):
        """Checks if the message author is the same as the one that invoked the 
        command, and if the user chose a valid option"""
        return message.author == ctx.author and message.content.lower() in ['stand', 'hit']

    await ctx.send('Would you like to hit or stand?')

    message = await client.wait_for('message', check=check)
    await ctx.send(f"You chose to `message.content`")

# To invoke
# prefixblackjack
# Would you like to hit or stand?
# stand
# You chose to `stand`

【讨论】:

以上是关于命令中的 Discord.py 命令?的主要内容,如果未能解决你的问题,请参考以下文章

频道中的 Discord.py 禁用命令

如何访问discord.py中的哪个语音通道用户写入命令?

如何取消 discord.py 中的 asyncio.sleep 命令

命令 discord.py 中的客户端事件

在保留命令的同时监听 Discord.py 中的消息

用户执行命令后,如何删除 discord.py 中的消息?