forked from cswimr/SeaCogs
84 lines
3.5 KiB
Python
84 lines
3.5 KiB
Python
# _____ _
|
|
# / ____| (_)
|
|
# | (___ ___ __ _ _____ ___ _ __ ___ _ __ ___ ___ _ __
|
|
# \___ \ / _ \/ _` / __\ \ /\ / / | '_ ` _ \| '_ ` _ \ / _ \ '__|
|
|
# ____) | __/ (_| \__ \\ V V /| | | | | | | | | | | | __/ |
|
|
# |_____/ \___|\__,_|___/ \_/\_/ |_|_| |_| |_|_| |_| |_|\___|_|
|
|
|
|
import inspect
|
|
import operator
|
|
from functools import partial, partialmethod
|
|
from typing import Any
|
|
|
|
from discord import Embed, app_commands
|
|
from discord.utils import CachedSlotProperty, cached_property
|
|
from redbot.core import commands
|
|
from redbot.core.bot import Red
|
|
from redbot.core.dev_commands import cleanup_code
|
|
from redbot.core.utils import chat_formatting as cf
|
|
from redbot.core.utils.views import SimpleMenu
|
|
|
|
|
|
class SeaUtils(commands.Cog):
|
|
"""A collection of random utilities."""
|
|
|
|
__author__ = ["SeaswimmerTheFsh"]
|
|
__version__ = "1.0.0"
|
|
|
|
def __init__(self, bot: Red):
|
|
self.bot = bot
|
|
|
|
def format_help_for_context(self, ctx: commands.Context) -> str:
|
|
pre_processed = super().format_help_for_context(ctx) or ""
|
|
n = "\n" if "\n\n" not in pre_processed else ""
|
|
text = [
|
|
f"{pre_processed}{n}",
|
|
f"Cog Version: **{self.__version__}**",
|
|
f"Author: {cf.humanize_list(self.__author__)}"
|
|
]
|
|
return "\n".join(text)
|
|
|
|
def format_src(self, ctx: commands.Context, obj: Any) -> str:
|
|
"""A large portion of this code is repurposed from Zephyrkul's RTFS cog.
|
|
https://github.com/Zephyrkul/FluffyCogs/blob/master/rtfs/rtfs.py"""
|
|
obj = inspect.unwrap(obj)
|
|
src: Any = getattr(obj, "__func__", obj)
|
|
if isinstance(obj, (commands.Command, app_commands.Command)):
|
|
src = obj.callback
|
|
elif isinstance(obj, (partial, partialmethod)):
|
|
src = obj.func
|
|
elif isinstance(obj, property):
|
|
src = obj.fget
|
|
elif isinstance(obj, (cached_property, CachedSlotProperty)):
|
|
src = obj.function
|
|
return inspect.getsource(src)
|
|
|
|
@commands.command(aliases=["source", "src", "code", "showsource"])
|
|
@commands.is_owner()
|
|
async def showcode(self, ctx: commands.Context, *, object: str):
|
|
"""Show the code for a particular object."""
|
|
try:
|
|
if object.startswith("/") and (obj := ctx.bot.tree.get_command(object[1:])):
|
|
text = self.format_src(ctx, obj)
|
|
elif obj := ctx.bot.get_cog(object):
|
|
text = self.format_src(ctx, type(obj))
|
|
elif obj := ctx.bot.get_command(object):
|
|
text = self.format_src(ctx, obj)
|
|
temp_content = cf.pagify(
|
|
text=cleanup_code(text),
|
|
escape_mass_mentions=True,
|
|
page_length = 1977
|
|
)
|
|
content = []
|
|
max_i = operator.length_hint(temp_content)
|
|
i = 1
|
|
for page in temp_content:
|
|
content.append(f"**Page {i}/{max_i}**\n{cf.box(page, lang='py')}")
|
|
i += 1
|
|
await SimpleMenu(pages=content, disable_after_timeout=True, timeout=180).start(ctx)
|
|
except (OSError, AttributeError, UnboundLocalError):
|
|
if ctx.embed_requested():
|
|
embed = Embed(title="Object not found!", color=await ctx.embed_color())
|
|
await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False))
|
|
else:
|
|
await ctx.send(content="Object not found!", reference=ctx.message.to_reference(fail_if_not_exists=False))
|