Python discord bot 离开语音频道

2022-01-15 00:00:00 python discord.py

问题描述

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

I've made bot to join my voice server like below

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

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

but i can't make bot to leave the channel.. how can i code to do it?? and what is the difference between

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

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


解决方案

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

You can do both of these commands (the join and leave channel commands) in two ways, one is by using on_message, and the other is by using @bot.commands. It's is best to use bot.command instead of on_message for commands as bot.commands has more features plus I think it's fast after all it was built for commands. So I'll rewrite both of your commands using bot.command and also put using on_message there incase you don't want to use bot.command. According to your message, I'm assuming ? is your prefix

@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")

相关文章