You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:24:01