Python Discord botunda Kuyruk Otomasyonu

0

Soru

Bu benim sahip olduğum kod:

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

Her sunucu için ayrı bir kuyruk oluşturabilir ve komutla şarkı ekleyebilirim:

-aq song_name

örnek sıra:

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

Sıradaki şarkıları şu komutla çalabilirim:

-pq 0 or -pq 1 or -pq 2

Ancak sorun şu ki, bot yalnızca bir şarkıyı çalıyor ve bittikten sonra duruyor ve botun geçerli şarkı bittikten sonra bir sonraki şarkıyı çalmasını ve sıradaki son şarkı çalınana kadar devam etmesini istiyorum.

Bu konuda bana yardım edin....

Şimdiden Teşekkürler!!!

2
0

İlk olarak, sözlüğünüz ({0: 'abcdefu', 1: 'stereo hearts', 2: 'shivers'}) anahtarlar temelde sadece indeksler olduğu için gerçekten sadece bir liste olabilir.

İkincisi, ses girişi ile ilgili herhangi bir deneyimim yok discord.py ama senin gibi görünüyor. pq işlev aslında bir sonraki şarkıya gitmez. Bu çağırır transformer bir kez işlev gör ve bu kadar. Gerçekten yapmanız gereken tek şey kuyrukta dolaşmak ve her şarkıyı çalmak gibi görünüyor. İşte yardımcı olabilecek bazı psuedocode:

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

Yükümlülüğünü yerine getirmemek number=0 numara belirtilmemişse tüm sıranın oynatılmasına izin verir.

2021-11-23 18:41:58

Merhaba, Öncelikle, bu kadar geç cevap verdiğim için özür dilerim, Dizüstü bilgisayar bozuldu. Her neyse, bunu daha önce yapmayı denedim. Sorun şu ki, döngü ilk şarkının bitmesini beklemeyecek, ilk şarkı çalmaya devam ederken yineleyiciyi artırıyor, bu da SESİN ZATEN çaldığını söyleyen bir hata veriyor.
xBatmanx

Ah Tamam anlıyorum. Bir parametre var play çağrılan işlev after(discordpy.readthedocs.io/en/latest/...). Hata işleme amaçlıdır, ancak bir şarkıyı tekrarlamak veya başka bir şarkıyı çalmak için yaygın olarak kullanıldığı görülmektedir. Ayrıca check out Bu yazı. Kullanmak için gerçekten basit bir yol gösterir after durumunuza uyan parametre
Roopesh-J

Evet, aslında o gece anladım!. Yardım etmek için çaba gösterdiğiniz için teşekkürler! Gerçekten takdir.
xBatmanx

En iyi cevabı

0

Sorunumu çözmek için bu kodu uyguladım ve işe yarıyor.

Transformer işlevine bir sözlük olan kuyruğumu ve varsayılan olarak 0'a (sıranın baştan oynatılması için) varsayılan bir sayıyı geçtim.

Ve kullanarak after parametre oynatma işlevinde, işlevi çağırmaya devam ettim ve sıranın uzunluğundan daha az olduğu sürece numarayı yinelemeye devam ettim.

Auto-sıradaki şarkı çalıyor.

Bu kodun çalıştığını biliyorum, ancak herhangi bir iyileştirme yapılabilirse önerilere açığı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())

Teşekkürler!.

2021-12-03 06:39:41

Diğer dillerde

Bu sayfa diğer dillerde

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