feat(aurora): starting on the updated moderation type system
This commit is contained in:
parent
fcecfe8e88
commit
9f068bba6f
10 changed files with 321 additions and 172 deletions
164
aurora/models/moderation_types.py
Normal file
164
aurora/models/moderation_types.py
Normal file
|
@ -0,0 +1,164 @@
|
|||
|
||||
from discord import File, Guild, Member, User
|
||||
from discord.errors import HTTPException, NotFound
|
||||
from redbot.core import app_commands, commands
|
||||
from redbot.core.bot import Red
|
||||
from redbot.core.commands.converter import parse_relativedelta
|
||||
from redbot.core.utils.chat_formatting import bold, error, humanize_timedelta, inline
|
||||
|
||||
from ..utilities.factory import message_factory
|
||||
from ..utilities.registry import type_registry
|
||||
from ..utilities.utils import get_footer_image, log, send_evidenceformat, timedelta_from_relativedelta
|
||||
from .moderation import Moderation
|
||||
from .type import Type
|
||||
|
||||
|
||||
def get_icon(bot: Red) -> File:
|
||||
cog = bot.get_cog("Aurora")
|
||||
if cog:
|
||||
return get_footer_image(cog)
|
||||
raise ValueError("Aurora cog not found. How was this managed?")
|
||||
|
||||
@type_registry.register(key="ban")
|
||||
class Ban(Type):
|
||||
def __init__(self) -> None:
|
||||
self.type="ban"
|
||||
self.verb="banned"
|
||||
|
||||
@classmethod
|
||||
async def handler(cls, ctx: commands.Context, target: Member | User, silent: bool, reason: str = None, delete_messages: app_commands.Choice | None = None) -> 'Ban':
|
||||
"""Ban a user."""
|
||||
bot = ctx.bot
|
||||
try:
|
||||
await ctx.guild.fetch_ban(target)
|
||||
await ctx.send(content=error(f"{target.mention} is already banned!"), ephemeral=True)
|
||||
except NotFound:
|
||||
pass
|
||||
|
||||
if delete_messages is None:
|
||||
delete_messages_seconds = 0
|
||||
else:
|
||||
delete_messages_seconds = delete_messages.value
|
||||
|
||||
response_message = await ctx.send(f"{target.mention} has been {cls.verb}!\n{bold('Reason:')} {inline(reason)}")
|
||||
|
||||
if silent is True:
|
||||
try:
|
||||
embed = await message_factory(
|
||||
bot,
|
||||
await bot.get_embed_color(ctx.channel),
|
||||
ctx.guild,
|
||||
reason,
|
||||
cls.type,
|
||||
ctx.author,
|
||||
None,
|
||||
response_message
|
||||
)
|
||||
await target.send(embed=embed, file=get_icon(bot))
|
||||
except HTTPException:
|
||||
pass
|
||||
|
||||
await ctx.guild.ban(target, reason=f"Banned by {ctx.author.id} for: {reason}", delete_message_seconds=delete_messages_seconds)
|
||||
moderation = await Moderation.log(
|
||||
bot,
|
||||
ctx.guild.id,
|
||||
ctx.author.id,
|
||||
cls.type,
|
||||
'USER',
|
||||
target.id,
|
||||
None,
|
||||
None,
|
||||
reason
|
||||
)
|
||||
await response_message.edit(content=f"{target.mention} has been {cls.verb}! (Case {inline(f'#{moderation.id}')})\n{bold('Reason:')} {inline(reason)}")
|
||||
await log(ctx, moderation.id)
|
||||
await send_evidenceformat(ctx, moderation.id)
|
||||
return cls
|
||||
|
||||
@classmethod
|
||||
async def resolve_handler(cls, bot: Red, guild: Guild, target: Member, reason: str):
|
||||
try:
|
||||
await guild.fetch_ban(user=target)
|
||||
except NotFound:
|
||||
return
|
||||
await guild.unban(user=target, reason=reason)
|
||||
|
||||
try:
|
||||
embed = await message_factory(
|
||||
bot,
|
||||
await bot.get_embed_color(guild.channels[0]),
|
||||
guild,
|
||||
reason,
|
||||
'unban',
|
||||
None,
|
||||
None,
|
||||
None
|
||||
)
|
||||
await target.send(embed=embed, file=get_icon(bot))
|
||||
except HTTPException:
|
||||
pass
|
||||
|
||||
@type_registry.register(key="tempban")
|
||||
class Tempban(Ban):
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.type="tempban"
|
||||
self.verb="tempbanned"
|
||||
|
||||
@classmethod
|
||||
async def handler(cls, ctx: commands.Context, target: Member | User, silent: bool, duration: str, reason: str = None, delete_messages: app_commands.Choice | None = None) -> 'Ban':
|
||||
"""Ban a user."""
|
||||
bot = ctx.bot
|
||||
try:
|
||||
await ctx.guild.fetch_ban(target)
|
||||
await ctx.send(content=error(f"{target.mention} is already banned!"), ephemeral=True)
|
||||
except NotFound:
|
||||
pass
|
||||
|
||||
if delete_messages is None:
|
||||
delete_messages_seconds = 0
|
||||
else:
|
||||
delete_messages_seconds = delete_messages.value
|
||||
|
||||
parsed_time = parse_relativedelta(duration)
|
||||
if not parsed_time:
|
||||
await ctx.send(content=error("Please provide a valid duration!"), ephemeral=True)
|
||||
try:
|
||||
parsed_time = timedelta_from_relativedelta(parsed_time)
|
||||
except ValueError:
|
||||
await ctx.send(content=error("Please provide a valid duration!"), ephemeral=True)
|
||||
|
||||
response_message = await ctx.send(f"{target.mention} has been {cls.verb} for {humanize_timedelta(parsed_time)}!\n{bold('Reason:')} {inline(reason)}")
|
||||
|
||||
if silent is True:
|
||||
try:
|
||||
embed = await message_factory(
|
||||
bot,
|
||||
await bot.get_embed_color(ctx.channel),
|
||||
ctx.guild,
|
||||
reason,
|
||||
cls.type,
|
||||
ctx.author,
|
||||
parsed_time,
|
||||
response_message
|
||||
)
|
||||
await target.send(embed=embed, file=get_icon(bot))
|
||||
except HTTPException:
|
||||
pass
|
||||
|
||||
await ctx.guild.ban(target, reason=f"Tempbanned by {ctx.author.id} for: {reason} (Duration: {parsed_time})", delete_message_seconds=delete_messages_seconds)
|
||||
moderation = await Moderation.log(
|
||||
bot,
|
||||
ctx.guild.id,
|
||||
ctx.author.id,
|
||||
cls.type,
|
||||
'USER',
|
||||
target.id,
|
||||
None,
|
||||
parsed_time,
|
||||
reason
|
||||
)
|
||||
await response_message.edit(content=f"{target.mention} has been {cls.verb} for {humanize_timedelta(parsed_time)}! (Case {inline(f'#{moderation.id}')})\n{bold('Reason:')} {inline(reason)}")
|
||||
await log(ctx, moderation.id)
|
||||
await send_evidenceformat(ctx, moderation.id)
|
||||
return cls
|
18
aurora/models/type.py
Normal file
18
aurora/models/type.py
Normal file
|
@ -0,0 +1,18 @@
|
|||
|
||||
from discord import Member, User
|
||||
from redbot.core import commands
|
||||
|
||||
|
||||
class Type(object):
|
||||
def __init__(self) -> None:
|
||||
self.type = None
|
||||
self.verb = None
|
||||
self.embed_desc = "been"
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.type
|
||||
|
||||
@classmethod
|
||||
async def handler(cls, ctx: commands.Context, target: Member | User, silent: bool, **kwargs) -> 'Type': # pylint: disable=unused-argument
|
||||
"""This method should be overridden by any child classes, but should retain the same starting keyword arguments."""
|
||||
raise NotImplementedError
|
Loading…
Add table
Add a link
Reference in a new issue