如何修复 Discord.py 不为语音命令运行我的异步功能?

Posted

技术标签:

【中文标题】如何修复 Discord.py 不为语音命令运行我的异步功能?【英文标题】:How to fix Discord.py not running my asyncio function for a voice command? 【发布时间】:2019-08-22 01:30:47 【问题描述】:

在我的 discord.py 机器人中,我正在尝试创建一个函数来运行机器人加入语音频道、播放音频文件然后离开所必需的代码。我正在这样做,所以我不必为我想要制作的每个语音命令复制和粘贴相同的代码。但是,我无法运行该函数。

我尝试过为我的函数使用 async def 和 await 函数,但它似乎不起作用。我一无所知,因为当我运行我的代码时,我没有收到任何错误。

async def voiceCommand(ctx, message, file, time, cmd):
    channel = ctx.message.author.voice.voice_channel
    if channel == None: # If the user who sent the voice command isn't in a voice channel.
        await client.say('You are not in a voice channel, therefore I cannot run this command.')
        return
    else: # If the user is in a voice channel
        print(executed(cmd, message.author))
        voice = await client.join_voice_channel(channel)
        server = ctx.message.server
        voice_client = client.voice_client_in(server)
        player = voice.create_ffmpeg_player(file) # Uses ffmpeg to create a player, however it makes a pop up when it runs.
        player.start()
        time.sleep(float(time))
        await voice_client.disconnect() # Disconnects WingBot from the voice channel.

@client.command(pass_context = True)
async def bigbruh(ctx):
    voiceCommand(ctx, message, 'bigbruh.mp3', '0.5', 'bigbruh')

这些是我试图用来运行该函数的代码的 sn-ps。

完整源代码在这里:https://pastebin.com/bv86jSvk

【问题讨论】:

【参考方案1】:

你可以使用这几个方法在python中运行异步函数

async def print_id():
    print(bot.user.id)

@bot.event
async def on_ready():
    bot.loop.create_task(print_id()) #this will run the print_id function
    print(bot.user.name)

async def not_me(msg):
    await bot.send_message(msg.message.channel,"You are not me")

async def greet():
    print("Hi")

@bot.command(pass_context=True)
async def me(msg):
    if msg.message.author.id == '123123':
        await bot.say("Hello there") #await is used to run async function inside another async function

    else:
        await not_me(msg)


#To run the async function without it being inside another async function you have to use this method or something similar to it
import asyncio

# asyncio.get_event_loop().run_until_complete(the_function_name())
#in this case it's `greet`
asyncio.get_event_loop().run_until_complete(greet())

【讨论】:

我有点明白你在说什么。但是,我完全不知道如何将它应用到我的代码中。在 async def bigbruh(ctx) 下,通过使用 loop.create_task(),当我在不和谐中调用 .bigbruh 时,它仍然不运行我的 voiceCommand 函数。为了测试这个函数,我在 voiceCommand 函数的顶部放了一个 print 语句,但是当它被不和谐地调用时,什么也没有发生。 函数名前加await就可以了 这样的? await client.loop.create_task(voiceCommand(ctx, message, 'bigbruh.mp3', '0.5', 'bigbruh')) (这似乎不起作用,这是我尝试过的第一件事。 )。 我已经编辑了答案,如果有答案请告诉我。 这回答了它。我研究了将 bot.event 用于我的语音命令,并消除了我的 bot.command 功能。感谢您深入了解 bot.event 和 bot.command,因为它确实显示了我的代码中的问题。

以上是关于如何修复 Discord.py 不为语音命令运行我的异步功能?的主要内容,如果未能解决你的问题,请参考以下文章

(Discord.py) 如何锁定和解锁语音通道

如何查看特定用户在语音频道上花费的时间?[Discord.py]

如何在 discord.py 机器人加入语音通道之间添加暂停?

如何使用 Discord.py Cogs 使 Discord Bot 加入语音频道并在成员加入频道时播放音频文件

如何将 discord.py 帮助命令放入嵌入中?

如何使用嵌入 webhook 的 discord.py 修复此错误