【问题标题】:Discord bot in Python - no commands are workingPython 中的 Discord 机器人 - 没有命令在工作
【发布时间】:2021-07-07 20:26:09
【问题描述】:

我想创建一个机器人来响应带有参数的命令。我已经让它响应消息中的字符串,但是当我尝试使命令工作时,机器人似乎根本没有反应。我研究了文档,花了很多精力试图在互联网上找到答案,但没有任何帮助。我的代码可能与 Internet 上其他人的代码完全相同,但机器人从不响应,同时仍在响应消息。我想知道关于命令应该如何工作,我是否缺少一些真正基本的东西。

我已经导入了正确的库,我使用了许多人在 Internet 上共享的完全相同的语法,但是这些命令并没有做任何事情。我使用 replit.com,它是一个浏览器 IDE。

这个sn-p的代码就像机器人的一半代码,到目前为止他很笨。到目前为止,我尝试过的所有命令都有效。我通常也不使用 Python,但我只是按照教程中看到的语法来避免出错。当我运行它时,机器人成功登录,然后如果我发送 !tst 机器人什么也不做。

from discord.ext import commands

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

@bot.command(name='tst')
async def test(ctx):
  await ctx.send('testt')

我主要用这个教程:https://realpython.com/how-to-make-a-discord-bot-python/#how-to-make-a-discord-bot-in-python 还有库文档:https://discordpy.readthedocs.io/en/stable/index.html

【问题讨论】:

    标签: python discord command bots


    【解决方案1】:

    基于完整代码:

    您不应该同时使用discord.Clientcommands.Bot,因为您定义了两个不同的机器人,但只运行其中一个。 commands.Bot 扩展了 discord.Client。将commands.Bot 视为discord.Client 的子类。以前用过client的地方,现在都可以用bot了。

    您发布的代码会像这样正确运行:

    import discord
    import os
    from discord.ext import commands
    
    bot = commands.Bot(command_prefix='!')
    
    @bot.command(name='tst')
    async def test(ctx):
      await ctx.send('testt')
    
    @bot.event
    async def on_ready():
      print ('Successful login as {0.user}'.format(bot)) 
    
    bot.run(os.getenv('TOKEN')) 
    

    原答案:

    (它可能是其他人寻找它的解决方案)

    您是否在使用on_message 事件?这会阻止命令处理器获取消息。您必须手动调用命令处理器,如下所示:

    @bot.event
    async def on_message(message):
        # Do your stuff
        await bot.process_commands(message)
    

    根据documentation,您应该在覆盖 on_message 事件时调用此函数。

    默认情况下,这个协程在 on_message() 事件中被调用。如果你选择覆盖 on_message() 事件,那么你也应该调用这个协程。

    【讨论】:

      【解决方案2】:
      import discord
      import os
      from discord.ext import commands
      
      bot = commands.Bot(command_prefix='!')
      
      @bot.command(name='tst')
      async def test(ctx):
        await ctx.send('testt')
      
      client = discord.Client()
      
      @client.event
      async def on_ready():
        print ('Successful login as {0.user}'.format(client)) 
      
      client.run(os.getenv('TOKEN')) 
      

      我不想发布整件事,但这真的没什么特别的,所以就这样吧。有那么一刻,我认为这可能是解决方案,但即使我清除了所有与消息相关的代码,它仍然什么也不做。它会与 on_ready 消息冲突吗?那个只是转到 IDE 网站上的控制台..

      【讨论】:

      • 嗨!欢迎来到社区!您不应该将此作为答案发布,而是可以编辑原始问题以添加更多信息。我编辑了我的答案,根据您的代码为您添加了一个可能的解决方案。
      猜你喜欢
      • 2021-03-11
      • 2020-11-27
      • 2020-10-30
      • 2022-10-24
      • 2021-07-22
      • 2022-12-15
      • 2018-05-04
      • 2018-05-06
      相关资源
      最近更新 更多