1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-02 20:23:12 +00:00
Lumi/lib/help.py
2024-08-30 04:21:10 -04:00

83 lines
3.2 KiB
Python

import os
from collections.abc import Mapping
from pathlib import Path
from typing import Any
from discord.ext import commands
from lib.const import CONST
from lib.exceptions import LumiException
from ui.embeds import Builder
class LumiHelp(commands.HelpCommand):
def __init__(self, **options: Any) -> None:
super().__init__(**options)
self.verify_checks: bool = True
self.command_attrs: dict[str, list[str] | str | bool] = {
"aliases": ["h"],
"help": "Show a list of commands, or information about a specific command when an argument is passed.",
"name": "help",
"hidden": True,
}
def get_command_qualified_name(self, command: commands.Command[Any, Any, Any]) -> str:
return f"`{self.context.clean_prefix}{command.qualified_name}`"
async def send_bot_help(self, mapping: Mapping[commands.Cog | None, list[commands.Command[Any, ..., Any]]]) -> None:
embed = Builder.create_embed(
theme="success",
author_text="Help Command",
user_name=self.context.author.name,
hide_name_in_description=True,
)
modules_dir = Path(__file__).parent.parent / "modules"
module_names = [name for name in os.listdir(modules_dir) if Path(modules_dir / name).is_dir()]
for module_name in module_names:
module_commands: list[commands.Command[Any, ..., Any]] = []
for cog, lumi_commands in mapping.items():
if cog and cog.__module__.startswith(f"modules.{module_name}"):
filtered = await self.filter_commands(lumi_commands, sort=True)
module_commands.extend(filtered)
if module_commands:
command_signatures = [self.get_command_qualified_name(c) for c in module_commands]
unique_command_signatures = list(set(command_signatures))
embed.add_field(
name=module_name.capitalize(),
value=", ".join(sorted(unique_command_signatures)),
inline=False,
)
channel = self.get_destination()
await channel.send(embed=embed)
async def send_command_help(self, command: commands.Command[Any, Any, Any]) -> None:
embed = Builder.create_embed(
theme="success",
author_text=f"{self.context.clean_prefix}{command.qualified_name}",
description=command.description,
user_name=self.context.author.name,
hide_name_in_description=True,
)
usage_value: str = f"`{self.context.clean_prefix}{command.usage}`"
embed.add_field(name="Usage", value=usage_value, inline=False)
channel = self.get_destination()
await channel.send(embed=embed)
async def send_error_message(self, error: str) -> None:
raise LumiException(error)
async def send_group_help(self, group: commands.Group[Any, Any, Any]) -> None:
raise LumiException(
CONST.STRINGS["error_command_not_found"].format(group.qualified_name),
)
async def send_cog_help(self, cog: commands.Cog) -> None:
raise LumiException(
CONST.STRINGS["error_command_not_found"].format(cog.qualified_name),
)