Discord.py 如何在另一个命令中调用另一个命令?

Posted

技术标签:

【中文标题】Discord.py 如何在另一个命令中调用另一个命令?【英文标题】:Discord.py how to invoke another command inside another one? 【发布时间】:2020-10-09 02:42:16 【问题描述】:

我希望我的机器人在使用已定义的函数 (+play) 键入 +playtest 时播放特定歌曲 但我有一个错误说

“Discord.ext.commands.errors.CommandInvokeError:命令引发了 异常:TypeError:“命令”对象不可调用”

除此命令外,整个代码都可以正常工作 我想知道 ctx.invoke 是否启用传递参数?或者我只是错过了一些东西

这是我的简短代码

import discord
import wavelink
from discord.ext import commands

import asyncio
from bs4 import BeautifulSoup
import requests
import datetime

queue = []



class Bot(commands.Bot):

    def __init__(self):
        super(Bot, self).__init__(command_prefix=['+'])

        self.add_cog(Music(self))

    async def on_ready(self):
        print(f'Logged in as self.user.name | self.user.id')


class Music(commands.Cog):

    def __init__(self, bot):
        self.bot = bot

        if not hasattr(bot, 'wavelink'):
            self.bot.wavelink = wavelink.Client(bot=self.bot)

        self.bot.loop.create_task(self.start_nodes())
        self.bot.remove_command("help")

    async def start_nodes(self):
        await self.bot.wait_until_ready()

        await self.bot.wavelink.initiate_node(host='127.0.0.1',
                                              port=80,
                                              rest_uri='http://127.0.0.1:80',
                                              password='testing',
                                              identifier='TEST',
                                              region='us_central')

    @commands.command(name='connect')
    async def connect_(self, ctx, *, channel: discord.VoiceChannel = None):


    @commands.command()
    async def help(self, ctx):

    @commands.command()
    async def play(self, ctx, *, query: str):

    @commands.command(aliases=['sc'])
    async def soundcloud(self, ctx, *, query: str):


    @commands.command()
    async def leave(self, ctx):

    @commands.command(aliases=['queue', 'q'])
    async def check_queue(self, ctx):

    @commands.command(aliases=['clearq', 'clearqueue'])
    async def clear_queue(self, ctx):


    @commands.command(aliases=['removequeue', 'removeq', 'req'])
    async def remove_queue(self, ctx, num: int):

    @commands.command()
    async def skip(self, ctx):


    @commands.command(aliases=['eq'])
    async def equalizer(self, ctx: commands.Context, *, equalizer: str):

    @commands.command()
    async def playtest(self,ctx):
       await ctx.invoke(self.play('hi'))

bot = Bot()
bot.run('sd')

【问题讨论】:

【参考方案1】:

ctx.invoke 确实允许传递参数,但需要以不同于您习惯的方式处理它们 (function(params))

参数必须在调用中显式显示(例如param = 'value'),并且命令必须是命令对象。 这就是你可以调用命令的方式:

@commands.command()
async def playtest(self, ctx):
   await ctx.invoke(self.bot.get_command('play'), query='hi')

【讨论】:

是自动传递上下文还是你需要指定ctx=ctx(我认为它是因为基本上零情况下你不想想要传递上下文但只是为了澄清。 回应我自己的评论:是的,上下文是自动传递的

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

如何在 Discord Py 中将列表附加并保存到另一个文件中?

如何从另一个命令终止 discord.py 中的异步函数

Discord.py 如何从另一个文件运行代码?

Discord.py bot 在添加反应时将消息重新发送到另一个频道中断

当命令 discord.py 的参数不正确时如何显示消息?

如何在调用函数时使用 discord.py 添加反应?