Fronty Automatizace v Pythonu Svár bot

0

Otázka

To je kód, který mám:

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

Mohu vytvořit samostatné fronty pro každý server a přidat skladby do něj příkaz:

-aq song_name

příklad fronty:

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

Mohu-li přehrávat skladby ve frontě s příkazem:

-pq 0 or -pq 1 or -pq 2

Ale problém je, že bot hraje jen jednu písničku a zastaví se po dokončení, a chci bot hrát další skladbu po aktuální skladby povrchové úpravy a pokračovat až do poslední skladby ve frontě se hraje.

Prosím, pomozte mi s tím....

Díky Předem!!!

2
0

Za prvé, váš slovník ({0: 'abcdefu', 1: 'stereo hearts', 2: 'shivers'}) opravdu může být jen seznam, protože klíče jsou v podstatě jen indexy.

Za druhé, nemám žádné zkušenosti s audio v discord.py ale vypadá to, že vaše pq funkce není ve skutečnosti jít na další skladbu. To volá transformer funkce jednou a je to. Zdá se, že opravdu vše, co musíte udělat, je jen smyčka přes fronty a hrát každou píseň. Zde je několik psuedocode, které by mohly být užitečné:

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

Prodlení number=0 umožní celé fronty hrát, pokud žádné číslo bylo uvedeno.

2021-11-23 18:41:58

Ahoj, Nejdřív se omlouvám za odpověď tak pozdě, Notebook rozbil. Každopádně, zkoušel jsem to dělala i před tím. Problém je, že smyčka zvyklý čekat na první píseň dokončit, jen to zvýší iterator zatímco první píseň je stále ještě hraje, což dává chybu, která říká, AUDIO JE JIŽ HRAJE.
xBatmanx

Ah ok chápu. Tam je parametr play funkce tzv. after(discordpy.readthedocs.io/cs/nejnovější/...). Je určen pro zpracování chyb, ale zdá se, že to je běžně používán buď opakovat skladbu nebo hrát jinou. Také podívejte se na tento post. To ukazuje na opravdu jednoduchý způsob, jak používat after parametr, který odpovídá vaší situaci
Roopesh-J

Ano, vlastně jsem na to přišel později v noci!. Díky za uvedení v úsilí, aby pomohl! Opravdu si toho vážím.
xBatmanx

Nejlepší odpověď

0

Tak, jak vyřešit můj problém, jsem implementoval tento kód a funguje.

Prošel jsem můj fronty, což je slovník, transformátor funkci, a číslo, které je implicitně 0 (pro fronty hrát od začátku).

A pomocí after parametr ve funkci přehrávání, pořád jsem volala funkce a držel iterace číslo, pokud je méně než je délka fronty.

To auto hraje skladby ve frontě.

Vím, že tento kód funguje, ale, pokud vůbec lze provést zlepšení, jsem otevřený návrhům.

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

Díky!!!.

2021-12-03 06:39:41

V jiných jazycích

Tato stránka je v jiných jazycích

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