【发布时间】:2020-12-31 17:18:59
【问题描述】:
我已经尝试解决这个问题 2 天了,阅读了 StackOverflow 中的 50 个问题和大量有关 Python 的文档。我不知道还能尝试什么。
我的代码
import discord
import re
from datetime import datetime
import mysql.connector
from discord.ext import commands, tasks
from discord.utils import get
import atexit
from pynput import keyboard
import asyncio
from asgiref.sync import async_to_sync, sync_to_async
# The currently active modifiers
current = set()
# The key combination to check
COMBINATIONS_MUTE = [
{keyboard.Key.shift, keyboard.KeyCode(char='a')},
{keyboard.Key.shift, keyboard.KeyCode(char='A')}
]
COMBINATIONS_UNMUTE = [
{keyboard.Key.shift, keyboard.KeyCode(char='b')},
{keyboard.Key.shift, keyboard.KeyCode(char='B')}
]
GUILD_ID=guild_id
CHANNELS = ""
GUILD = ""
VOICE_CHANNEL = ""
client = commands.Bot(command_prefix = ".")
def get_channel(name):
global CHANNELS
for channel in CHANNELS:
if (channel.name == name) and (channel.type.name == "voice"):
return channel
return False
def get_voice_channels():
global CHANNELS
channels = []
for channel in CHANNELS:
if (channel.type.name == "voice"):
channels.append(channel)
return channels
async def mute_all():
global VOICE_CHANNELS
print("mute all")
for channel in VOICE_CHANNELS:
for member in channel.members:
await member.edit(mute=True)
async def unmute_all():
global VOICE_CHANNELS
print("unmute all")
for channel in VOICE_CHANNELS:
for member in channel.members:
await member.edit(mute=False)
def on_press(key):
if any([key in COMBO for COMBO in COMBINATIONS_MUTE]) and not key in current:
current.add(key)
if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS_MUTE):
asyncio.run(mute_all())
elif any([key in COMBO for COMBO in COMBINATIONS_UNMUTE]):
current.add(key)
if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS_UNMUTE):
asyncio.run(unmute_all())
def on_release(key):
if any([key in COMBO for COMBO in COMBINATIONS_MUTE]):
current.remove(key)
elif any([key in COMBO for COMBO in COMBINATIONS_UNMUTE]):
current.remove(key)
@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 = asyncio.get_event_loop()
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
client.run('token')
基本上应该做的是:
- 当我按下 Shift+A 时,每个语音通道中的所有人都静音。
- 当我按 Shitf+B 时,将每个语音频道中的所有人取消静音。
问题是我需要等待member.edit(),但我不能,因为我不能等待mute_all(),也不能等待unmute_all(),因为on_press(key) 不是异步的,我不能让它异步,因为keyboard_listener 不会让我这么做的。
我尝试过的(没有成功)
- 在
member.edit()上使用asyncio.run()。 - 在
mute_all()上使用asyncio.run()。 - 使
on_press(key)异步。 - 在
member.edit()上使用async_to_sync()。 - 在
mute_all()上使用async_to_sync()。
我不知道还能尝试什么。
【问题讨论】:
标签: python discord.py