# ╔══════════════════════════════════════════════════════════════════╗ # ║ ║ # ║ +-+-+-+-+-+-+-+-+ ║ # ║ |H|e|x|a|H|o|s|t| ║ # ║ +-+-+-+-+-+-+-+-+ ║ # ║ ║ # ║ © 2026 HexaHost — All Rights Reserved ║ # ║ ║ # ║ discord ── https://discord.gg/hexahost ║ # ║ github ── https://github.com/theoneandonlymace ║ # ║ ║ # ╚══════════════════════════════════════════════════════════════════╝ import discord from utils.emoji import ARROWRED, BOOST, CAST, GAMES, LEVEL_UP, LOADINGRED, LOCK, MESSAGE, MINECRAFT, MUSIC, NEW, PIN, SEED, STAR, SWORD, SYSTEM, THUNDER, TICKET, WIFI, ZAI, ZARROW, ZBAN, ZBOT, ZCIRCLE, ZCIRCLE_ALT1, ZCLOUD, ZCOUNTING, ZMODULE, ZPEOPLE, ZROCKET, ZSAFE, ZTADA, ZUNMUTE, ZWRENCH from discord.ext import commands from discord import app_commands, Interaction from difflib import get_close_matches from contextlib import suppress from core import Context from core.hexahost import HexaHost from core.Cog import Cog from utils.Tools import getConfig from itertools import chain import json from utils import help as vhelp from utils import Paginator, DescriptionEmbedPaginator, FieldPagePaginator, TextPaginator import asyncio from utils.config import serverLink from utils.Tools import * from utils.cv2 import CV2, CV2Embed from utils.config import * color = 0xFF0000 from utils.config import BotName class HelpCommand(commands.HelpCommand): async def send_ignore_message(self, ctx, ignore_type: str): if ignore_type == "channel": await ctx.reply(f"This channel is ignored.", mention_author=False) elif ignore_type == "command": await ctx.reply(f"{ctx.author.mention} This Command, Channel, or You have been ignored here.", delete_after=6) elif ignore_type == "user": await ctx.reply(f"You are ignored.", mention_author=False) async def on_help_command_error(self, ctx, error): errors = [ commands.CommandOnCooldown, commands.CommandNotFound, discord.HTTPException, commands.CommandInvokeError ] if not type(error) in errors: await self.context.reply(f"Unknown Error Occurred\n{error.original}", mention_author=False) else: if type(error) == commands.CommandOnCooldown: return return await super().on_help_command_error(ctx, error) async def command_not_found(self, string: str) -> None: ctx = self.context check_ignore = await ignore_check().predicate(ctx) check_blacklist = await blacklist_check().predicate(ctx) if not check_blacklist: return if not check_ignore: await self.send_ignore_message(ctx, "command") return cmds = (str(cmd) for cmd in self.context.bot.walk_commands()) matches = get_close_matches(string, cmds) embed = CV2Embed( title=f"{BotName} Helper", description=f">>> **Ops! Command not found with the name** `{string}`.", color=0xFF0000 ) await ctx.reply(view=embed, mention_author=True) async def send_bot_help(self, mapping): ctx = self.context check_ignore = await ignore_check().predicate(ctx) check_blacklist = await blacklist_check().predicate(ctx) if not check_blacklist: return if not check_ignore: await self.send_ignore_message(ctx, "command") return # Show loading message loading_embed = CV2(f"{LOADINGRED} Loading help Menu...") loading_msg = await ctx.reply(view=loading_embed) # Wait 2 seconds await asyncio.sleep(2) # Delete loading message with suppress(discord.NotFound): await loading_msg.delete() data = await getConfig(self.context.guild.id) prefix = data["prefix"] filtered = await self.filter_commands(self.context.bot.walk_commands(), sort=True) embed = CV2Embed( description=( f"**{ARROWRED} __Start {BotName} Today__**\n" f"**{ZARROW} Type {prefix}antinuke enable**\n" f"**{ZARROW} Server Prefix:** `{prefix}`\n" f"**{ZARROW} Total Commands:** `{len(set(self.context.bot.walk_commands()))}`\n"), color=0xFF0000) embed.add_field( name=f"{ZCLOUD} Main Features", value=f">>> \n {ZSAFE} `»` Security\n" f" {ZBOT} `»` Automoderation\n" f" {ZWRENCH} `»` Utility\n" f" {MUSIC} `»` Music\n" f" {WIFI} `»` Autoreact & responder\n" f" {SWORD} `»` Moderation\n" f" {ZPEOPLE} `»` Autorole & Invc\n" f" {ZROCKET} `»` Fun\n" f" {GAMES} `»` Games\n" f" {ZBAN} `»` Ignore Channels\n" f" {WIFI} `»` Server\n" f" {ZUNMUTE} `»` Voice\n" f" {SEED} `»` Welcomer\n" f" {ZTADA} `»` Giveaway\n" f" {TICKET} `»` Ticket {NEW}\n" f" {ZPEOPLE} `»` Invite Tracker {NEW}\n" ) embed.add_field( name=f" {ZMODULE} Extra Features", value=f">>> \n {CAST} `»` Advance Logging\n" f" {STAR} `»` Vanityroles\n" f" {ZCOUNTING} `»` Counting {NEW}\n" f" {SYSTEM} `»` J2C {NEW}\n" f" {ZAI} `»` AI {NEW}\n" f" {BOOST} `»` Boost {NEW}\n" f" {LEVEL_UP} `»` Leveling {NEW}\n" f" {PIN} `»` Sticky {NEW}\n" f" {THUNDER} `»` Verification {NEW}\n" f" {LOCK} `»` Encryption {NEW}\n" f" {MINECRAFT} `»` Minecraft {NEW}\n" f" {MESSAGE} `»` Joindm {NEW}\n" f" {ZCIRCLE} `»` Birthday {NEW}\n" f" {ZCIRCLE_ALT1} `»` Customrole\n" ) embed.set_footer( text=f"Requested By {self.context.author} | [Support](https://discord.gg/hexahost)", ) view = vhelp.View(mapping=mapping, ctx=self.context, homeembed=embed, ui=2) await ctx.reply(view=view) async def send_command_help(self, command): ctx = self.context check_ignore = await ignore_check().predicate(ctx) check_blacklist = await blacklist_check().predicate(ctx) if not check_blacklist: return if not check_ignore: await self.send_ignore_message(ctx, "command") return help_text = f">>> {command.help}" if command.help else '>>> No Help Provided...' embed = CV2Embed( description=f"""{help_text}""", color=color) alias = ' & '.join(command.aliases) embed.add_field(name="**Alt cmd**", value=f"```{alias}```" if command.aliases else "No Alt cmd", inline=False) embed.add_field(name="**Usage**", value=f"```{self.context.prefix}{command.signature}```\n") embed.set_author(name=f"{command.qualified_name.title()} Command") embed.set_footer(text="<[] = optional | < > = required • Use Prefix Before Commands.") await self.context.reply(view=embed, mention_author=False) def get_command_signature(self, command: commands.Command) -> str: parent = command.full_parent_name if len(command.aliases) > 0: aliases = ' | '.join(command.aliases) fmt = f'[{command.name} | {aliases}]' if parent: fmt = f'{parent}' alias = f'[{command.name} | {aliases}]' else: alias = command.name if not parent else f'{parent} {command.name}' return f'{alias} {command.signature}' def common_command_formatting(self, embed_like, command): embed_like.title = self.get_command_signature(command) if command.description: embed_like.description = f'{command.description}\n\n{command.help}' else: embed_like.description = command.help or 'No help found...' async def send_group_help(self, group): ctx = self.context check_ignore = await ignore_check().predicate(ctx) check_blacklist = await blacklist_check().predicate(ctx) if not check_blacklist: return if not check_ignore: await self.send_ignore_message(ctx, "command") return entries = [ ( f"`{self.context.prefix}{cmd.qualified_name}`\n", f"{cmd.short_doc if cmd.short_doc else ''}\n\u200b" ) for cmd in group.commands ] count = len(group.commands) embeds = FieldPagePaginator( entries=entries, title=f"{group.qualified_name.title()} [{count}]", description="< > Duty | [ ] Optional\n", per_page=4 ).get_pages() paginator = Paginator(ctx, embeds) await paginator.paginate() async def send_cog_help(self, cog): ctx = self.context check_ignore = await ignore_check().predicate(ctx) check_blacklist = await blacklist_check().predicate(ctx) if not check_blacklist: return if not check_ignore: await self.send_ignore_message(ctx, "command") return entries = [( f"> `{self.context.prefix}{cmd.qualified_name}`", f"-# Description : {cmd.short_doc if cmd.short_doc else ''}" f"\n\u200b", ) for cmd in cog.get_commands()] paginator = Paginator(source=FieldPagePaginator( entries=entries, title=f"{BRAND_NAME}'s {cog.qualified_name.title()} ({len(cog.get_commands())})", description="`<..> Required | [..] Optional`\n\n", color=0xFF0000, per_page=4), ctx=self.context) await paginator.paginate() class Help(Cog, name="help"): def __init__(self, client: HexaHost): self._original_help_command = client.help_command attributes = { 'name': "help", 'aliases': ['h'], 'cooldown': commands.CooldownMapping.from_cooldown(1, 5, commands.BucketType.user), 'help': 'Shows help about bot, a command, or a category' } client.help_command = HelpCommand(command_attrs=attributes) client.help_command.cog = self async def cog_unload(self): self.help_command = self._original_help_command