#discord.py-rewrite
#discord.py
Вопрос:
Хорошо, итак, я работаю над одним из моих старых ботов и пытаюсь переписать свою пользовательскую команду справки, чтобы она была немного менее ручной. Однако я не уверен, как заставить это работать так, как задумано.
Мои проблемы заключаются в следующем:
- Он продолжает отвечать с
I can't send embeds
исключением - В журналах консоли не отображается ошибка
Кто-нибудь может помочь мне разобраться в этом?
Вот моя пользовательская команда справки.
@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. эй, извините, я отказался от этой команды и просто полностью перестроил ее. К сожалению, мой новый — ручной, но он по-прежнему выглядит намного лучше, чем встроенная команда справки. я обновлю свой пост тем, чего я в итоге придерживался.