Discord.py中如何实现触发previous命令时自动调用playing命令
实现方法
你不需要用别名实现,直接在previous命令的逻辑末尾主动调用playing命令对应的异步方法即可,discord.py中常用两种实现方式:
方式1:直接调用类内方法
这是最直接的方案,直接在previous命令执行完成后,传入相同的ctx对象调用playing_command方法即可:
import asyncio # 如需加等待确保曲目加载完成可导入 @commands.command(name="previous", aliases=["zurück"]) async def previous_command(self, ctx, name: t.Optional[str]): player = self.get_player(ctx) if not player.queue.history: raise NoPreviousTracks player.queue.position -= 2 await player.stop() # 可选:加短暂延迟,确保播放器已经加载完上一首曲目,避免拿到旧的播放信息 await asyncio.sleep(0.3) # 主动调用playing命令的实现方法,name传None即可自动取当前曲目标题 await self.playing_command(ctx, None) @commands.command(name="playing", aliases=["np"]) async def playing_command(self, ctx, name: t.Optional[str]): player = self.get_player(ctx) name = name or player.queue.current_track.title async with ctx.typing(): async with aiohttp.request("GET", LYRICS_URL + name, headers={}) as r: if not 200 <= r.status <= 299: raise NoLyricsFound
方式2:使用discord.py内置的ctx.invoke调用命令
你也可以用框架提供的命令调用方法,效果和用户手动触发playing命令完全一致,把上面previous_command末尾的调用代码替换为以下内容即可:
await ctx.invoke(self.playing_command) # 如需自定义传参可以写成 await ctx.invoke(self.playing_command, name="自定义歌名")
两种方式都可以实现触发previous命令后自动执行playing命令的效果,不需要修改原有命令的别名或者路由配置。
内容的提问来源于stack exchange,提问作者YES
相关产品推荐
相关产品推荐

