当前位置: 首页 > 知识库问答 >
问题:

Discord音乐机器人-队列(Discord.py)

陈翰林
2023-03-14

我是一个初学者程序员(或者在我看来是这样),我需要帮助在音乐机器人中实现一个队列。

目前,只有当队列中有一首歌时,队列才能正常工作。如果有更多的歌曲,那么递归开始(在=wait serverQueue(语音,消息)之后从def play开始并等待play(queue.pop(0),语音,消息)从队列开始),并且所有歌曲只是跳过。

import discord
import nacl
import ffmpeg
from discord import FFmpegPCMAudio
from discord.utils import get
from youtube_dl import YoutubeDL

client = discord.Client()

async def join(message):
    ##Connect to channel
    connection = message.author.guild.voice_client
    idUserChannel = message.author.voice.channel.id
    idBotChannel = 0
    if connection:
        idBotChannel = client.voice_clients[0].channel.id
    if (connection) and (idBotChannel != idUserChannel) :
        await message.channel.send('**Moving to** ' + str(message.author.voice.channel))
        await connection.move_to(message.author.voice.channel)
    elif (idBotChannel != idUserChannel):
        await message.channel.send('**Connect to** ' + str(message.author.voice.channel))
        await message.author.voice.channel.connect()
        
async def play(video_link, voice, message):
    ##Playing songs
    ydl_opts = {'format': 'bestaudio', 'noplaylist':'True'}
    FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
    with YoutubeDL(ydl_opts) as ydl:
        info = ydl.extract_info(video_link, download = False)
    print(info.get('title'))
    URL = info['formats'][0]['url']
    print(URL)
    voice.play(FFmpegPCMAudio(URL, **FFMPEG_OPTIONS), after = await serverQueue(voice, message))
    voice.is_playing()
    await message.channel.send('**Now playing** - ' + info.get('title'))

async def skip(voice, message):
    ##Skip
    voice.stop()
    await serverQueue(voice, message)
    await message.channel.send('**Successfully skiped** - ' + info.get('title'))
    
##Queue
queue = []
async def serverQueue(voice, message):
    if queue != [] and not voice.is_playing():
        await play(queue.pop(0), voice, message)
        print('queue - ' + str(queue))

@client.event
async def on_message(message):
    if message.author == client.user:
        return
        
    if message.content.startswith('&' + 'join'):
        await join(message)
        
    ##Connect and play
    if message.content.startswith('&' + 'play'):
        await join(message)
        voice = get(client.voice_clients, guild = message.channel.guild)
        msg = message.content[1:].split()
        video_link = msg[1]
        if not voice.is_playing():
            await play(video_link, voice, message)
        else:
            await message.channel.send('Added to queue successfully')
            queue.append(video_link)

    ##Skip
    if message.content.startswith('&' + 'skip'):
        voice = get(client.voice_clients, guild = message.channel.guild)
        await skip(voice, message)

我试图以不同的方式解决这个问题,例如,引入了第二个变量,但这并没有带来成功。如果有任何帮助,我将不胜感激。

共有1个答案

傅博容
2023-03-14
async def play(video_link, voice, message):
    ##Воспроизведение песенок
    ydl_opts = {'format': 'bestaudio', 'noplaylist':'True'}
    FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
    with YoutubeDL(ydl_opts) as ydl:
        info = ydl.extract_info(video_link, download = False)
    print(info.get('title'))
    URL = info['formats'][0]['url']
    voice.play(FFmpegPCMAudio(URL, **FFMPEG_OPTIONS), after = lambda e: myAfter(voice, message))
    voice.is_playing()
    await message.channel.send('**Сейчас играет** - ' + info.get('title'))

async def myAfter(voice, message):
    coro = await musicQueue(voice, message)
    asyncio.run_coroutine_threadsafe(coro).result()
 类似资料:
  • 我想制作一个可分页队列命令,这样我就可以用反应控制整个队列。但是,每当我运行命令时,总是会出现错误。因此,我希望每当消息作者对⏹" 反应。这是我的密码: 但是,即使在机器人对停止反应作出反应时删除它。我从bot收到一条消息,说发生了一个错误。我无法理解为什么,也无法理解如何解决它。你能帮我吗?提前谢谢!

  • 我在创建一个基本的discord机器人(用于播放音乐)时遇到了一些错误。我主要依赖于文档——我想我复制并粘贴了discord中的某些代码行。“断章取义”的js文档示例。但我不知道它们可能是什么,因为我对编程还是很陌生。 我安装并导入了所有必要的依赖项,所以这不是问题所在。我的机器人工作正常(收听和回复MSG)。 这是与音乐功能相关的代码 这是我得到的错误: 难道是: 机器人需要先进入通道?(这意味

  • 我刚开始用node学习javascript。js和我正在尝试创建一个音乐机器人,我已经设置了命令处理程序和所有东西,但是,当我尝试运行play命令时,我一直会遇到这个错误 错误:未找到FFmpeg/avconv!在功能上。getInfo(C:\Users\johnd\OneDrive\Desktop\discordBot\node\u modules\prism media\src\core\FF

  • 尝试制作一个简单的音乐机器人,只播放一个链接,但它不连接到语音通道,因此不会出现任何错误,所以我只能放入所有代码。这是我的主要内容。js公司 这是我的音乐机器人命令,我认为它是正确的,因为我已经在这里请求了一些人的帮助。

  • 当我在discord内部运行以下脚本(“cmd中的node musicbot.js”)和“!play ytlink”时,bot加入语音通道,并在控制台中记录命令和链接。然而,音乐并没有开始播放。我安装了ffmpeg、ytdl核心和discord。js。 有人能帮我吗?我不知道是哪一部分搞砸了。

  • 有没有可能让我的不和谐机器人发送消息,而不必在不和谐中键入命令?相反,我想从我的应用程序内部触发它。 上面的代码给出了一个属性错误:'NoneType'对象没有属性'send'