voice_client 和 url 突然在 discord.py 机器人中不起作用
Posted
技术标签:
【中文标题】voice_client 和 url 突然在 discord.py 机器人中不起作用【英文标题】:voice_client and url suddenly not working in discord.py bot 【发布时间】:2021-08-05 06:18:05 【问题描述】:我一直在编写一个不和谐的音乐机器人,我的简单版本没有任何错误!现在我想添加队列功能,我设计了它以便 replit.com 可以处理它。但现在我有错误说:
Ignoring exception in command play:
Traceback (most recent call last):
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "main.py", line 69, in _play
vc = ctx.voice_client
AttributeError: 'str' object has no attribute 'voice_client'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 939, in invoke
await ctx.command.invoke(ctx)
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 863, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 94, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'voice_client'
一般来说,像“is_paused”或“is_playing”这样的不和谐播放变量都不再起作用(得到相同的AttributeError。)!
这是我的代码:
queue_urls = []
class Music(commands.Cog):
async def check_for_play(self, ctx):
if len(queue_urls) > 0: #if there still are more items in the queue...
await ctx.invoke(self.real_play) #...run the player again
async def real_play(self, ctx): #the player plays the song...
voice = discord.utils.get(bot.voice_clients, guild=ctx.guild)
url = queue_urls[0]
queue_urls.pop(0)
with youtube_dl.YoutubeDL(ytdlopts) as ydl:
info = ydl.extract_info(url, download=False)
URL_NEXT = info['formats'][0]['url']
voice.play(discord.FFmpegPCMAudio(URL_NEXT, **ffmpegopts), after=lambda e: ctx.invoke(self.check_for_play)) #...and when the song is finished, should run the function check_for_play
@bot.command(name='play', aliases=['sing', 'p'])
async def _play(self, ctx): #the command...
vc = ctx.voice_client
if not vc.is_connected:
channel = ctx.author.voice.channel
await channel.connect()
url = ctx.message.content
url = ttourl(url)
queue_urls.append(url) #...adds the item to the queue...
voicec = ctx.voice_client
if not voicec.is_playing: #...and starts the player if its not already playing
await ctx.invoke(self.real_play)
【问题讨论】:
【参考方案1】:您遇到此错误是因为您的 cog 不完整且部分错误:
您没有声明__init__
构造函数,如果您想访问 cog 中的 bot
变量,这是必需的:
class Music(commands.Cog):
def __init__(self, bot):
self.bot = bot
您需要将每个 bot
引用替换为 self.bot
,如下所示:
voice = discord.utils.get(self.bot.voice_clients, guild=ctx.guild)
在 cog 内部,您需要将 @bot.command()
替换为 @commands.command()
:
@commands.command(name='play', aliases=['sing', 'p'])
async def _play(self, ctx):
【讨论】:
那么前缀是什么?当我键入“!play ...”时,找不到该命令。当我输入“play ...”时,什么也没有发生??我不知道在这里做什么...... 您的前缀是您在声明机器人时设置的前缀 (bot = commands.Bot(...)
)。你应该看看cogs 是如何产生的。【参考方案2】:
我知道你在这里设计了一个 cog,但是你拥有的命令装饰器对于运行一个 cog 是不正确的。装饰器从client.command()
更改为commands.command()
。当您说这在您的简化版本中有效时,我假设您的意思是单文件程序。
【讨论】:
我真的不明白你的意思。我已经用前缀声明了“bot”,我唯一改变的是将 voice.play 移动到另一个异步函数中。 好吧,所以我一开始以为你只是拿走了你的部分代码并发送了它,但现在很明显你不知道如何制作一个 cog (discordpy.readthedocs.io/en/stable/ext/commands/cogs.html)。 别担心,我现在知道了。但显然机器人没有运行 real_play 函数......我是否输入了错误的语法或什么(没有错误消息)? 好吧,ctx.invoke
更多地用于在脚本中调用命令,而 real_player
函数不是命令。我建议在你的 cog 类之上使用那些不需要装饰器的函数。您可以使用await real_play(self.client, ctx)
之类的方式给他们打电话。以上是关于voice_client 和 url 突然在 discord.py 机器人中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:“FFmpegPCMAudio”对象没有属性“_process”
markdown Merubah域名(URL)instalasi cms berbasis wordpress di共享主机杨menggunakan控制面板cPanel