Home > Mobile >  Does anyone know why I have an attribute error on a Python Discord bot?
Does anyone know why I have an attribute error on a Python Discord bot?

Time:10-30

Discord.py bot attribute error

I have a Discord.py bot that I have been making recently on Replit. It has a few humor commands and it also has some moderation commands, but it doesn't make sense to me. The main issue is one of the decorators I used. I use the decorator for marking commands available to only a certain role. I use discord.ext instead of the discord library because it allows me to use a command prefix, so instead of @client.command(), it uses @bot.command. It doesn't make sense to me, because on (currently) line 57 of this program, I used the decorator @commands.has_any_role(Role1, Role2), but I don't get any errors, but on line 79, i have the same decorator, but in the console, I get the error:

Traceback (most recent call last):
  File "main.py", line 76, in <module>
    @commands.has_any_role("That common coder", "The creator")
AttributeError: 'Command' object has no attribute 'has_any_role'

I do not understand why there is an error for line 79, but not line 57. Could someone tell me why it isn't giving the error for both, and what I could do to fix it. All help would be appreciated!

Here is the whole program:
import os
import nextcord
import random
from nextcord.ext import commands

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix='/', case_insensitive=True, intents=intents)


#when bot joins server console prints
@bot.event
async def on_connect():
  print("Your bot Greg is online!")


#///////////////////////////////////////////////////////////


#commands for bot to follow
@bot.command(name='ping')
async def ping(ctx):
  await ctx.send('pong!')
  await ctx.send('Hi new person!')


#///////////////////////////////////////////////////////////


@bot.command(name='helpc')
async def helpCommand(ctx, *, fromcommands=False):
  if fromcommands(False):
    status = 'did not'
  if fromcommands(True):
    status = 'did'
  print(
    f'{ctx.message.author} asked for help and {status} come from the /commands command.'
  )
  await ctx.send()


#///////////////////////////////////////////////////////////


@bot.command(name='crtchannel',
             description='This is a command for admins to create text channels'
             )
@commands.has_any_role('That_common_coder', 'The creator')
async def create_text(ctx, channel_name='default-bot-name'):
  guild = ctx.guild
  existing_channel = nextcord.utils.get(guild.channels, name=channel_name)

  if not existing_channel:
    print(f'The {channel_name} channel has been created')
    await guild.create_text_channel(channel_name)


#//////////////////////////////
@bot.command(name='commands')
async def commands(ctx):
  await helpCommand(True)


#///////////////////////////////////////////////////////////


@bot.command(
  name='crvchannel',
  description='This is a command for admins to create voice channels')
@commands.has_any_role("That common coder", "The creator")
async def create_voice(ctx, channel_name='default-bot-vc-name'):
  guild = ctx.guild
  existing_channel = nextcord.utils.get(guild.channels, name=channel_name)

  if not existing_channel:
    print(f'This channel: {channel_name} has been created')
    await guild.create_voice_channel(channel_name)


#////////////////////////////////////////////////////////////


@bot.command(name='ban', help='This is the command to ban users')
@commands.has_permissions(ban_members=True)
async def ban_user(ctx, member: nextcord.Member = None, *, reason=None):
  sillyshortword = []
  sillymsg = [
    f'That seems kinda {random.choice(sillyshortword)}',
    f'You are kinda {random.choice(sillyshortword)}', 'You are kinda sussy'
  ]

  #  await user.create_dm()
  #  await message.author.send()
  if member == ctx.message.author:
    print(f'Someone: {ctx.message.author} just tried to ban themself! :)')
    await ctx.send(
      f'You cannot ban yourself, @{ctx.message.author}! :slight_smile:')
    #Note to eli: remember to change this emoji code below
    await member.send(
      f'Why would you try to ban yourself,{ctx.message.author}? :smile:')
    await member.send(sillymsg)
    return
  if member == None:
    print(f'{ctx.message.author} used /ban without any member specified :)')
    await ctx.send(f'{ctx.message.author}, you have to specify a member to ban'
                   )
    return
  if reason == None:
    await member.ban(reason=f'{member} has been banned for (Undefined)')
    await member.send(
      f"You have been banned from {ctx.guild.name}. The result of the ban was unspecified"
    )
  else:
    await member.ban(reason=reason)
    await member.send(
      f"You have been banned from {ctx.guild.name}. The result of the ban was {reason}"
    )
  print(f'{member} has just been banned for {reason}')
  await member.send(f'You have been banned for {reason}')
  await ctx.send(f'{member} has been banned.')


#////////////////////////////////////////////////////////////


@bot.event
async def on_command_error(ctx, error):
  if isinstance(error, commands.errors.CheckFailure):
    await ctx.send(
      'Sorry, but you do not have the required roles for this command. ERR 1629'
    )
  else:
    await ctx.send(
      'Sorry, there was an undefined error. This error will soon become specified by the bot owner, and it will have a different response. ERR 16295: UNDEFINED'
    )


#tokens
bottoken = os.environ['token']
bot.run(bottoken)

I thought that because discord.py is almost dead, that it might work if i migrated to nextcord. I still get the same error, and yes, in the Replit shell, I used python3 -m pip uninstall discord.py, and then I used python3 -m pip install -U nextcord. Any help would be appreciated!

CodePudding user response:

You have two definitions of commands in your code.

The first:

from nextcord.ext import commands

and the second:

@bot.command(name='commands')
async def commands(ctx):
  await helpCommand(True)

When you define that function, you're hiding the module that you've imported before.

  • Related