From 3f4b0b294ece128d02ef919f5a6a7116e555b78c Mon Sep 17 00:00:00 2001 From: Jess <62964686+RainzDev@users.noreply.github.com> Date: Sun, 22 Jun 2025 11:41:57 -0400 Subject: [PATCH 01/12] removed tasks.loop & added call_later for better task scheduling --- tux/cogs/utility/remindme.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/remindme.py index b7f6662a5..a70b98eb9 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/remindme.py @@ -1,5 +1,6 @@ import contextlib import datetime +import asyncio import discord from discord.ext import commands, tasks @@ -16,25 +17,10 @@ class RemindMe(commands.Cog): def __init__(self, bot: Tux) -> None: self.bot = bot self.db = DatabaseController() - self.check_reminders.start() self.remindme.usage = generate_usage(self.remindme) - @tasks.loop(seconds=120) - async def check_reminders(self): - reminders = await self.db.reminder.get_unsent_reminders() - - try: - for reminder in reminders: - await self.send_reminder(reminder) - await self.db.reminder.update_reminder_status(reminder.reminder_id, sent=True) - logger.debug(f'Status of reminder {reminder.reminder_id} updated to "sent".') - - except Exception as e: - logger.error(f"Error sending reminders: {e}") - - async def send_reminder(self, reminder: Reminder) -> None: - user = self.bot.get_user(reminder.reminder_user_id) + async def send_reminder(self, user: discord.User, reminder: Reminder) -> None: if user is not None: embed = EmbedCreator.create_embed( bot=self.bot, @@ -69,9 +55,10 @@ async def send_reminder(self, reminder: Reminder) -> None: f"Failed to send reminder {reminder.reminder_id}, user with ID {reminder.reminder_user_id} not found.", ) - @check_reminders.before_loop - async def before_check_reminders(self): - await self.bot.wait_until_ready() + try: + await self.db.reminder.delete_reminder_by_id(reminder.reminder_id) + except Exception as e: + logger.error(f"Failed to delete reminder: {e}") @commands.hybrid_command( name="remindme", @@ -120,7 +107,7 @@ async def remindme( expires_at = datetime.datetime.now(datetime.UTC) + datetime.timedelta(seconds=seconds) try: - await self.db.reminder.insert_reminder( + reminder_obj = await self.db.reminder.insert_reminder( reminder_user_id=ctx.author.id, reminder_content=reminder, reminder_expires_at=expires_at, @@ -154,6 +141,8 @@ async def remindme( logger.error(f"Error creating reminder: {e}") + self.bot.loop.call_later(seconds, asyncio.create_task, self.send_reminder(ctx.author, reminder_obj)) + await ctx.reply(embed=embed, ephemeral=True) From 38896fb32f55b3551d60cd4ce35af79766aa9da1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 22 Jun 2025 15:49:38 +0000 Subject: [PATCH 02/12] style: auto fixes from pre-commit hooks --- tux/cogs/utility/remindme.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/remindme.py index a70b98eb9..7f7724ab6 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/remindme.py @@ -1,9 +1,9 @@ +import asyncio import contextlib import datetime -import asyncio import discord -from discord.ext import commands, tasks +from discord.ext import commands from loguru import logger from prisma.models import Reminder @@ -19,7 +19,6 @@ def __init__(self, bot: Tux) -> None: self.db = DatabaseController() self.remindme.usage = generate_usage(self.remindme) - async def send_reminder(self, user: discord.User, reminder: Reminder) -> None: if user is not None: embed = EmbedCreator.create_embed( From 317af790d618a9abe350d93a8e31ee6c717b473d Mon Sep 17 00:00:00 2001 From: Jess <62964686+RainzDev@users.noreply.github.com> Date: Sun, 22 Jun 2025 11:59:20 -0400 Subject: [PATCH 03/12] Update and rename remindme.py to added Member annotation --- tux/cogs/utility/{remindme.py => added Member annotation} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tux/cogs/utility/{remindme.py => added Member annotation} (98%) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/added Member annotation similarity index 98% rename from tux/cogs/utility/remindme.py rename to tux/cogs/utility/added Member annotation index 7f7724ab6..48f697e43 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/added Member annotation @@ -19,7 +19,7 @@ def __init__(self, bot: Tux) -> None: self.db = DatabaseController() self.remindme.usage = generate_usage(self.remindme) - async def send_reminder(self, user: discord.User, reminder: Reminder) -> None: + async def send_reminder(self, user: discord.User | discord.Member, reminder: Reminder) -> None: if user is not None: embed = EmbedCreator.create_embed( bot=self.bot, From 3f4d4cc410433331d82f1ddd4721b97e54cf6a85 Mon Sep 17 00:00:00 2001 From: Jess <62964686+RainzDev@users.noreply.github.com> Date: Sun, 22 Jun 2025 12:04:16 -0400 Subject: [PATCH 04/12] accidentally changed the file name --- tux/cogs/utility/{added Member annotation => remindme.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tux/cogs/utility/{added Member annotation => remindme.py} (100%) diff --git a/tux/cogs/utility/added Member annotation b/tux/cogs/utility/remindme.py similarity index 100% rename from tux/cogs/utility/added Member annotation rename to tux/cogs/utility/remindme.py From 5bcaa9d012608f401712bae6513d8c247d7afa72 Mon Sep 17 00:00:00 2001 From: Jess <62964686+RainzDev@users.noreply.github.com> Date: Sun, 22 Jun 2025 12:11:10 -0400 Subject: [PATCH 05/12] Update message and tried to remove the stupid pyright checker error --- tux/cogs/utility/remindme.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/remindme.py index 48f697e43..02854961a 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/remindme.py @@ -19,7 +19,12 @@ def __init__(self, bot: Tux) -> None: self.db = DatabaseController() self.remindme.usage = generate_usage(self.remindme) - async def send_reminder(self, user: discord.User | discord.Member, reminder: Reminder) -> None: + async def send_reminder(self, user_id: int, reminder: Reminder) -> None: + user = self.bot.get_user(user_id) + + if not user: + user = await self.bot.fetch_user(user_id) + if user is not None: embed = EmbedCreator.create_embed( bot=self.bot, @@ -125,8 +130,7 @@ async def remindme( embed.add_field( name="Note", - value="- If you have DMs closed, we will attempt to send it in this channel instead.\n" - "- The reminder may be delayed by up to 120 seconds due to the way Tux works.", + value="- If you have DMs closed, we will attempt to send it in this channel instead." ) except Exception as e: @@ -140,7 +144,7 @@ async def remindme( logger.error(f"Error creating reminder: {e}") - self.bot.loop.call_later(seconds, asyncio.create_task, self.send_reminder(ctx.author, reminder_obj)) + self.bot.loop.call_later(seconds, asyncio.create_task, self.send_reminder(ctx.author.id, reminder_obj)) await ctx.reply(embed=embed, ephemeral=True) From 36b5a2be8823a261c699112d6ad5f721192ee968 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:11:22 +0000 Subject: [PATCH 06/12] style: auto fixes from pre-commit hooks --- tux/cogs/utility/remindme.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/remindme.py index 02854961a..3390ddcc5 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/remindme.py @@ -24,7 +24,7 @@ async def send_reminder(self, user_id: int, reminder: Reminder) -> None: if not user: user = await self.bot.fetch_user(user_id) - + if user is not None: embed = EmbedCreator.create_embed( bot=self.bot, @@ -130,7 +130,7 @@ async def remindme( embed.add_field( name="Note", - value="- If you have DMs closed, we will attempt to send it in this channel instead." + value="- If you have DMs closed, we will attempt to send it in this channel instead.", ) except Exception as e: From 08dd51274a10f8edf6e3a0551451d3005bdb848f Mon Sep 17 00:00:00 2001 From: Jess <62964686+RainzDev@users.noreply.github.com> Date: Sun, 22 Jun 2025 12:13:05 -0400 Subject: [PATCH 07/12] Update remindme.py --- tux/cogs/utility/remindme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/remindme.py index 3390ddcc5..7f6e40747 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/remindme.py @@ -22,7 +22,7 @@ def __init__(self, bot: Tux) -> None: async def send_reminder(self, user_id: int, reminder: Reminder) -> None: user = self.bot.get_user(user_id) - if not user: + if user is None: user = await self.bot.fetch_user(user_id) if user is not None: From 52c1df971b655d4c1a312c21d8b1bb8a3dee86fc Mon Sep 17 00:00:00 2001 From: Jess <62964686+RainzDev@users.noreply.github.com> Date: Mon, 23 Jun 2025 16:06:02 -0400 Subject: [PATCH 08/12] added on_ready --- tux/cogs/utility/remindme.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/remindme.py index 7f6e40747..96be66037 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/remindme.py @@ -1,9 +1,9 @@ -import asyncio import contextlib import datetime +import asyncio import discord -from discord.ext import commands +from discord.ext import commands, tasks from loguru import logger from prisma.models import Reminder @@ -18,13 +18,11 @@ def __init__(self, bot: Tux) -> None: self.bot = bot self.db = DatabaseController() self.remindme.usage = generate_usage(self.remindme) + self._initialized = False - async def send_reminder(self, user_id: int, reminder: Reminder) -> None: - user = self.bot.get_user(user_id) - - if user is None: - user = await self.bot.fetch_user(user_id) + async def send_reminder(self, reminder: Reminder) -> None: + user = self.bot.get_user(reminder.reminder_user_id) if user is not None: embed = EmbedCreator.create_embed( bot=self.bot, @@ -64,6 +62,25 @@ async def send_reminder(self, user_id: int, reminder: Reminder) -> None: except Exception as e: logger.error(f"Failed to delete reminder: {e}") + @commands.Cog.listener() + async def on_ready(self) -> None: + if self._initialized: + return + + self._initialized = True + + reminders = await self.db.reminder.get_all_reminders() + dt_now = datetime.datetime.now(datetime.UTC) + + for reminder in reminders: + seconds = (reminder.reminder_expires_at - dt_now).total_seconds() + + if seconds <= 0: + await self.send_reminder(reminder) + continue + + self.bot.loop.call_later(seconds, asyncio.create_task, self.send_reminder(reminder)) + @commands.hybrid_command( name="remindme", description="Set a reminder for yourself", @@ -130,7 +147,7 @@ async def remindme( embed.add_field( name="Note", - value="- If you have DMs closed, we will attempt to send it in this channel instead.", + value="- If you have DMs closed, we will attempt to send it in this channel instead.\n" ) except Exception as e: @@ -144,7 +161,7 @@ async def remindme( logger.error(f"Error creating reminder: {e}") - self.bot.loop.call_later(seconds, asyncio.create_task, self.send_reminder(ctx.author.id, reminder_obj)) + self.bot.loop.call_later(seconds, asyncio.create_task, self.send_reminder(reminder_obj)) await ctx.reply(embed=embed, ephemeral=True) From eac4e9da59890aeb908d804e98501b5da3ca4c90 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 20:06:15 +0000 Subject: [PATCH 09/12] style: auto fixes from pre-commit hooks --- tux/cogs/utility/remindme.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/remindme.py index 96be66037..82e9266e4 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/remindme.py @@ -1,9 +1,9 @@ +import asyncio import contextlib import datetime -import asyncio import discord -from discord.ext import commands, tasks +from discord.ext import commands from loguru import logger from prisma.models import Reminder @@ -20,7 +20,6 @@ def __init__(self, bot: Tux) -> None: self.remindme.usage = generate_usage(self.remindme) self._initialized = False - async def send_reminder(self, reminder: Reminder) -> None: user = self.bot.get_user(reminder.reminder_user_id) if user is not None: @@ -68,7 +67,7 @@ async def on_ready(self) -> None: return self._initialized = True - + reminders = await self.db.reminder.get_all_reminders() dt_now = datetime.datetime.now(datetime.UTC) @@ -147,7 +146,7 @@ async def remindme( embed.add_field( name="Note", - value="- If you have DMs closed, we will attempt to send it in this channel instead.\n" + value="- If you have DMs closed, we will attempt to send it in this channel instead.\n", ) except Exception as e: From 2c7af6a7a4f6be7b82f9e6d32aeb5dedd32c36bd Mon Sep 17 00:00:00 2001 From: Jess <62964686+RainzDev@users.noreply.github.com> Date: Mon, 23 Jun 2025 16:24:32 -0400 Subject: [PATCH 10/12] fixed unbound error --- tux/cogs/utility/remindme.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tux/cogs/utility/remindme.py b/tux/cogs/utility/remindme.py index 82e9266e4..728127910 100644 --- a/tux/cogs/utility/remindme.py +++ b/tux/cogs/utility/remindme.py @@ -135,6 +135,8 @@ async def remindme( guild_id=ctx.guild.id if ctx.guild else 0, ) + self.bot.loop.call_later(seconds, asyncio.create_task, self.send_reminder(reminder_obj)) + embed = EmbedCreator.create_embed( bot=self.bot, embed_type=EmbedCreator.SUCCESS, @@ -160,8 +162,6 @@ async def remindme( logger.error(f"Error creating reminder: {e}") - self.bot.loop.call_later(seconds, asyncio.create_task, self.send_reminder(reminder_obj)) - await ctx.reply(embed=embed, ephemeral=True) From cfc5c8cc6c28602ea8ee8e9cab9c3f9cdd5ef419 Mon Sep 17 00:00:00 2001 From: Jess <62964686+RainzDev@users.noreply.github.com> Date: Mon, 23 Jun 2025 16:31:20 -0400 Subject: [PATCH 11/12] remove unnecessary function --- tux/database/controllers/reminder.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tux/database/controllers/reminder.py b/tux/database/controllers/reminder.py index 4d80a3c16..15dea1e83 100644 --- a/tux/database/controllers/reminder.py +++ b/tux/database/controllers/reminder.py @@ -43,20 +43,6 @@ async def get_reminder_by_id(self, reminder_id: int) -> Reminder | None: """ return await self.find_unique(where={"reminder_id": reminder_id}) - async def get_unsent_reminders(self) -> list[Reminder]: - """Get all unsent reminders that have expired. - - This method finds reminders that should be sent to users - because their expiration time has passed. - - Returns - ------- - list[Reminder] - List of unsent expired reminders - """ - now = datetime.now(UTC) - return await self.find_many(where={"reminder_sent": False, "reminder_expires_at": {"lte": now}}) - async def insert_reminder( self, reminder_user_id: int, From e063768057037b19ef0933085f4aac7a86a44a18 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 20:31:41 +0000 Subject: [PATCH 12/12] style: auto fixes from pre-commit hooks --- tux/database/controllers/reminder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tux/database/controllers/reminder.py b/tux/database/controllers/reminder.py index 15dea1e83..77a09001d 100644 --- a/tux/database/controllers/reminder.py +++ b/tux/database/controllers/reminder.py @@ -1,4 +1,4 @@ -from datetime import UTC, datetime +from datetime import datetime from prisma.actions import GuildActions from prisma.models import Guild, Reminder