155 lines
5.4 KiB
Python
155 lines
5.4 KiB
Python
from typing import List, Dict
|
|
|
|
import discord
|
|
from discord.ext import commands
|
|
|
|
from payphone.cogs import base
|
|
from payphone.core import formatting, constants, utils
|
|
|
|
|
|
class HelpView(discord.ui.View):
|
|
"""The view sent with the help command."""
|
|
|
|
def __init__(self):
|
|
super().__init__(
|
|
discord.ui.Button(
|
|
label="Credits",
|
|
style=discord.ButtonStyle.gray,
|
|
url="https://payphone.nyeki.dev",
|
|
),
|
|
discord.ui.Button(
|
|
label="Donate",
|
|
style=discord.ButtonStyle.gray,
|
|
url="https://ko-fi.com/payphonedev",
|
|
),
|
|
discord.ui.Button(
|
|
label="Vote",
|
|
style=discord.ButtonStyle.gray,
|
|
url="https://top.gg/bot/1212940413795827763/vote",
|
|
),
|
|
discord.ui.Button(
|
|
label="Server",
|
|
style=discord.ButtonStyle.gray,
|
|
url=constants.DISCORD_SERVER_INVITE,
|
|
),
|
|
timeout=None,
|
|
)
|
|
|
|
|
|
class HelpCommand(commands.HelpCommand):
|
|
async def send_bot_help(
|
|
self, mapping: Dict[base.Cog | None, List[commands.Command]]
|
|
) -> None:
|
|
bot_commands: List[commands.Command] = []
|
|
|
|
for cog, cog_commands in mapping.items():
|
|
if cog is not None and not cog.show_in_help:
|
|
continue
|
|
|
|
for command in cog_commands:
|
|
if isinstance(command, commands.Command):
|
|
if command.extras.get("show_in_help", True):
|
|
bot_commands += [command]
|
|
|
|
embed = discord.Embed(
|
|
author=self.context.bot.embed_author,
|
|
title="Payphone, call and connect with other people.",
|
|
description=(
|
|
"Here is the list of all available commands. You can see more details about a "
|
|
f"specific command with `{self.context.clean_prefix}help <command>`."
|
|
),
|
|
thumbnail=self.context.bot.user.display_avatar.url,
|
|
fields=[
|
|
discord.EmbedField(
|
|
name="Commands",
|
|
value=formatting.monospace_grid(
|
|
[c.name for c in bot_commands], space=12
|
|
),
|
|
)
|
|
],
|
|
color=constants.PRIMARY_COLOR,
|
|
footer=discord.EmbedFooter(
|
|
text=f"{constants.VERSION} · Use {self.context.clean_prefix}help <command> to get more information about a specific command."
|
|
),
|
|
)
|
|
|
|
await self.context.send(embed=embed, view=HelpView())
|
|
|
|
async def send_command_help(self, command: commands.Command) -> None:
|
|
error_message = command.extras.get("help_error_message")
|
|
|
|
if error_message:
|
|
return await self.context.send(f"❌ {error_message}")
|
|
|
|
command_name = (
|
|
command.name
|
|
if isinstance(command, discord.SlashCommand)
|
|
else command.qualified_name
|
|
)
|
|
command_options = "".join(
|
|
[f" <{option.name}>" for option in command.options]
|
|
if isinstance(command, discord.SlashCommand)
|
|
else [
|
|
(f" [{name}]" if utils.is_optional(info.annotation) else f" <{name}>")
|
|
for name, info in command.params.items()
|
|
if name not in ["self", "ctx"]
|
|
]
|
|
)
|
|
command_description = (
|
|
command.description if command.description else command.help
|
|
).replace("{prefix}", self.context.clean_prefix)
|
|
|
|
full_command_usage = (
|
|
self.context.clean_prefix + command.qualified_name + command_options
|
|
)
|
|
reply_argument = (
|
|
command.extras.get("reply_argument", None) if command.extras else None
|
|
)
|
|
|
|
embed = discord.Embed(
|
|
author=discord.EmbedAuthor(
|
|
name="Payphone", icon_url=self.context.bot.user.display_avatar.url
|
|
),
|
|
title=(
|
|
command.extras["help_name"]
|
|
if command.extras and "help_name" in command.extras
|
|
else command_name.title()
|
|
)
|
|
+ " Command",
|
|
description=command_description,
|
|
thumbnail=self.context.bot.user.display_avatar.url,
|
|
color=constants.PRIMARY_COLOR,
|
|
fields=[
|
|
discord.EmbedField(
|
|
name="Usage",
|
|
value=f"{f"`┌─ [<{reply_argument}>]`\n" if reply_argument else ""}`{full_command_usage}`",
|
|
)
|
|
]
|
|
+ (
|
|
[
|
|
discord.EmbedField(
|
|
name="Aliases",
|
|
value=", ".join(
|
|
[
|
|
f"`{self.context.clean_prefix}{alias}`"
|
|
for alias in command.aliases
|
|
]
|
|
),
|
|
)
|
|
]
|
|
if len(command.aliases) > 0
|
|
else []
|
|
),
|
|
footer=discord.EmbedFooter(
|
|
f"Use {self.context.clean_prefix}help <command> to get more information about a specific command."
|
|
),
|
|
)
|
|
|
|
await self.context.send(embed=embed)
|
|
|
|
async def send_group_help(self, group):
|
|
return await self.send_command_help(group)
|
|
|
|
async def send_error_message(self, error):
|
|
await self.context.send(f"❌ {error}")
|