diff options
Diffstat (limited to 'code/botcmds/helpcmds.py')
-rw-r--r-- | code/botcmds/helpcmds.py | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/code/botcmds/helpcmds.py b/code/botcmds/helpcmds.py new file mode 100644 index 0000000..10bc239 --- /dev/null +++ b/code/botcmds/helpcmds.py @@ -0,0 +1,134 @@ +import discord, config +from discord.ext import commands +from discord.errors import Forbidden + +"""This custom help command is a perfect replacement for the default one on any Discord Bot written in Discord.py! + +Original concept by Jared Newsom (AKA Jared M.F.) +[Deleted] https://gist.github.com/StudioMFTechnologies/ad41bfd32b2379ccffe90b0e34128b8b +Rewritten and optimized by github.com/nonchris +https://gist.github.com/nonchris/1c7060a14a9d94e7929aa2ef14c41bc2 +Edited by stolenvw for Stolenvw ValPlusBot +""" + + +async def send_embed(ctx, embed): + """ + Function that handles the sending of embeds + -> Takes context and embed to send + - tries to send embed in channel + - tries to send normal message when that fails + - tries to send embed private with information abot missing permissions + If this all fails: https://youtu.be/dQw4w9WgXcQ + """ + try: + await ctx.send(embed=embed) + except Forbidden: + try: + await ctx.send("Hey, seems like I can't send embeds. Please check my permissions :)") + except Forbidden: + await ctx.author.send( + f"Hey, seems like I can't send any message in {ctx.channel.name} on {ctx.guild.name}\n" + f"May you inform the server team about this issue? :slight_smile: ", embed=embed) + + +class Help(commands.Cog): + """ + Sends this help message + """ + + def __init__(self, bot): + self.bot = bot + self.bot.remove_command("help") + + @commands.command() + # @commands.bot_has_permissions(add_reactions=True,embed_links=True) + async def help(self, ctx, *input): + """Shows all modules of that bot""" + + # !SET THOSE VARIABLES TO MAKE THE COG FUNCTIONAL! + prefix = config.BOT_PREFIX + version = "v1.0.0" + + # checks if cog parameter was given + # if not: sending all modules and commands not associated with a cog + if not input: + # starting to build embed + emb = discord.Embed(title='Valheim Plus Discord Bot', url="https://github.com/stolenvw/ValheimPlus-Discord_Bot", color=discord.Color.blue(), + description=f'Use `{prefix}help <module>` to gain more information about that module ' + f'\n') + + # iterating trough cogs, gathering descriptions + cogs_desc = '' + for cog in self.bot.cogs: + if cog != "BotSQL" and cog != "Admin": + cogs_desc += f'`{cog}` {self.bot.cogs[cog].__doc__}\n' + + # adding 'list' of cogs to embed + emb.add_field(name='Modules', value=cogs_desc, inline=False) + + # integrating trough uncategorized commands + commands_desc = '' + for command in self.bot.walk_commands(): + # if cog not in a cog + # listing command if cog name is None and command isn't hidden + if not command.cog_name and not command.hidden: + commands_desc += f'{command.name} - {command.help}\n' + + # adding those commands to embed + if commands_desc: + emb.add_field(name='Not belonging to a module', value=commands_desc, inline=False) + + emb.set_footer(text=f"Stolenvw ValPlusBot {version}") + + # block called when one cog-name is given + # trying to find matching cog and it's commands + elif len(input) == 1: + + # iterating trough cogs + for cog in self.bot.cogs: + # check if cog is the matching one + if cog.lower() == input[0].lower(): + + # making title - getting description from doc-string below class + emb = discord.Embed(title=f'{cog} - Commands', description=self.bot.cogs[cog].__doc__, + color=discord.Color.green()) + + # getting commands from cog + for command in self.bot.get_cog(cog).get_commands(): + # if cog is not hidden + if not command.hidden: + if not command.usage: + emb.add_field(name=f"`{prefix}{command.name}`", value=command.help, inline=False) + else: + emb.add_field(name=f"`{prefix}{command.name} {command.usage}`", value=command.help, inline=False) + # found cog - breaking loop + break + + # if input not found + # yes, for-loops have an else statement, it's called when no 'break' was issued + else: + emb = discord.Embed(title="What's that?!", + description=f"I've never heard from a module called `{input[0]}` before", + color=discord.Color.orange()) + + # too many cogs requested - only one at a time allowed + elif len(input) > 1: + emb = discord.Embed(title="That's too much.", + description="Please request only one module at once", + color=discord.Color.orange()) + + else: + emb = discord.Embed(title="It's a magical place.", + description="I don't know how you got here. But I didn't see this coming at all.\n" + "Would you please be so kind to report that issue to me on github?\n" + "https://github.com/nonchris/discord-fury/issues\n" + "Thank you! ~Chris", + color=discord.Color.red()) + + # sending reply embed using our own function defined above + await send_embed(ctx, emb) + + +def setup(bot): + bot.add_cog(Help(bot)) |