python - 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 的?
解决方案
我也在做一个 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)
另外,如果我的英语(不是我的母语)有任何错误,我深表歉意。
推荐阅读
- c# - C# - RichtextBox 内的按钮放置
- amazon-web-services - 使用 Elastic beanstalk 调试 Route 53 的高 DNS Loopkup 时间问题
- python - 无法导入 pip 列表中显示的包
- typescript - 带有 SCSS 和 TypeScript 的 Blazor 的 Visual Studio 项目模板
- angular - IONIC 5:复选框 ngModel 双向绑定不起作用
- excel - 从 MM/DD 格式创建日期并包括当前年份?电源查询
- python-3.x - 如何在 discord.py 中使用按钮构造函数?
- haskell - 当为字符串和列表定义实例时,奇怪的“[Char] 的重叠实例”
- java - GlassFish servlet 容器是否使用该 catalina?
- python - OpenCV 检测游戏图像中的深色矩形