feat(seautils): add support for cogs and slash commands
This commit is contained in:
parent
2dcbcb0a59
commit
5116598788
1 changed files with 31 additions and 6 deletions
|
@ -7,10 +7,14 @@
|
||||||
|
|
||||||
import inspect
|
import inspect
|
||||||
import operator
|
import operator
|
||||||
|
from functools import partial, partialmethod
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
from discord import Embed
|
from discord import Embed, app_commands
|
||||||
|
from discord.utils import CachedSlotProperty, cached_property
|
||||||
from redbot.core import commands
|
from redbot.core import commands
|
||||||
from redbot.core.bot import Red
|
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 import chat_formatting as cf
|
||||||
from redbot.core.utils.views import SimpleMenu
|
from redbot.core.utils.views import SimpleMenu
|
||||||
|
|
||||||
|
@ -34,13 +38,34 @@ class SeaUtils(commands.Cog):
|
||||||
]
|
]
|
||||||
return "\n".join(text)
|
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.command(aliases=["source", "src", "code", "showsource"])
|
||||||
@commands.is_owner()
|
@commands.is_owner()
|
||||||
async def showcode(self, ctx: commands.Context, *, command: str):
|
async def showcode(self, ctx: commands.Context, *, object: str):
|
||||||
"""Show the code for a particular command."""
|
"""Show the code for a particular object."""
|
||||||
try:
|
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(
|
temp_content = cf.pagify(
|
||||||
text=inspect.getsource(self.bot.get_command(command).callback),
|
text=cleanup_code(text),
|
||||||
escape_mass_mentions=True,
|
escape_mass_mentions=True,
|
||||||
page_length = 1977
|
page_length = 1977
|
||||||
)
|
)
|
||||||
|
@ -53,7 +78,7 @@ class SeaUtils(commands.Cog):
|
||||||
await SimpleMenu(pages=content, disable_after_timeout=True, timeout=180).start(ctx)
|
await SimpleMenu(pages=content, disable_after_timeout=True, timeout=180).start(ctx)
|
||||||
except (OSError, AttributeError):
|
except (OSError, AttributeError):
|
||||||
if ctx.embed_requested():
|
if ctx.embed_requested():
|
||||||
embed = Embed(title="Command not found!", color=await ctx.embed_color())
|
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))
|
await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False))
|
||||||
else:
|
else:
|
||||||
await ctx.send(content="Command not found!", reference=ctx.message.to_reference(fail_if_not_exists=False))
|
await ctx.send(content="Object not found!", reference=ctx.message.to_reference(fail_if_not_exists=False))
|
||||||
|
|
Loading…
Reference in a new issue