Fila de Automação em Python Discórdia bot

0

Pergunta

Este é o código que eu tenho:

@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)

Eu posso criar uma fila separada para cada servidor e adicionar músicas a ele o comando:

-aq song_name

exemplo de fila:

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

Eu posso tocar as músicas na fila com o comando:

-pq 0 or -pq 1 or -pq 2

Mas o problema é que o bot só toca uma música e pára depois de terminar, e eu quero que o bot irá reproduzir a próxima música após música actual termina, e continue indo até a última música da fila é jogado.

Por favor, ajude-me com isso....

Obrigado Antecipadamente!!!

2
0

Em primeiro lugar, o seu dicionário ({0: 'abcdefu', 1: 'stereo hearts', 2: 'shivers'}) realmente pode ser apenas uma lista já que as chaves são, basicamente, os índices.

Em segundo lugar, eu não tenho nenhuma experiência com áudio em discord.py mas parece que o seu pq função, na verdade, não ir para a próxima música. Ele chama a transformer função de uma vez e pronto. Parece que realmente tudo que você tem a fazer é apenas um loop através da fila e tocar cada música. Aqui estão algumas psuedocode que podem ser úteis:

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

Incumprimento number=0 permita que a fila inteira para jogar, se nenhum número não foi especificado.

2021-11-23 18:41:58

Oi, em Primeiro lugar, desculpe por responder tão tarde, Laptop quebrou. De qualquer forma, eu tentei fazer isso antes. O problema é que o ciclo não vai esperar para a primeira música para terminar, apenas incrementa o iterador enquanto a primeira música ainda está tocando, o que dá um erro que diz, o ÁUDIO JÁ ESTÁ JOGANDO.
xBatmanx

Ah, ok, eu entendo. Lá é um parâmetro de play função chamada after(discordpy.readthedocs.io/en/latest/...). Ele é destinado para o tratamento de erros, mas parece que é muito usado para repetir uma música ou jogar outro. Confira também este post. Ele mostra de uma forma muito simples para usar o after parâmetro que se adapta à sua situação
Roopesh-J

Sim, na verdade, eu descobri mais tarde que noite!. Obrigado por colocar em esforços para ajudar! Realmente aprecio isso.
xBatmanx

Melhor resposta

0

Assim, para resolver o meu problema, eu implementei este código e funciona.

Eu passei a minha fila que é um dicionário, a função de transformador, e um número que é padrão para 0 (para a fila para jogar desde o início).

E usando after parâmetro em função de reprodução, continuei chamando a função e mantido iteração o número como ele é menor que o comprimento da fila.

É auto-reproduz as músicas na fila.

Eu sei que este código funciona, mas, se houver, podem ser feitas melhorias, estou aberto a sugestões.

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())

Obrigado!.

2021-12-03 06:39:41

Em outros idiomas

Esta página está em outros idiomas

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