tuxbot-bot/cogs/Help.py

215 lines
6.5 KiB
Python

# Created by romain at 04/01/2020
import logging
import discord
from discord.ext import commands
from discord import utils
from bot import TuxBot
from utils import Texts
from utils.paginator import FieldPages
log = logging.getLogger(__name__)
class HelpCommand(commands.HelpCommand):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.ignore_cogs = ["Monitoring", "Help", "Jishaku"]
self.owner_cogs = ["Admin"]
def common_command_formatting(self, emb, command):
prefix = self.context.prefix if str(self.context.bot.user.id) in self.context.prefix else f"@{self.context.bot.user.name}"
emb.title = self.get_command_signature(command)
emb.description = command.description
usage = command.description + "todo: usage"
try:
usg = command.description + "todo: usage"
emb.add_field(
name=usage,
value=f"{prefix}{command.qualified_name} " + usg
)
except KeyError:
emb.add_field(
name=usage,
value=f"{prefix}{command.qualified_name}"
)
aliases = "`" + '`, `'.join(command.aliases) + "`"
if aliases == "``":
aliases = Texts(
'help', self.context
).get(
'command_help.no_aliases'
)
emb.add_field(
name=Texts(
'help', self.context
).get(
'command_help.aliases'
),
value=aliases
)
return emb
async def send_bot_help(self, mapping):
owners = self.context.bot.owners
owners_name = [
f"{owner.name}#{owner.discriminator}"
for owner in owners
]
prefix = self.context.prefix if str(self.context.bot.user.id) not in self.context.prefix else f"@{self.context.bot.user.name} "
e = discord.Embed(
color=discord.Color.blue(),
description=Texts(
'help', self.context
).get(
'main_page.description'
).format(
', '.join(owners_name[:-1]) + ' & ' + owners_name[-1]
)
)
e.set_author(
icon_url=self.context.author.avatar_url_as(format='png'),
name=self.context.author
)
e.set_footer(
text=Texts(
'help', self.context
).get(
'main_page.footer'
).format(
prefix
)
)
cogs = ""
for extension in self.context.bot.cogs.values():
if self.context.author not in owners \
and extension.__class__.__name__ in self.owner_cogs:
continue
if extension.__class__.__name__ in self.ignore_cogs:
continue
cogs += f"{extension.icon} **{extension.qualified_name}**\n"
e.add_field(
name=Texts(
'help', self.context
).get(
'main_page.categories'
),
value=cogs
)
await self.context.send(embed=e)
async def send_cog_help(self, cog):
pages = {}
prefix = self.context.prefix if str(self.context.bot.user.id) in self.context.prefix else f"@{self.context.bot.user.name}"
if cog.__class__.__name__ in self.owner_cogs \
and self.context.author not in self.context.bot.owners:
return self.command_not_found(cog.qualified_name)
for cmd in cog.get_commands():
if self.context.author not in self.context.bot.owners \
and (cmd.hidden or cmd.category == "Hidden"):
continue
if cmd.category not in pages:
pages[cmd.category] = "```asciidoc\n"
pages[cmd.category] \
+= f"{cmd.name}" \
+ ' ' * int(17 - len(cmd.name)) \
+ f":: {cmd.short_doc}\n"
if isinstance(cmd, commands.Group):
for group_command in cmd.commands:
pages[cmd.category] \
+= f"{group_command.name}" \
+ ' ' * int(15 - len(group_command.name)) \
+ f":: {cmd.short_doc}\n"
for e in pages:
pages[e] += "```"
formatted = []
for name, cont in pages.items():
formatted.append((name, cont))
footer_text = Texts('help', self.context) \
.get('main_page.footer') \
.format(prefix)
pages = FieldPages(
self.context,
embed_color=discord.Color.blue(),
entries=formatted,
title=cog.qualified_name.upper(),
thumbnail=cog.big_icon,
footericon=self.context.bot.user.avatar_url,
footertext=footer_text,
per_page=1
)
await pages.paginate()
async def send_group_help(self, group):
if group.cog_name in self.ignore_cogs:
return await self.send_error_message(
self.command_not_found(group.name)
)
formatted = self.common_command_formatting(
discord.Embed(color=discord.Color.blue()),
group
)
sub_cmd_list = ""
for group_command in group.commands:
sub_cmd_list += f"└> **{group_command.name}** - {group_command.description}\n"
subcommands = Texts(
'help', self.context
).get(
'command_help.subcommands'
)
formatted.add_field(name=subcommands, value=sub_cmd_list, inline=False)
await self.context.send(embed=formatted)
async def send_command_help(self, command):
if isinstance(command, commands.Group):
return await self.send_group_help(command)
if command.cog_name in self.ignore_cogs:
return await self.send_error_message(
self.command_not_found(command.name))
formatted = self.common_command_formatting(
discord.Embed(color=discord.Color.blue()),
command
)
await self.context.send(embed=formatted)
def command_not_found(self, command):
return Texts(
'help', self.context
).get(
'main_page.not_found'
).format(
command
)
class Help(commands.Cog):
def __init__(self, bot: TuxBot):
bot.help_command = HelpCommand()
def setup(bot: TuxBot):
bot.add_cog(Help(bot))