Coada de Automatizare în Python Discordie bot

0

Problema

Acesta este codul care trebuie:

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

Nu pot crea o coadă separată pentru fiecare server și adăuga melodii de comanda:

-aq song_name

exemplu coadă:

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

Nu pot reda melodiile din coadă cu comanda:

-pq 0 or -pq 1 or -pq 2

Dar problema este că bot joacă doar un cântec și se oprește după ce se termină, și vreau bot-ul pentru a juca următorul cântec după cântec curent finisaje și continuă până la ultima melodie în coada de așteptare este jucat.

Te rog ajută-mă cu asta....

Multumesc Anticipat!!!

2
0

În primul rând, dicționarul ({0: 'abcdefu', 1: 'stereo hearts', 2: 'shivers'}) într-adevăr poate fi doar o listă de când cheile sunt, practic, doar indicii.

În al doilea rând, nu aveți nici o experiență cu audio in discord.py dar se pare ca dvs. pq funcția nu, de fapt, du-te la următoarea melodie. Se numește transformer funcția dată și asta e. Se pare că într-adevăr tot ce trebuie sa faci este doar bucla prin coada de așteptare și să se joace fiecare melodie. Aici este un psuedocode care ar putea fi utile:

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

Culpă number=0 ar permite pentru întreaga coadă pentru a juca, dacă nu a fost specificat numărul.

2021-11-23 18:41:58

Bună, în Primul rând, îmi pare rău pentru răspuns atât de târziu, Laptop stricat. Oricum, am încercat să fac asta înainte. Problema este ca bucla obiceiul așteptați pentru primul cântec pentru a termina, doar trepte iterator în timp ce prima melodie este încă joacă, care da o eroare care spune, AUDIO ESTE DEJA de JOC.
xBatmanx

Ah ok am inteles. Acolo este un parametru de play funcție numită after(discordpy.readthedocs.io/ro/cele mai recente/...). Acesta este destinat pentru eroare de manipulare, dar se pare că acesta este utilizat de obicei pentru a repeta o melodie sau pentru a juca un alt unul. De asemenea, a verifica afară acest post. Acesta arată un mod foarte simplu de a folosi after parametrul care se potrivește situației dvs.
Roopesh-J

Da, de fapt am dat seama mai târziu că noapte!. Vă mulțumim pentru a pune în eforturile de a ajuta! Într-adevăr aprecia.
xBatmanx

Cel mai bun răspuns

0

Deci, pentru a rezolva problema mea, am pus în aplicare acest cod și funcționează.

Mi-am trecut coadă, care este un dicționar, pentru funcția de transformator și un număr care este implicit 0 (pentru coadă pentru a juca de la început).

Și folosind after parametru în funcție de joc, am tot sunat funcție și păstrate iterarea numărul atâta timp cât aceasta este mai mică decât lungimea cozii de așteptare.

Se auto-redă melodiile în coada de așteptare.

Știu că acest cod funcționează, dar, dacă orice îmbunătățiri pot fi făcute, sunt deschis la sugestii.

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

Multumesc!.

2021-12-03 06:39:41

În alte limbi

Această pagină este în alte limbi

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