我尝试用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
1条答案
按热度按时间8fq7wneg1#
为什么要使用线程呢?看看
tasks
,创建一个每分钟运行一次的任务;让它加入VC,如果它不在它(又名第一次运行),然后让它检查这首歌仍然运行/播放。看一下here如何创建一个
player
,将播放器对象保存在任务中,然后当任务循环运行时,你可以执行player.is_done()
来检查它是否还在播放--然后再次开始播放歌曲。