Discord Bot (python) 不监听命令和事件

问题描述 投票:0回答:2

嘿伙计们,我试图用 python 制作一个简单的机器人,但我很头疼为什么我的机器人不听命令而是听事件,但是如果我删除我的事件,他就会听命令。有人可以向我解释为什么有些人使用客户端而其他人使用机器人。例如,有些人以

client = commands.Bot(command_prefix='!',intents = discord.Intents.all()) 
开头,而另一些人以
Client = discord.Client()

开头
import discord
from discord.ext import commands

client = commands.Bot(command_prefix='!',help_command=None,intents = discord.Intents.all())

@client.event
async def on_ready():
    print(f'{client.user} has connected to Discord!')

@client.event
async def on_message(message):
    #doesnt read the messages from bot
    if message.author == client.user:
        return
    if message.content.startswith('!ligar'):
        #get date 
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")

        #turns caldeira
        #SwitchCaldeira()

        #meter aqui o tempo a que a caldeira foi ligado 
        await message.channel.send(f'Caldeira ligada, as {current_time}')

@client.command()
async def hello(ctx):
    await ctx.channel.send('funciona fdp')

#main runner
client.run('token')
python events discord command
2个回答
2
投票

您发布的代码,您在一个文件中使用事件侦听器和命令。这样做不是一个好习惯。

但是你的机器人不响应你的命令而是响应事件的原因是你的代码执行的顺序。在您的脚本中,

on_ready
on_message
的事件处理程序在
hello
的命令处理程序之前定义。这意味着当机器人准备好并接收消息时,它首先检查该消息是否来自机器人本身以及该消息是否以“!ligar”开头,然后才检查是否有任何命令。要使机器人响应您的命令,您应该将 hello 的命令处理程序移至事件处理程序上方,以使它们正常工作。

如果您想要为您的机器人添加前缀并简单地编写整洁干净的代码,则可以像这样。

from discord.ext import commands

intents = discord.Intents.all()
client = Client(command_prefix="!", intents=intents)

要使用机器人命令,您必须使用:

commands.command()
=> 如果您在 cogs 中使用

client.command()
=> 如果您在单个文件中使用

例如:

@commands.command(description="test")
async def test(self, ctx):
await ctx.send("Test complete!")

0
投票

我找到了解决此问题的解决方法,因为仅将命令移至事件上方并不能解决此处的问题...事件以某种方式优先于文件中的其他任何内容。

尝试将await进程添加到函数中,如下所示(位置很重要): 等待 bot.process_commands(消息)

@client.event
async def on_message(message):
  await bot.process_commands(message)

  if message.author == client.user:
    return
  if message.content.startswith('!ligar'):
    #get date 
    now = datetime.now()
    current_time = now.strftime("%H:%M:%S")

    #turns caldeira
    #SwitchCaldeira()

    #meter aqui o tempo a que a caldeira foi ligado 
    await message.channel.send(f'Caldeira ligada, as {current_time}') 
© www.soinside.com 2019 - 2024. All rights reserved.