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:
parent
23eaa94e90
commit
9f0c5cb5ae
3 changed files with 29 additions and 47 deletions
|
@ -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],
|
||||
|
|
|
@ -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}")
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue