Coda di Automazione in Python Discordia bot

0

Domanda

Questo è il codice che ho:

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

Posso creare una coda per ogni server e aggiungere brani da il comando:

-aq song_name

esempio di coda:

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

Posso riprodurre i brani in coda con il comando:

-pq 0 or -pq 1 or -pq 2

Ma il problema è che il bot si gioca solo una canzone e si ferma dopo aver finito, e voglio che il bot per riprodurre il brano successivo, dopo il brano corrente finiture e proseguire fino a quando l'ultimo brano in coda è giocato.

Si prega di aiutare me con questo....

Grazie In Anticipo!!!!!

2
0

In primo luogo, il dizionario ({0: 'abcdefu', 1: 'stereo hearts', 2: 'shivers'}davvero può essere solo un elenco dal momento che le chiavi sono fondamentalmente solo gli indici.

In secondo luogo, non ho alcuna esperienza con l'audio in discord.py ma sembra che la tua pq funzione in realtà non passare al brano successivo. Chiama il transformer funzione una sola volta e thats it. Sembra che davvero tutto quello che dovete fare è solo loop attraverso la coda e giocare ogni canzone. Ecco alcune psuedocode che potrebbe essere utile:

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

Inadempienti number=0 consentirebbe l'intera coda per giocare, se nessun numero è stato specificato.

2021-11-23 18:41:58

Ciao, Prima di tutto, scusa per la risposta così in ritardo, computer Portatile si è rotto. Comunque, ho provato a farlo prima. Il problema è che il ciclo di solito attendere la prima canzone per finire, solo che incrementi l'iteratore mentre la prima canzone è ancora in riproduzione, che dà un errore che dice che l'AUDIO È GIÀ in RIPRODUZIONE.
xBatmanx

Ah ok ho capito. C'è un parametro di play funzione chiamata after(discordpy.readthedocs.io/it/ultime/...). Esso è destinato per la gestione degli errori, ma sembra che è utilizzato comunemente per ripetere un brano o di giocare un altro. Verificate anche questo post. Mostra davvero un modo semplice per utilizzare il after il parametro che misura la vostra situazione
Roopesh-J

Sì, in realtà ho capito più tardi, quella notte!. Grazie per mettere in sforzi per aiutare! Davvero apprezzare.
xBatmanx

Migliore risposta

0

Così, per risolvere il mio problema, ho implementato questo codice e funziona.

Ho passato la mia coda che si tratta di un dizionario, di un trasformatore di funzione, e un numero che è di default a 0 (per la coda per giocare dall'inizio).

E l'utilizzo di after parametro in funzione del gioco, ho continuato a chiamare la funzione e tenuto iterazione il numero è minore della lunghezza della coda.

Auto-riproduce i brani in coda.

So che questo codice funziona, ma, se alcuni miglioramenti possono essere fatti, sono aperto a suggerimenti.

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

Grazie!.

2021-12-03 06:39:41

In altre lingue

Questa pagina è in altre lingue

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