python Discord.py ()导致线程挂起

hrirmatl  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(90)

我尝试用python写一个简单的discord bot。我希望bot能够加入一个语音频道,并且不断地重复一个mp3文件。我首先尝试在on_ready()函数中使用while循环,这有一个可以理解的坏结果。我现在尝试使用一个线程来运行与主线程分开的循环,但是discord.py的函数使用async/await,所以我不得不(很糟糕地)即兴发挥。

import asyncio
import threading

import discord
from discord import app_commands

intents = discord.Intents.all()
client = discord.Client(intents=intents)
discord.Permissions.manage_nicknames = True
tree = app_commands.CommandTree(client)

def targeter():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(play_sounds())
    loop.close()

async def play_sounds():
    for channel in client.guilds[1].channels:
        if str(channel.type) == "voice":
            print("started")
            player_channel = await channel.connect()
            print("done")

@client.event
async def on_ready():
    await tree.sync()
    threading.Thread(target=targeter).start()

client.run("token")

当我运行这个线程时,它到达我引入等待的discord.VoiceChannel.connect()函数的那一行并挂起。其余的命令工作正常,只是那个线程。正常运行时,connect()命令通常在几毫秒内返回一个VoiceClient。这是否与我试图跨线程运行函数有关?如果是这样,是否有我没有看到的更好的解决方案?

>>> started
8fq7wneg

8fq7wneg1#

为什么要使用线程呢?看看tasks,创建一个每分钟运行一次的任务;让它加入VC,如果它不在它(又名第一次运行),然后让它检查这首歌仍然运行/播放。
看一下here如何创建一个player,将播放器对象保存在任务中,然后当任务循环运行时,你可以执行player.is_done()来检查它是否还在播放--然后再次开始播放歌曲。

相关问题