Skip to content
This repository was archived by the owner on Jan 13, 2026. It is now read-only.
Open
Changes from 1 commit
Commits
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
39 changes: 39 additions & 0 deletions src/capy_app/frontend/cogs/onboarding/sayed_onboarding_cog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import discord
import logging
from discord.ext import commands
from discord import app_commands

from frontend import config_colors as colors
from config import settings
import asyncio


class SayedCog(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
self.logger = logging.getLogger(
f"discord.cog.{self.__class__.__name__.lower()}"
)

@app_commands.guilds(discord.Object(id=settings.DEBUG_GUILD_ID))
@app_commands.command(name="countdown", description="Counts down the input seconds to 0. Allowed range is 1-30 seconds.")
async def countdown(self, interaction: discord.Interaction, seconds: int):
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Use app_commands.Range to enforce input bounds

This approach removes the need for a manual range check and leverages built-in validation.

if seconds < 1 or seconds > 30:
await interaction.response.send_message(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Consider using a deferred response for long-running operations

Deferring the interaction prevents timeouts and lets you handle the countdown asynchronously.

"Please provide a number between 1 and 30 seconds.",
ephemeral=True,
)
return
await interaction.response.send_message(
f"Counting down from {seconds} seconds...",
ephemeral=True,
)

for i in range(seconds, 0, -1):
await asyncio.sleep(1)
await interaction.edit_original_response(content=f"{i}...")
await asyncio.sleep(1)
await interaction.edit_original_response(content="Time's up!")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (bug_risk): Handle potential failures when editing the response

Wrap each edit_original_response call in a try/except block to handle possible discord.HTTPException errors and prevent the countdown from crashing.

Suggested change
for i in range(seconds, 0, -1):
await asyncio.sleep(1)
await interaction.edit_original_response(content=f"{i}...")
await asyncio.sleep(1)
await interaction.edit_original_response(content="Time's up!")
import discord # Ensure discord is imported for HTTPException
for i in range(seconds, 0, -1):
await asyncio.sleep(1)
try:
await interaction.edit_original_response(content=f"{i}...")
except discord.HTTPException as e:
# Optionally log the error or handle it as needed
print(f"Failed to edit response during countdown: {e}")
break
await asyncio.sleep(1)
try:
await interaction.edit_original_response(content="Time's up!")
except discord.HTTPException as e:
print(f"Failed to edit response at end of countdown: {e}")


async def setup(bot: commands.Bot):
await bot.add_cog(SayedCog(bot))