为什么Discord机器人无法识别命令?

时间:2020-05-01 03:11:33

标签: python discord discord.py

我正在为宠物小精灵服务器制作一个机器人,我正在尝试创建一个将“ Gym Leader”角色赋予其他用户的命令。我尝试使用该命令并使用test命令,但是服务器或外壳中都没有响应。

import os
import discord
from dotenv import load_dotenv
from discord.ext import commands
from discord.utils import get

bot = commands.Bot(command_prefix='b!', case_insensitive=True)

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')

client = discord.Client()

@client.event #works
async def on_ready():
    print(f'{client.user.name} has connected to Discord!')
    channel = client.get_channel(697500755766018098)

@client.event #works
async def on_member_join(member):
    await member.create_dm()
    await member.dm_channel.send(
        f'Hi {member.name}, welcome to Pokémon Beast Ball!\n\nThis server utilizes Pokecord and Mewbot.\n\nSay \'pkhelp\' in the server to learn about Pokecord commands.\nSay \';help\' in the server to learn about Mewbot commands.'
    )

@bot.command() #doesn't work
async def test(ctx):
    print("test recieved")
    await ctx.send(ctx)

@bot.command(pass_context=True) #this is the command that really needs help
async def newleader(ctx: discord.User=None):
  print("command recieved")
  if not user:
    await ctx.send("Invalid")
    print("1")
  else:
    role = discord.utils.get(ctx.guild.roles, name="Gym Leader")
    role2 = discord.utils.get(ctx.guild.roles, name="Purple UniTurtle Man")
    if role in ctx.author.roles or role2 in ctx.author.roles:
        print("2")
        await ctx.send(f'A new Gym Leader has been appointed')
        await user.add_roles(role)
        await bot.remove_roles(ctx.author, role)
    else:
        print("3")
        await ctx.send("You do not have permission to use this command")

client.run(TOKEN)

3 个答案:

答案 0 :(得分:0)

您检查了吗:

  • 机器人连接→进行“ on_connect”事件(与“ on_ready”不完全相同),以查看您的机器人是否成功连接到服务器(从Discord接收数据之前)。如果不是,请尝试将您的漫游器再次添加到服务器中,并检查所有令牌是否均为商品。
  • 机器人权限(如果您的机器人有权在通道中写入,从通道中读取消息,管理角色)→如果您的机器人无法读取消息,则他无法读取命令!
  • 角色优先级(您不能管理比您更高的角色)→转到“服务器设置”>“角色”>将您的机器人角色放在“健身房领导者”角色的上方(如果您不这样做,则将其放在列表的顶部)不在乎)。

答案 1 :(得分:0)

您正在混合使用botclient,而您的client = discord.Client()正在踩bot = commands.Bot(...)语句。由于要执行命令和事件,因此仅使用commands.Bot(...)语句。

删除client = discord.Client()语句,并将@client.event装饰符更改为@bot.event

如果要在测试命令中引用命令上下文,请使用ctx参数async def test(ctx):更新它。

这将使您开始使用命令,现在可以输入b1test

请注意,命令声明上的case_insensitive=True是指命令名称,而不是前缀。

答案 2 :(得分:0)

问题实际上并非所选答案所暗示的。可能没有理由同时使用commands.Botdiscord.Client,但同时使用不会导致该问题。

问题是因为您仅运行client,而不是bot。如果您希望它运行,还需要运行bot实例。

如果您不尝试做特定的事情,则无论如何,只要使用botclient就足够了,因此所选答案的一部分至少有助于避免该问题。