discord.py bot 只响应一个命令

Posted

技术标签:

【中文标题】discord.py bot 只响应一个命令【英文标题】:discord.py bot only responds to one command 【发布时间】:2021-04-09 00:42:04 【问题描述】:

它只在给定时间显示其中一个命令。 如果我写!hi!bye 它不会工作,但如果我写!sing 它会输出la la la。 如果我切换它之前的角色,它会变成 !hi!sing 不工作 但是!bye工作和说Goodbye!

import os

client = discord.Client()

@client.event 
async def on_ready():
  print('We have logged in as 0.user'
  .format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  if message.content.startswith('!hi'):
    await message.channel.send('Hello!')

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  if message.content.startswith('!bye'):
    await message.channel.send('Goodbye Friend!')

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  if message.content.startswith('!sing'):
    await message.channel.send('la la la')

client.run(os.getenv('TOKEN'))```

【问题讨论】:

【参考方案1】:

这是使用commands.Bot()的完美示例:

from discord.ext import commands

bot = commands.Bot(command_prefix="!")

@bot.command()
async def hi(ctx):
    await ctx.send("Hello!")

@bot.command()
async def sing(ctx):
    await ctx.send("la la la!")

@bot.command()
async def bye(ctx):
    await ctx.send("Goodbye friend!")

Bot() 继承自 Client(),在处理命令时提供了更多功能!


参考资料:

commands.Bot()

【讨论】:

【参考方案2】:

只有一个事件,不要为每个命令都创建一个新事件。

@client.event
async def on_message(message):
  if message.author == client.user:
    return
  elif message.content.startswith('!sing'):
    await message.channel.send('La La la.')
  elif message.content.startswith('!hi'):
    await message.channel.send('Hello!')

【讨论】:

【参考方案3】:

不要重复 on_message 事件。只有一个并将 if 语句放入这一事件中。

【讨论】:

【参考方案4】:

您尝试使用多个事件,而不是在一个事件中使用所有事件,如下所示:

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  if message.content.startswith('!hi'):
    await message.channel.send('Hello!')
 
  elif message.content.startswith('!bye'):
    await message.channel.send('Goodbye Friend!')

  elif message.content.startswith('!sing'):
    await message.channel.send('la la la')

另外,请确保在其他事件中使用 elif 而不是 if。 应该这样做。

【讨论】:

以上是关于discord.py bot 只响应一个命令的主要内容,如果未能解决你的问题,请参考以下文章

Discord Bot 响应短语(Discord.py 重写)

Discord.py(重写)静音命令总是返回相同的响应

discord py,ctx.guild.members,只返回bot

在 Discord (discord.py bot) 中仅从 1 个频道发送消息

Bot 未检测到服务器成员 (Discord.py)

Discord.py - 如果命令被编辑,让我的机器人编辑他的响应