From 264e7b5300c1eb5bd9191847c278813eaa55c3b2 Mon Sep 17 00:00:00 2001 From: Stijn De Clercq Date: Fri, 17 Feb 2023 00:35:40 +0100 Subject: [PATCH 1/3] Tidy up events a bit --- didier/cogs/discord.py | 7 ++++--- didier/utils/timer.py | 8 ++++++-- settings.py | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/didier/cogs/discord.py b/didier/cogs/discord.py index ab00717..c7b63fb 100644 --- a/didier/cogs/discord.py +++ b/didier/cogs/discord.py @@ -63,10 +63,11 @@ class Discord(commands.Cog): return await self.client.log_error(f"Unable to find event with id {event_id}", log_to_discord=True) channel = self.client.get_channel(event.notification_channel) + human_readable_time = event.timestamp.strftime("%A, %B %d %Y - %H:%M") - embed = discord.Embed(title="Upcoming Events", colour=discord.Colour.blue()) - embed.add_field(name="Event", value=event.name, inline=False) - embed.description = event.description + embed = discord.Embed(title="Upcoming Event", colour=discord.Colour.blue()) + embed.description = f"{human_readable_time} ()" + embed.add_field(name=event.name, value=event.description, inline=False) await channel.send(embed=embed) diff --git a/didier/utils/timer.py b/didier/utils/timer.py index e5b216b..fda2cf7 100644 --- a/didier/utils/timer.py +++ b/didier/utils/timer.py @@ -1,9 +1,10 @@ import asyncio -from datetime import datetime +from datetime import datetime, timedelta from typing import Optional import discord.utils +import settings from database.crud.events import get_next_event from database.schemas import Event from didier import Didier @@ -12,6 +13,9 @@ from didier.utils.types.datetime import tz_aware_now __all__ = ["Timer"] +REMINDER_PREDELAY = timedelta(minutes=settings.REMINDER_PRE) + + class Timer: """Class for scheduled timers""" @@ -58,7 +62,7 @@ class Timer: async def end_timer(self, *, endtime: datetime, event_id: int): """Wait until a timer runs out, and then trigger an event to send the message""" - await discord.utils.sleep_until(endtime) + await discord.utils.sleep_until(endtime - REMINDER_PREDELAY) self.upcoming_timer = None self.upcoming_event_id = None self.client.dispatch("timer_end", event_id) diff --git a/settings.py b/settings.py index 3342ea0..32bd5e0 100644 --- a/settings.py +++ b/settings.py @@ -16,6 +16,7 @@ __all__ = [ "YEAR", "MENU_TIMEOUT", "EASTER_EGG_CHANCE", + "REMINDER_PRE", "POSTGRES_DB", "POSTGRES_USER", "POSTGRES_PASS", @@ -47,6 +48,7 @@ SEMESTER: int = env.int("SEMESTER", 2) YEAR: int = env.int("YEAR", 3) MENU_TIMEOUT: int = env.int("MENU_TIMEOUT", 30) EASTER_EGG_CHANCE: int = env.int("EASTER_EGG_CHANCE", 15) +REMINDER_PRE: int = env.int("REMINDER_PRE", 15) """Database""" # PostgreSQL From c0adc55be2d6acc89368044b2ca2c8fd52bac8f8 Mon Sep 17 00:00:00 2001 From: Stijn De Clercq Date: Fri, 17 Feb 2023 00:39:32 +0100 Subject: [PATCH 2/3] Make embed slightly nicer --- didier/cogs/discord.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/didier/cogs/discord.py b/didier/cogs/discord.py index c7b63fb..47224eb 100644 --- a/didier/cogs/discord.py +++ b/didier/cogs/discord.py @@ -65,9 +65,12 @@ class Discord(commands.Cog): channel = self.client.get_channel(event.notification_channel) human_readable_time = event.timestamp.strftime("%A, %B %d %Y - %H:%M") - embed = discord.Embed(title="Upcoming Event", colour=discord.Colour.blue()) - embed.description = f"{human_readable_time} ()" - embed.add_field(name=event.name, value=event.description, inline=False) + embed = discord.Embed(title=event.name, colour=discord.Colour.blue()) + embed.set_author(name="Upcoming Event") + embed.description = event.description + embed.add_field( + name="Time", value=f"{human_readable_time} ()", inline=False + ) await channel.send(embed=embed) From 1af7e241e236736c91dca1573d47894758f5c257 Mon Sep 17 00:00:00 2001 From: Stijn De Clercq Date: Fri, 17 Feb 2023 01:04:24 +0100 Subject: [PATCH 3/3] Small bugfix in timezone printing --- database/crud/events.py | 2 +- didier/cogs/discord.py | 4 ++-- didier/utils/types/datetime.py | 9 +++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/database/crud/events.py b/database/crud/events.py index 8636d1b..19887e6 100644 --- a/database/crud/events.py +++ b/database/crud/events.py @@ -47,4 +47,4 @@ async def get_events(session: AsyncSession, *, now: datetime.datetime) -> list[E async def get_next_event(session: AsyncSession, *, now: datetime.datetime) -> Optional[Event]: """Get the first upcoming event""" statement = select(Event).where(Event.timestamp > now).order_by(Event.timestamp) - return (await session.execute(statement)).scalar_one_or_none() + return (await session.execute(statement)).scalars().first() diff --git a/didier/cogs/discord.py b/didier/cogs/discord.py index 47224eb..4d9b423 100644 --- a/didier/cogs/discord.py +++ b/didier/cogs/discord.py @@ -19,7 +19,7 @@ from didier.utils.discord import colours from didier.utils.discord.assets import get_author_avatar, get_user_avatar from didier.utils.discord.constants import Limits from didier.utils.timer import Timer -from didier.utils.types.datetime import str_to_date, tz_aware_now +from didier.utils.types.datetime import localize, str_to_date, tz_aware_now from didier.utils.types.string import abbreviate, leading from didier.views.modals import CreateBookmark @@ -63,7 +63,7 @@ class Discord(commands.Cog): return await self.client.log_error(f"Unable to find event with id {event_id}", log_to_discord=True) channel = self.client.get_channel(event.notification_channel) - human_readable_time = event.timestamp.strftime("%A, %B %d %Y - %H:%M") + human_readable_time = localize(event.timestamp).strftime("%A, %B %d %Y - %H:%M") embed = discord.Embed(title=event.name, colour=discord.Colour.blue()) embed.set_author(name="Upcoming Event") diff --git a/didier/utils/types/datetime.py b/didier/utils/types/datetime.py index ed80c7a..23ad285 100644 --- a/didier/utils/types/datetime.py +++ b/didier/utils/types/datetime.py @@ -7,6 +7,7 @@ __all__ = [ "LOCAL_TIMEZONE", "forward_to_next_weekday", "int_to_weekday", + "localize", "parse_dm_string", "skip_weekends", "str_to_date", @@ -42,6 +43,14 @@ def int_to_weekday(number: int) -> str: # pragma: no cover # it's useless to wr return ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"][number] +def localize(dt_instance: datetime.datetime, *, default_timezone="UTC") -> datetime.datetime: + """Localize a datetime instance to my local timezone""" + if dt_instance.tzinfo is None: + dt_instance = dt_instance.replace(tzinfo=zoneinfo.ZoneInfo(default_timezone)) + + return dt_instance.astimezone(LOCAL_TIMEZONE) + + def parse_dm_string(argument: str) -> datetime.date: """Parse a string to [day]/[month]