首页 > 解决方案 > Discord.py Musicbot 跳过命令权限错误

问题描述

所以作为我开始编程后的第一个“主要”项目,我决定制作一个 Discord Bot。这里的问题是我的“跳过”命令。它以某种方式工作,但我不明白如何。

def play_next(ctx):
if len(songs_list) >= 2:
    print(songs_list,"before del")
    del songs_list[0]
    print(songs_list[0], "new song")

    
    try:
        if os.path.isfile("song.mp3"):
            os.remove("song.mp3")
    except PermissionError:
        print("permissionerror")
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([songs_list[0]])
    for file in os.listdir("./"):
        if file.endswith(".mp3"):
            os.rename(file, "song.mp3")
    voice.play(discord.FFmpegPCMAudio("song.mp3"), after=lambda e: play_next(ctx))
    voice.isplaying()

和跳过命令:

@client.command(pass_context=True)
async def skip(ctx):
voice.stop()
voice.skip()
try:
  os.remove("song.mp3")
except:
  pass
play_next(ctx)

我知道这不是处理这个问题的最佳方式,但我才刚刚开始编写代码,这就是我让它工作的方式。在跳过命令中,当我不使用 voice.skip() 时,我会在控制台中打印出 PermissionError。

包含它后,我反而收到消息“VoiceClient”对象没有“跳过”属性,但到目前为止一切正常。有人可以解释为什么吗?我的意思是如果跳过不存在,那么它为什么会起作用?它是如何绕过 PermissionError 的?

标签: pythonffmpegdiscord.pyaudio-player

解决方案


我也在做一个 Discord 机器人作为 python 中的第一个项目。我发现导致这种情况的原因是voice.stop()使音频停止,但是当它停止时after=lambda回调开始。然后,如果您调用playNext(),它将导致错误,因为after=lambda回调已经在播放,因此该voice.skip()方法会抛出异常并且playNext()永远不会调用,因为调用的是after=lambda回调。至少在我的情况下,所以我希望它可以帮助你:D

权限错误是因为after=lambda回调开始时,机器人正在播放歌曲,并且在播放时您尝试使用该playNext()功能,因此导致错误。

尝试:

@client.command(pass_context=True)
async def skip(ctx):
voice.pause()
play_next(ctx)

另外,如果我的英语(不是我的母语)有任何错误,我深表歉意。


推荐阅读