Discord.py Musicbot 跳过命令权限错误

Posted

技术标签:

【中文标题】Discord.py Musicbot 跳过命令权限错误【英文标题】:Discord.py Musicbot Skip Command PermissionError 【发布时间】:2020-11-24 19:57:33 【问题描述】:

所以作为我开始编程后的第一个“主要”项目,我决定制作一个 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”对象没有属性“skip”,但到目前为止一切正常。有人可以解释为什么吗? 我的意思是如果跳过不存在,那么它为什么会起作用?又是如何绕过 PermissionError 的?

【问题讨论】:

您使用哪种操作系统?在哪个位置存储您的文件?是用户可访问的目录吗? Windows 10。python 文件与“song.mp3”位于同一目录中,即使没有管理员也可以访问所有内容。在我看来,该文件似乎仍在使用中。 当您关闭主进程时,discord.FFmpegPCMAudio 是否仍在处理文件?您可以在活动监视器中检查一些 python 进程 看来确实如此。我的意思是代码有效……但我不知道为什么。 【参考方案1】:

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

权限错误是因为after=lambda回调启动时,bot正在播放歌曲,而在播放时你尝试使用playNext()函数导致错误。

尝试:

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

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

【讨论】:

以上是关于Discord.py Musicbot 跳过命令权限错误的主要内容,如果未能解决你的问题,请参考以下文章

在 discord.py 中完成后如何跳过或结束关键字命令?

Discord 机器人帮助命令 [discord.py]

discord.py,同时使用斜杠命令和前缀

找不到 discord.py 命令

如何将 discord.py 帮助命令放入嵌入中?

discord.py 块踢命令