Skip to content
Merged
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
e4b1cfe
implement get strikes command
MattyTheHacker Apr 14, 2025
62b1e84
move the ignore
MattyTheHacker Apr 14, 2025
0503c78
Fix this
MattyTheHacker Apr 14, 2025
d094358
Fix using wrong field
MattyTheHacker Apr 14, 2025
826a25b
try something else
MattyTheHacker Apr 14, 2025
a0d3d22
Add some debug
MattyTheHacker Apr 14, 2025
92100df
fix mypy
MattyTheHacker Apr 14, 2025
e5b5ffe
getting better
MattyTheHacker Apr 14, 2025
bfab1d2
i literally hate these precommits
MattyTheHacker Apr 14, 2025
c265d58
minor refactor
MattyTheHacker Apr 14, 2025
6795cef
Add delete-all strikes command
MattyTheHacker Apr 14, 2025
0ab4fa4
refactor to handle exceptions
MattyTheHacker Apr 14, 2025
08ec83f
make response ephemeral
MattyTheHacker Apr 14, 2025
caa2a66
Implement decrement strike command
MattyTheHacker Apr 14, 2025
b0ac12d
fix mypy
MattyTheHacker Apr 14, 2025
0de9e42
Add response for decremenet
MattyTheHacker Apr 14, 2025
4fefdb0
Update strike.py
MattyTheHacker Apr 14, 2025
cb13344
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker Apr 15, 2025
cd6c8d5
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker Apr 16, 2025
6f76d54
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker Apr 21, 2025
fee87e2
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker Apr 23, 2025
17805bd
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker Apr 24, 2025
512f70d
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker Apr 30, 2025
e9c778c
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker May 4, 2025
d6c4976
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker May 4, 2025
8b54c46
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker May 5, 2025
3ed4a50
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker May 6, 2025
a7fae4d
improve fetching of strike object
MattyTheHacker May 10, 2025
62786d7
add logging
MattyTheHacker May 10, 2025
ef7d3ab
minor fixes
MattyTheHacker May 10, 2025
fd5f42f
fix decrement object fetch
MattyTheHacker May 10, 2025
a945af9
[pre-commit.ci lite] apply automatic fixes
pre-commit-ci-lite[bot] May 10, 2025
186fee6
update old method too
MattyTheHacker May 10, 2025
ab7fac7
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker May 11, 2025
e6b7f11
fix ephemerality
MattyTheHacker May 11, 2025
b60617f
[pre-commit.ci lite] apply automatic fixes
pre-commit-ci-lite[bot] May 11, 2025
1837306
fix the f string stuff
MattyTheHacker May 11, 2025
ac25207
yeet the import
MattyTheHacker May 12, 2025
c2bbfbb
Merge branch 'main' into 71-strikes-functionality
MattyTheHacker May 12, 2025
3293478
revert to use `asave`
MattyTheHacker May 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion cogs/delete_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@

import discord

from db.core.models import AssignedCommitteeAction, DiscordReminder, GroupMadeMember
from db.core.models import (
AssignedCommitteeAction,
DiscordMemberStrikes,
DiscordReminder,
GroupMadeMember,
)
from utils import CommandChecks, TeXBotBaseCog

if TYPE_CHECKING:
Expand Down Expand Up @@ -88,3 +93,18 @@ async def delete_all_actions(self, ctx: "TeXBotApplicationContext") -> None:
to delete all `Action` instance objects stored in the database.
"""
await self._delete_all(ctx, delete_model=AssignedCommitteeAction)

@delete_all.command(
name="strikes",
description="Deletes all the Strikes from the backend database.",
)
@CommandChecks.check_interaction_user_has_committee_role
@CommandChecks.check_interaction_user_in_main_guild
async def delete_all_strikes(self, ctx: "TeXBotApplicationContext") -> None:
"""
Definition & callback response of the "delete-all-strikes" command.

The "delete-all-strikes" command uses the _delete_all() function
to delete all `Strike` instance objects stored in the database.
"""
await self._delete_all(ctx, delete_model=DiscordMemberStrikes)
123 changes: 121 additions & 2 deletions cogs/strike.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,7 @@ async def _confirm_increase_strike(
raise TypeError(STRIKE_USER_TYPE_ERROR_MESSAGE)

if member_strikes.strikes < 3:
member_strikes.strikes += 1
await member_strikes.asave()
await member_strikes.aupdate(strikes=member_strikes.strikes + 1)
Comment thread
MattyTheHacker marked this conversation as resolved.
Outdated

await self._send_strike_user_message(strike_user, member_strikes)

Expand Down Expand Up @@ -870,6 +869,126 @@ async def strike(self, ctx: "TeXBotApplicationContext", str_strike_member_id: st

await self._command_perform_strike(ctx, strike_member)

@discord.slash_command( # type: ignore[misc, no-untyped-call]
name="get-strikes",
description="Get the number of strikes a user has.",
)
@discord.option( # type: ignore[misc, no-untyped-call]
name="user",
description="The user to check the number of strikes for.",
input_type=str,
autocomplete=discord.utils.basic_autocomplete(autocomplete_get_members), # type: ignore[arg-type]
required=True,
parameter_name="str_strike_member_id",
)
@CommandChecks.check_interaction_user_has_committee_role
@CommandChecks.check_interaction_user_in_main_guild
async def get_strikes( # type: ignore[misc]
self, ctx: "TeXBotApplicationContext", str_strike_member_id: str
) -> None:
"""
Define method and callback response of of the "get-strikes" command.

Responds with the number of strikes a user has.
"""
try:
strike_member: discord.Member = await self.bot.get_member_from_str_id(
str_member_id=str_strike_member_id
)
except ValueError as member_id_not_integer_error:
await self.command_send_error(ctx, message=member_id_not_integer_error.args[0])
return

strikes_count: int = 0
try:
strikes_count = (
await DiscordMemberStrikes.objects.aget(discord_id=strike_member.id)
).strikes
except DiscordMemberStrikes.DoesNotExist:
logger.debug("No strikes found for user %s", strike_member)

await ctx.respond(
content=(f"User {strike_member.mention} has {strikes_count} strikes."),
ephemeral=True,
)

@discord.slash_command( # type: ignore[misc, no-untyped-call]
name="decrement-strikes",
description="Remove a single strike from a user.",
)
@discord.option( # type: ignore[misc, no-untyped-call]
name="user",
description="The user to remove a strike from.",
input_type=str,
autocomplete=discord.utils.basic_autocomplete(autocomplete_get_members), # type: ignore[arg-type]
required=True,
parameter_name="str_strike_member_id",
)
async def decrement_strikes( # type: ignore[misc]
self, ctx: "TeXBotApplicationContext", str_strike_member_id: str
) -> None:
"""
Definition & callback response of the "decrement-strikes" command.

The "decrement-strikes" command removes a strike from the given member.
If the member only has one strike, the corresponding `DiscordMemberStrikes`
object will be deleted from the database.
"""
try:
strike_member: discord.Member = await self.bot.get_member_from_str_id(
str_member_id=str_strike_member_id,
)
except ValueError as member_id_not_integer_error:
await self.command_send_error(ctx, message=member_id_not_integer_error.args[0])
return

try:
discord_member_strikes: DiscordMemberStrikes = (
await DiscordMemberStrikes.objects.aget(discord_id=strike_member.id)
)
except DiscordMemberStrikes.DoesNotExist:
await ctx.respond(
content=(
":information_source: No action taken. "
f"User {strike_member.mention} does not have any strikes to remove!"
),
ephemeral=True,
)
logger.info(
"%s attempted to remove a strike from user %s, but they had none",
ctx.user,
strike_member,
)
return

if discord_member_strikes.strikes <= 1:
await discord_member_strikes.adelete()
await ctx.respond(
content=f"Successfully removed all strikes from {strike_member.mention}.",
ephemeral=True,
)
logger.info(
"%s removed all strikes from user %s",
ctx.user,
strike_member,
)
return

await discord_member_strikes.aupdate(strikes=discord_member_strikes.strikes - 1)
Comment thread
MattyTheHacker marked this conversation as resolved.
Outdated
await ctx.respond(
content=(
f"Successfully removed a strike from {strike_member.mention}. "
f"User now has {discord_member_strikes.strikes} strikes."
),
ephemeral=True,
)
logger.info(
"%s removed 1 strike from user %s, they now have %s",
ctx.user,
strike_member,
discord_member_strikes.strikes,
)


class StrikeContextCommandsCog(BaseStrikeCog):
"""Cog class that defines the context menu strike command and its call-back method."""
Expand Down