1
Fork 0
mirror of https://github.com/allthingslinux/tux.git synced 2024-10-02 16:43:12 +00:00

refactor(moderation): move jail conditions check from ModerationCogBase to Jail class

fix(jail.py): ensure jail role is added to member even if no roles are removed
perf(case.py): optimize case creation by storing next case number in a variable
This commit is contained in:
kzndotsh 2024-09-05 15:38:43 +00:00
parent 23eaa94e90
commit 9f0c5cb5ae
3 changed files with 29 additions and 47 deletions

View file

@ -171,45 +171,6 @@ class ModerationCogBase(commands.Cog):
return True
async def check_jail_conditions(
self,
ctx: commands.Context[Tux],
user: discord.Member,
) -> tuple[bool, discord.Role | None, discord.abc.GuildChannel | None]:
"""
Validate jail role and channel existence and member condition.
Parameters
----------
ctx : commands.Context[Tux]
The context of the command.
user : discord.Member
The member to jail.
Returns
-------
tuple
A tuple containing a boolean indicating success, the jail role, and the jail channel.
"""
assert ctx.guild
jail_role_id = await self.config.get_jail_role_id(ctx.guild.id)
jail_role = ctx.guild.get_role(jail_role_id) if jail_role_id else None
jail_channel_id = await self.config.get_jail_channel_id(ctx.guild.id)
jail_channel = ctx.guild.get_channel(jail_channel_id) if jail_channel_id else None
if jail_role is None:
await ctx.send("The jail role has been deleted or not set up.", delete_after=30, ephemeral=True)
return False, None, None
if jail_channel is None:
await ctx.send("The jail channel has been deleted or not set up.", delete_after=30, ephemeral=True)
return False, None, None
if jail_role in user.roles:
await ctx.send("The user is already jailed.", delete_after=30, ephemeral=True)
return False, None, None
return True, jail_role, jail_channel
async def handle_case_response(
self,
ctx: commands.Context[Tux],

View file

@ -21,7 +21,7 @@ class Jail(ModerationCogBase):
)
@commands.guild_only()
@checks.has_pl(2)
async def jail(
async def jail( # noqa: PLR0911
self,
ctx: commands.Context[Tux],
member: discord.Member,
@ -48,22 +48,42 @@ class Jail(ModerationCogBase):
if not await self.check_conditions(ctx, member, moderator, "jail"):
return
is_valid, jail_role, jail_channel = await self.check_jail_conditions(ctx, member)
if not is_valid:
jail_role_id = await self.config.get_jail_role_id(ctx.guild.id)
if jail_role_id is None:
await ctx.send("The jail role has not been set up.", delete_after=30, ephemeral=True)
return
jail_role = ctx.guild.get_role(jail_role_id) if jail_role_id else None
if jail_role is None:
await ctx.send("The jail role cannot be found.", delete_after=30, ephemeral=True)
assert jail_role
jail_channel_id = await self.config.get_jail_channel_id(ctx.guild.id)
if jail_channel_id is None:
await ctx.send("The jail channel has not been set up.", delete_after=30, ephemeral=True)
return
jail_channel = ctx.guild.get_channel(jail_channel_id) if jail_channel_id else None
if jail_channel is None:
await ctx.send("The jail channel cannot be found.", delete_after=30, ephemeral=True)
return
if jail_role in member.roles:
await ctx.send("The user is already jailed.", delete_after=30, ephemeral=True)
return
assert jail_role is not None
assert jail_channel is not None
user_roles: list[discord.Role] = self._get_manageable_roles(member, jail_role)
case_user_roles = [role.id for role in user_roles]
try:
case = await self.db.case.insert_case(
guild_id=ctx.guild.id,
case_user_id=member.id,
case_moderator_id=ctx.author.id,
case_type=CaseType.JAIL,
case_reason=flags.reason,
guild_id=ctx.guild.id,
case_user_roles=case_user_roles,
)
@ -75,7 +95,7 @@ class Jail(ModerationCogBase):
try:
if user_roles:
await member.remove_roles(*user_roles, reason=flags.reason, atomic=False)
await member.add_roles(jail_role, reason=flags.reason)
await member.add_roles(jail_role, reason=flags.reason)
except (discord.Forbidden, discord.HTTPException) as e:
logger.error(f"Failed to jail {member}. {e}")

View file

@ -110,11 +110,12 @@ class CaseController:
"""
await self.ensure_guild_exists(guild_id)
await self.increment_case_count(guild_id)
case_number = await self.get_next_case_number(guild_id)
return await self.table.create(
data={
"guild_id": guild_id,
"case_number": await self.get_next_case_number(guild_id),
"case_number": case_number,
"case_user_id": case_user_id,
"case_moderator_id": case_moderator_id,
"case_type": case_type,