尝试播放队列中的下一首歌曲时,我的Discord机器人遇到了麻烦。这个问题很难描述,因为在我的代码中进行很小的调整就可以得到很多不同的错误。
首先,当我自己不知道如何解决该问题时,我检查了StackOverflow中是否存在类似的问题,并且低估了问题,我的问题还有另一个用户。但是,解决方案中显示的针对该用户的修复不适用于我。
我已经尝试过对我可以想到的所有可能的排列进行许多调整,但是,a,我似乎无法弄清楚如何使其工作。在我的“播放”命令中一切都出错了。这是我最后留下的代码。
@commands.command(aliases=["p"])
async def play(self, ctx):
await self.client.get_command("join").callback(self, ctx) # Joins the channel the user is in
voice = get(self.client.voice_clients, guild=ctx.guild)
async def play_next(self, ctx):
global CURRENT_SONG
for file in os.listdir("./songs"):
print(file)
print("CURRENT SONG = {0}".format(CURRENT_SONG))
if file.endswith(".mp3"):
file_prefix = int(file[:3])
if CURRENT_SONG < file_prefix:
print("Current song has been changed")
CURRENT_SONG = file_prefix
if file_prefix == CURRENT_SONG and not voice.is_playing():
await voice.play(discord.FFmpegPCMAudio(SONGS_FOLDER + file), after= await play_next(self, ctx))
voice.source = discord.PCMVolumeTransformer(voice.source)
voice.source.volume = 0.25
await play_next(self, ctx)
我遇到三个稍有不同的问题,具体取决于我对代码进行的调整。
这似乎最常发生。根据我的判断,after=
的{{1}}部分似乎会不断重复播放,即使这是在歌曲播放完之后进行的。
#2-歌曲#1播放,但之后没有播放
当我将voice.play
更改为after= await play_next(self, ctx)
并删除play_next函数,只是将for循环保留在play函数中时,就会发生这种情况。这告诉我必须添加此部分,但是我不确定如何添加。有趣的是,控制台会说下一首歌会播放,但永远不会播放。
我很早以前就遇到过这个问题,但是我似乎无法以某种方式重现此问题,因此无法提供终端的屏幕截图。
#3-控制台显示所有歌曲将播放,全部跳过,播放最后一首歌曲
这种情况很少发生,但令人讨厌。我在代码触发器中有打印件,但是歌曲不播放。他们只是跳过,直到到达最后一个,这时的确确实起作用了。不幸的是,由于这种情况很少发生,因此我也没有此特定问题的屏幕截图。本质上,它会打印:
001-{songname}已结束播放
002-{songname}已经播放完毕
003-{songname}的比赛结束了
......
n-{songname}完成播放
但是,似乎只播放了最后一个。
很长时间以来,我一直不遗余力,非常感谢您的帮助。这个问题一直困扰着我近一个星期。
预先感谢
本
这是我上次离开时的完整代码\ /
bot.py
after=print("{0} has finished playing".format(file)))
basic_functions.py
import discord
from discord.ext import commands
import os
from settings import BOT_TOKEN
client = commands.Bot(command_prefix=("!"))
@client.event
async def on_ready():
await client.change_presence(status=discord.Status.idle)
print("This bot is ready!")
@client.command()
async def load(ctx, extension):
client.load_extension("cogs.{0}".format(extension))
@client.command()
async def unload(ctx, extension):
client.unload_extension("cogs.{0}".format(extension))
@client.command()
async def reload(ctx, extension):
await client.get_command("unload").callback(ctx, extension.lower())
await client.get_command("load").callback(ctx, extension.lower())
@client.command()
async def reload_all_cogs(ctx):
for filename in os.listdir("./cogs"):
if filename.endswith(".py"):
await client.get_command("reload").callback(ctx, filename[:-3])
# Load Cogs on Boot
for filename in os.listdir("./cogs"):
if filename.endswith(".py"):
client.load_extension("cogs.{0}".format(filename[:-3]))
client.run(BOT_TOKEN)
music_bot.py
import discord
from discord.ext import commands
class BasicFunctions(commands.Cog):
def __init__(self, client):
self.client = client
@commands.command()
async def die(self, ctx):
await ctx.bot.logout()
@commands.command()
async def clear(self, ctx, amount=10):
await ctx.channel.purge(limit=amount)
@clear.error
async def clear_error(self, ctx, error):
if isinstance(error, commands.BadArgument):
await ctx.send("Sorry, please enter an integer amount of lines to clear between 1 and 100")
else:
await ctx.send("There was an error, please try again!")
@commands.Cog.listener()
async def on_command_error(self, ctx, error):
if isinstance(error, commands.CommandNotFound):
await ctx.send("Sorry, there are no commands by that name")
def setup(client):
client.add_cog(BasicFunctions(client))