<p>Listener不是异步的,因此它将阻止<code>on_ready</code>中的事件循环,您需要在执行器中初始化侦听器,在这种情况下,我们可以使用默认的侦听器</p>
<p>以下是我为使这一部分正常工作所做的全部更改:</p>
<pre><code>def keyboard_listener():
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
@client.event
async def on_ready():
global GUILD
global CHANNELS
global VOICE_CHANNELS
global GUILD_ID
GUILD = client.get_guild(GUILD_ID)
CHANNELS = GUILD.channels
VOICE_CHANNELS = get_voice_channels()
print("bot ready")
loop.run_in_executor(None, keyboard_listener)
loop = asyncio.get_event_loop()
</code></pre>
<p>然后我用<code>loop.create_task</code>替换了所有的<code>asyncio.run</code></p>
<p>如果我的指示不清楚,我有一个有效的版本,请随时提问</p>
<p>从一个异步到另一个同步再到异步是相当糟糕的,但是它可以工作,所以我想它不是愚蠢的</p>
<p>我还稍微更改了<code>mute_all</code>和<code>unmute_all</code>,因为当前的实现只会在bot最初连接时影响通道中的语音用户。以下是我的更改示例:</p>
<pre><code>async def mute_all():
print("mute all")
for channel in client.get_guild(GUILD_ID).channels:
if not channel.type.name == "voice":
continue
for member in channel.members:
await member.edit(mute=True)
</code></pre>