Discord.py Переписать пользовательскую справку Встроить команды сортировки по винтикам

#discord.py-rewrite

#discord.py

Вопрос:

Хорошо, итак, я работаю над одним из моих старых ботов и пытаюсь переписать свою пользовательскую команду справки, чтобы она была немного менее ручной. Однако я не уверен, как заставить это работать так, как задумано.

Мои проблемы заключаются в следующем:

  1. Он продолжает отвечать с I can't send embeds исключением
  2. В журналах консоли не отображается ошибка

Кто-нибудь может помочь мне разобраться в этом?

Вот моя пользовательская команда справки.

     @commands.command(name="help", aliases=["Help", "H", "h"])
    @commands.has_permissions(add_reactions=True, embed_links=True)
    async def help(self, ctx, *cog):
        """Gets all cogs and commands.
        Alt     : h, H, Help
        Usage   : [h]elp <cog or command>"""
        try:
            if not cog:
                """Cog listing.  What more?"""
                embed = discord.Embed(color=discord.Color.dark_gold(), 
                title='Cog Listing and Uncatergorized Commands',
                description=f'Use `{prefix}help <cog>` to find out more about them!nNote: The Cog Name Must Be in Title Case, Just Like this Sentence.',
                timestamp=ctx.message.created_at)
                embed.set_author(name=self.client.user.name, icon_url=self.client.user.avatar_url)
                cogs_desc = ''
                for x in self.client.cogs:
                    cogs_desc  = ('{} - {}'.format(x, self.client.cogs[x].__doc__)   'n')
                embed.add_field(name='Cogs', value=cogs_desc[0:len(cogs_desc) - 1], inline=False)
                cmds_desc = ''
                for y in self.client.walk_commands():
                    if not y.cog_name and not y.hidden:
                        cmds_desc  = ('{} - {}'.format(y.name, y.help)   'n')
                embed.add_field(name='Uncatergorized Commands', value=cmds_desc[0:len(cmds_desc) - 1], inline=False)
                await ctx.send('', embed=embed)
            else:
                """Helps me remind you if you pass too many args."""
                if len(cog) > 1:
                    embed = discord.Embed(color=discord.Color.dark_red(), timestamp=ctx.message.created_at)
                    embed.set_author(name="Command Failed", icon_url=self.client.user.avatar_url)
                    embed.add_field(name="Error", value="Too many cogs", inline=False)
                    await ctx.send('', embed=embed)
                else:
                    """Command listing within a cog."""
                    found = False
                    for x in self.client.cogs:
                        for y in cog:
                            if x == y:
                                embed = discord.Embed(color=discord.Color.dark_gold(), timestamp=ctx.message.created_at, title=cog[0]   ' Command Listing', description=self.client.cogs[cog[0]].__doc__)
                                for c in self.client.get_cog(y).get_commands():
                                    if not c.hidden:
                                        embed.add_field(name=c.name, value=c.help, inline=False)
                                found = True
                    if not found:
                        """Reminds you if that cog doesn't exist."""
                        embed = discord.Embed(color=discord.Color.dark_red(), timestamp=ctx.message.created_at)
                        embed.set_author(name="Command Failed", icon_url=self.client.user.avatar_url)
                        embed.add_field(name="Error", value='Can not use "'   cog[0]   '"?', inline=False)
                    else:
                        await ctx.send('', embed=embed)
        except:
            await ctx.send("I can't send embeds.")
  

Я использую discord.py-rewrite , если это поможет.

—РЕДАКТИРОВАТЬ—

Я отказался от приведенного выше кода из-за бесчисленных проблем с ним. И перешел к следующему коду. Я бы все равно хотел, чтобы это было менее ручным, но пока это действительно публикуется.

     @commands.command(name="Help", aliases=["help", "h", "H"])
    async def _help(self, ctx):
        """Displays all available commands"""
        msg = ctx.message
        await msg.delete()
        contents = [
            f"```cssnAdministrator CommandsnnBroadcast:  [B]roadcast <message>nPurge:      [p]urge <1-100>nBan:        [B]an <user> [reason]nUnban:      [U]nban <user>nKick:       [K]ick <user> [reason]nnOptional arguments are represented with []nRequired arguments are represented with <>nDo not include the [] or <> flags in the commandn ```",
            f"```cssnModerator Commands!nnAnnounce:   [ann]ounce <message>nClean:      [C]lean <1-100>nnOptional arguments are represented with []nRequired arguments are represented with <>nDo not include the [] or <> flags in the commandn ```",
            f"```cssnFun CommandsnnGiphy:      [ ] < >nTenor:      [ ] < >nnOptional arguments are represented with []nRequired arguments are represented with <>nDo not include the [] or <> flags in the commandn ```",
            f"```cssnUtility CommandsnnPing:       pingnJoined:     [J]oined [user]nTopRole:   [top]role [user]nPerms:      perms [user]nHelp:       [H]elp [command]nnOptional arguments are represented with []nRequired arguments are represented with <>nDo not include the [] or <> flags in the commandn ```"
            ]
        pages = 4
        cur_page = 1
        message = await ctx.send(f"Page {cur_page}/{pages}:n{contents[cur_page-1]}")
        # getting the message object for editing and reacting

        await message.add_reaction("◀️")
        await message.add_reaction("▶️")

        def check(reaction, user):
            return user == ctx.author and str(reaction.emoji) in ["◀️", "▶️"]
            # This makes sure nobody except the command sender can interact with the "menu"

        while True:
            try:
                reaction, user = await self.client.wait_for("reaction_add", timeout=60, check=check)
                # waiting for a reaction to be added - times out after x seconds, 60 in this
                # example

                if str(reaction.emoji) == "▶️" and cur_page != pages:
                    cur_page  = 1
                    await message.edit(content=f"Page {cur_page}/{pages}:n{contents[cur_page-1]}")
                    await message.remove_reaction(reaction, user)

                elif str(reaction.emoji) == "◀️" and cur_page > 1:
                    cur_page -= 1
                    await message.edit(content=f"Page {cur_page}/{pages}:n{contents[cur_page-1]}")
                    await message.remove_reaction(reaction, user)

                else:
                    await message.remove_reaction(reaction, user)
                    # removes reactions if the user tries to go forward on the last page or
                    # backwards on the first page
            except asyncio.TimeoutError:
                await message.delete()
                break
                # ending the loop if user doesn't react after x seconds

    @_help.error
    async def _help_error(self, ctx, error):
        if isinstance(error, commands.MissingRequiredArgument):
            guild = ctx.guild
            embed = discord.Embed(
                color=discord.Color.dark_red(), timestamp=ctx.message.created_at)
            embed.set_author(name="Command Failed",
                             icon_url=self.client.user.avatar_url)
            embed.add_field(name="Missing Required arguments",
                            value="Please pass in all required arguments.", inline=False)
            embed.set_thumbnail(url=self.client.user.avatar_url)
            embed.set_footer(text=f"{guild.name}", icon_url=guild.icon_url)
            await ctx.message.add_reaction(emoji="⚠️️")
            await ctx.message.author.send(embed=embed)
            print("[ERROR] Missing Required Arguments")

        elif isinstance(error, commands.MissingPermissions):
            guild = ctx.guild
            embed = discord.Embed(
                color=discord.Color.dark_red(), timestamp=ctx.message.created_at)
            embed.set_author(name="Access denied",
                             icon_url=self.client.user.avatar_url)
            embed.add_field(name="Insufficient Permissions",
                            value="You do not have permission to use this command.", inline=False)
            embed.set_thumbnail(url=self.client.user.avatar_url)
            embed.set_footer(text=f"{guild.name}", icon_url=guild.icon_url)
            await ctx.message.add_reaction(emoji="🚫")
            await ctx.message.author.send(embed=embed)
            print("[ERROR] Insufficient Permissions")
  

Но да, если кто-нибудь знает, как сделать так, чтобы команды считывались из винтиков, а не вводились вручную в ответ команды справки, любые советы были бы очень полезны.

Комментарии:

1. Удалите попытку … за исключением, чтобы вы могли увидеть ошибку.

2. эй, извините, я отказался от этой команды и просто полностью перестроил ее. К сожалению, мой новый — ручной, но он по-прежнему выглядит намного лучше, чем встроенная команда справки. я обновлю свой пост тем, чего я в итоге придерживался.