Cola de Automatización en Python Discordia bot

0

Pregunta

Este es el código que tengo:

@commands.command(pass_context=True, aliases= ["aq"])
async def add_queue(self, ctx, *, url):
  a = ctx.message.guild.id
  b = servers[a]
  global queue
  try: 
    b[len(b)] = url 
    user = ctx.message.author.mention
    await ctx.send(f'``{url}`` was added to the queue by {user}!')
  except:
    await ctx.send(f"Couldnt add {url} to the queue!")

@commands.command(pass_context=True, aliases= ["qp"], case_insensitive=True)
async def pq(self,ctx, number):
  a = ctx.message.guild.id
  b = servers[a]
  if int(number) in b:
    source = b[int(number)]
    self.cur_song_id = int(number)
    await ctx.send(f"**Now Playing:** {source}")
    await self.transformer(ctx, source)
    
async def transformer(self,ctx, url):
  player = await YTDLSource.from_url(url, loop=self.bot.loop, stream=True)
  if not ctx.message.author.voice:
    await ctx.send("You are not connected to a voice channel!")
    return
  elif ctx.voice_client and ctx.voice_client.is_connected():
    print('Already connected to voice')
    pass
  else:
    channel = ctx.message.author.voice.channel
    await ctx.send(f'Connected to ``{channel}``')
    await channel.connect()
  ctx.voice_client.play(player)

Puedo crear una línea separada para cada servidor y agregar canciones a la misma mediante el comando:

-aq song_name

ejemplo de la cola:

Your current queue is {0: 'abcdefu', 1: 'stereo hearts', 2: 'shivers'}

Puedo reproducir las canciones en la cola con el comando:

-pq 0 or -pq 1 or -pq 2

Pero el problema es que el bot sólo se reproduce una canción y se detiene después de que se termina, y quiero que el bot para reproducir la siguiente canción después de la canción actual acabados y siga hasta la última canción en la cola se juega.

Por favor, ayúdame con esto....

Gracias De Antemano!!!

2
0

En primer lugar, en su diccionario ({0: 'abcdefu', 1: 'stereo hearts', 2: 'shivers'}realmente puede ser simplemente una lista, ya que las teclas son básicamente los índices.

En segundo lugar, no tengo ninguna experiencia con audio en discord.py pero parece que su pq función en realidad no ir a la siguiente canción. Llama a la transformer la función de una vez y eso es todo. Parece que realmente todo lo que tienes que hacer es recorrer la cola y la reproducción de cada canción. Aquí hay algunos psuedocode que podrían ser de ayuda:

@commands.command()
async def play_queue(self,ctx,number=0):
  for num in range(number,len(queue)):
    song = queue[num]
    # play the song

El impago de number=0 permita que toda la cola para jugar si no se ha especificado.

2021-11-23 18:41:58

Hola, en Primer lugar, lo siento por responder tan tarde, ordenador Portátil se rompió. De todos modos, he intentado hacer eso antes. El problema es que el bucle no espere a que la primera canción hasta el final, es sólo aumenta el iterador mientras que la primera canción sigue jugando, lo que da un error que dice, AUDIO YA ESTÁ JUGANDO.
xBatmanx

Ah ok entiendo. Hay un parámetro de la play la función de llamada after(discordpy.readthedocs.io/es/última/...). Es la intención para el control de errores, pero parece que es comúnmente usados para repetir una canción o un juego a otro. También echa un vistazo a este post. Se muestra una manera muy sencilla a utilizar el after parámetro que se adapte a su situación
Roopesh-J

Sí, de hecho, me lo imaginé más tarde esa noche!. Gracias por poner en los esfuerzos para ayudar! Realmente lo aprecio.
xBatmanx

Mejor respuesta

0

Entonces, para solucionar mi problema, he implementado este código y funciona.

Me pasa a mi cola, que es un diccionario, transformador de la función, y un número que el valor predeterminado es 0 (por la cola para jugar desde el inicio).

Y el uso de after parámetro en la función de reproducción, seguí llamando a la función y se mantiene la iteración el número tan largo como lo es menos que la longitud de la cola.

Se auto-reproduce las canciones en la cola.

Sé que este código funciona, pero, si alguna de las mejoras que se pueden hacer, estoy abierto a sugerencias.

async def transformer(self,ctx, number, que):
  player = await YTDLSource.from_url(que[number], loop=self.bot.loop,stream=True)
  await ctx.send(f"**Now Playing:** {que[number]}")
  ctx.voice_client.play(player, after=lambda e: asyncio.run_coroutine_threadsafe(self.transformer(ctx,number+1 , que),self.bot.loop) if number < len(que) else ctx.voice_client.pause())

Gracias!.

2021-12-03 06:39:41

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................