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

Added a set_tempban_expired and get_expired_tempbans function and changed up tempban a bit

This commit is contained in:
petabyte-imo 2024-09-04 17:48:13 +01:00
parent c035205c1f
commit bbd8fb62aa
3 changed files with 81 additions and 50 deletions

View file

@ -11,14 +11,13 @@ datasource db {
}
model Guild {
guild_id BigInt @id
guild_id BigInt @id @unique
guild_joined_at DateTime? @default(now())
cases Case[]
snippets Snippet[]
guild_config GuildConfig?
notes Note[]
reminders Reminder[]
guild_config GuildConfig[]
AFK AFKModel[]
snippets Snippet[]
Starboard Starboard?
StarboardMessage StarboardMessage[]
case_count BigInt @default(0)
@ -65,6 +64,7 @@ model Case {
case_number BigInt?
case_created_at DateTime? @default(now())
case_expires_at DateTime?
case_tempban_expired Boolean? @default(false)
guild_id BigInt
guild Guild @relation(fields: [guild_id], references: [guild_id])
@ -115,18 +115,6 @@ model Reminder {
@@index([reminder_id, guild_id])
}
model AFKModel {
member_id BigInt @id
nickname String
reason String
since DateTime @default(now())
guild_id BigInt
guild Guild @relation(fields: [guild_id], references: [guild_id])
@@unique([member_id, guild_id])
@@index([member_id])
}
model Starboard {
guild_id BigInt @id @unique
starboard_channel_id BigInt

View file

@ -54,7 +54,7 @@ class TempBan(ModerationCogBase):
return
moderator = ctx.author
duration = parse_time_string(f"{flags.expires_at}d")
duration = parse_time_string(f"{flags.expires_at}m")
expires_at = datetime.now(UTC) + duration
if not await self.check_conditions(ctx, member, moderator, "temporarily ban"):
@ -76,48 +76,50 @@ class TempBan(ModerationCogBase):
case_reason=flags.reason,
guild_id=ctx.guild.id,
case_expires_at=expires_at,
case_tempban_expired=False
)
await self.handle_case_response(ctx, CaseType.TEMPBAN, case.case_number, flags.reason, member)
@tasks.loop(minutes=30)
@tasks.loop(seconds=30)
async def tempban_check(self) -> None:
# Fetch all guilds and fetch all tempbans for each guild's ID
guilds = await self.db.guild.get_all_guilds()
tempbans = [await self.db.case.get_all_cases_by_type(guild.guild_id, CaseType.TEMPBAN) for guild in guilds]
# Here, we have 3 nested for loops because for some odd reason, tempbans is a list of a list of lists, very confusing ikr
# Get all expired tempbans
expired_temp_bans = await self.db.case.get_expired_tempbans()
logger.debug(f"Checking {len(expired_temp_bans)} expired tempbans. {expired_temp_bans}")
for temp_ban in expired_temp_bans:
#Debug Print
logger.debug(f"Unbanning user with ID {temp_ban.case_user_id} | Case number {temp_ban.case_number}")
guild = self.bot.get_guild(temp_ban.guild_id)
for tempban in tempbans:
for cases in tempbans:
for case in cases:
# Check if the case has expired
if case.case_expires_at < datetime.now(UTC):
# Get the guild, if that doesnt work then fetch it instead
guild = self.bot.get_guild(case.guild_id)
if guild is None:
#Debug Print
logger.debug(f"Fetching guild with ID {temp_ban.guild_id}")
try:
guild = await self.bot.fetch_guild(case.guild_id)
guild = await self.bot.fetch_guild(temp_ban.guild_id)
except (discord.Forbidden, discord.HTTPException) as e:
logger.error(
f"Failed to unban user with ID {case.case_user_id} | Case number {case.case_number} | Issue: Failed to get guild with ID {case.guild_id}. {e}",
f"Failed to unban user with ID {temp_ban.case_user_id} | Case number {temp_ban.case_number} | Issue: Failed to get guild with ID {temp_ban.guild_id}. {e}",
)
return
else:
logger.debug(f"Found guild with ID {temp_ban.guild_id}")
try:
# Unban the user
guild_bans = guild.bans()
async for ban_entry in guild_bans:
if ban_entry.user.id == case.case_user_id:
if ban_entry.user.id == temp_ban.case_user_id:
await guild.unban(ban_entry.user, reason="Tempban expired")
await self.db.case.set_tempban_expired(temp_ban.case_number, temp_ban.guild_id)
except (discord.Forbidden, discord.HTTPException) as e:
logger.error(
f"Failed to unban user with ID {case.case_user_id} | Case number {case.case_number} Issue: Failed to unban user. {e}",
f"Faile+d to unban user with ID {temp_ban.case_user_id} | Case number {temp_ban.case_number} Issue: Failed to unban user. {e}",
)
return
#Debug Print
logger.debug(f"Unbanned user with ID {temp_ban.case_user_id} | Case number {temp_ban.case_number}")
async def setup(bot: Tux) -> None:

View file

@ -82,6 +82,7 @@ class CaseController:
case_reason: str,
case_user_roles: list[int] | None = None,
case_expires_at: datetime | None = None,
case_tempban_expired: bool = False,
) -> Case:
"""
Insert a case into the database.
@ -102,6 +103,8 @@ class CaseController:
The roles of the target of the case.
case_expires_at : datetime | None
The expiration date of the case.
case_tempban_expired : bool
Whether the tempban has expired (Use only for tempbans).
Returns
-------
@ -121,6 +124,7 @@ class CaseController:
"case_reason": case_reason,
"case_expires_at": case_expires_at,
"case_user_roles": case_user_roles if case_user_roles is not None else [],
"case_tempban_expired": case_tempban_expired,
},
)
@ -307,3 +311,40 @@ class CaseController:
if case is not None:
return await self.table.delete(where={"case_id": case.case_id})
return None
async def get_expired_tempbans(self) -> list[Case]:
"""
Get all cases that have expired tempbans.
Returns
-------
list[Case]
A list of cases of the type in the guild.
"""
return await self.table.find_many(
where={
"case_type": CaseType.TEMPBAN,
"case_expires_at": {"lt": datetime.now()},
"case_tempban_expired": False
}
)
async def set_tempban_expired(self, case_number: int, guild_id: int) -> Case | None:
"""
Set a tempban case as expired.
Parameters
----------
case_number : int
The number of the case to delete.
guild_id : int
The ID of the guild to delete the case in.
Returns
-------
Case | None
The case if found and deleted, otherwise None.
"""
return await self.table.update(
where={"case_number": case_number, "guild_id": guild_id},
data={"case_tempban_expired": True}
)