Discord.py how to invoke another command inside another one?(Discord.py 如何在另一个命令中调用另一个命令?)
问题描述
我希望我的机器人在使用已定义的函数 (+play) 键入 +playtest 时播放特定歌曲但我有一个错误说
I want my bot to play a specific song when typing +playtest using already defined function (+play) but i got an error says
Discord.ext.commands.errors.CommandInvokeError:命令引发了异常:TypeError:命令"对象不可调用"
"Discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: 'Command' object is not callable"
除此命令外,整个代码都可以正常工作我想知道 ctx.invoke 是否启用传递参数?或者我只是错过了一些东西
an entire code work perfectly fine except for this command i wonder does ctx.invoke enable passing arguments? or i just missed something
这是我的简短代码
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')
推荐答案
ctx.invoke 确实允许传递参数,但它们需要以不同于您习惯的方式处理(function(params) )
ctx.invoke does allow passing arguments, but they need to be handled in a different way to how you may be used to ( function(params) )
参数必须在调用中显式显示(例如 param = 'value')并且命令必须是命令对象.这就是你可以调用命令的方式:
The parameters must be explicitly shown in the invoke (e.g. param = 'value') and the command must be a command object.
This would be how you could invoke a command:
@commands.command()
async def playtest(self, ctx):
   await ctx.invoke(self.bot.get_command('play'), query='hi')
                        这篇关于Discord.py 如何在另一个命令中调用另一个命令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Discord.py 如何在另一个命令中调用另一个命令?
				
        
 
            
        基础教程推荐
- 修改列表中的数据帧不起作用 2022-01-01
 - 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
 - PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
 - 包装空间模型 2022-01-01
 - 求两个直方图的卷积 2022-01-01
 - 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
 - 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
 - PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
 - 在Python中从Azure BLOB存储中读取文件 2022-01-01
 - Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				