【问题标题】:Python discord bot leave voice channelPython discord bot 离开语音频道
【发布时间】:2020-04-12 07:15:58
【问题描述】:

我已经让机器人加入我的语音服务器,如下所示

 if message.content.startswith("?join"):
    channel = message.author.voice.channel
    await channel.connect()
    await message.channel.send('bot joined')

但我不能让机器人离开频道.. 我该如何编写代码来做到这一点? 和有什么区别

@bot.event
 async def on_message(message):
 if message.content.startswith('~'):

@bot.command()
async def ~(ctx):

【问题讨论】:

    标签: python discord.py


    【解决方案1】:

    您可以通过两种方式执行这两个命令(加入和离开频道命令),一种是使用 on_message,另一种是使用@bot.commands。最好使用 bot.command 而不是 on_message 作为命令,因为 bot.commands 具有更多功能,而且我认为它是为命令构建的,所以速度很快。因此,我将使用 bot.command 重写您的两个命令,并在此处使用 on_message 以防您不想使用 bot.command。 根据您的消息,我假设 ? 是您的前缀

    使用on_message

    @bot.event
    async def on_message(message):
        if (message.content.startswith('?join')):
            if (message.author.voice): # If the person is in a channel
                channel = message.author.voice.channel
                await channel.connect()
                await message.channel.send('Bot joined')
            else: #But is (s)he isn't in a voice channel
                await message.channel.send("You must be in a voice channel first so I can join it.")
    
        elif message.content.startswith('?~'): # Saying ?~ will make bot leave channel
            if (message.guild.voice_client): # If the bot is in a voice channel 
                await message.guild.voice_client.disconnect() # Leave the channel
                await message.channel.send('Bot left')
            else: # But if it isn't
                await message.channel.send("I'm not in a voice channel, use the join command to make me join")
        await bot.process_commands(message) # Always put this at the bottom of on_message to make commands work properly
    

    使用bot.command

    @bot.command()
    async def join(ctx):
        if (ctx.author.voice): # If the person is in a channel
            channel = ctx.author.voice.channel
            await channel.connect()
            await ctx.send('Bot joined')
        else: #But is (s)he isn't in a voice channel
            await ctx.send("You must be in a voice channel first so I can join it.")
    
    @bot.command(name = ["~"])
    async def leave(ctx): # Note: ?leave won't work, only ?~ will work unless you change  `name = ["~"]` to `aliases = ["~"]` so both can work.
        if (ctx.voice_client): # If the bot is in a voice channel 
            await ctx.guild.voice_client.disconnect() # Leave the channel
            await ctx.send('Bot left')
        else: # But if it isn't
            await ctx.send("I'm not in a voice channel, use the join command to make me join")
    
    

    【讨论】:

      【解决方案2】:

      保存频道连接,以便稍后断开连接。

      voice = None
      ...
          if message.content.startswith("?join"):
              channel = message.author.voice.channel
              global voice = await channel.connect()
              await message.channel.send('bot joined')
          elif message.content.startswith("?join"):
              await self.voice.disconnect()
      

      无论如何,请尝试使用 discord.ext.commands 扩展名。它使所有涉及命令的事情变得更容易。我还建议使用 cogs (example),因为您可以创建一个包含所有与语音相关的类,并且不需要全局变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 2021-01-05
        • 2020-04-28
        • 2020-11-04
        • 2022-01-26
        • 2020-11-03
        • 2020-07-14
        • 2021-04-24
        相关资源
        最近更新 更多