From b39de87e4ba6bdadbd5a9507a3ab865d0c29d8ad Mon Sep 17 00:00:00 2001 From: Gabriella Date: Thu, 16 Oct 2025 16:06:22 -0600 Subject: [PATCH 01/23] Add barebones "break" additions --- src/py/bot_core.py | 29 +++++++++++++++++++++++++++++ src/py/helper/db_helper.py | 20 ++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index 60043e0..d716911 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -247,6 +247,35 @@ async def callout(interaction: discord.Interaction, day: int, month: int, year: await interaction.response.send_message(f'{user_char_name} -- you added a callout for {callout_date} with reason: {reason}') await interaction.followup.send(f'{DATABASE_CONN.format_list_of_callouts(DATABASE_CONN.query_callouts(7))}') +@client.tree.command() +async def add_break(interaction: discord.Interaction, start_day: int, start_month: int, + start_year: int, end_day: int, end_month: int, end_year: int) -> None: + delete_invalidate() + cleanup_invalidate() + + uid = interaction.user.id + user_nick = interaction.user.display_name + user_char_name = DATABASE_CONN.return_char_name(uid) + + start_date: datetime.date = datetime.date(year=start_year, month=start_month, day=start_day) + end_date: datetime.date = datetime.date(year=end_year, month=end_month, day=end_day) + + # TODO send to DATABASE_CONN to add callout + try: + DATABASE_CONN.add_break(user_id=uid, break_start=start_date, break_end=end_date) + except UNIQUEVIOLATION: + await interaction.response.send_message(f'{user_char_name} -- you have already added a callout for {callout_date} with reason: {reason}') + except INVALIDDATETIMEFORMAT: + await interaction.response.send_message(f'{user_char_name} -- please format the date as the following format: MM/DD/YYYY') + except FOREIGNKEYVIOLATION: + await interaction.response.send_message(f'{user_nick} -- please register with the bot using the following command!\n`/registercharacter`\n Please use your in-game name!') + except helper.db_helper.DateTimeError: + await interaction.response.send_message(f'{user_nick}, you\'re trying to submit a callout for a time in the past! Please verify that this is what you want to do!') + except psycopg2.Error as e: + await interaction.response.send_message(f'{user_nick} -- an error has occured!\nNotifying <@{CONTRASTELLAR}> of this error. Error is as follows --\n{e}') + else: + await interaction.response.send_message(f'{user_char_name} -- you added a callout for {callout_date} with reason: {reason}') + @client.tree.command() async def remove_callout(interaction: discord.Interaction, day: int, month: int, year: int) -> None: diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index 42f3aa4..79e48c2 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -100,6 +100,15 @@ class DBHelper(): return cursor.fetchall() + def query_breaks(self) -> list: + self.__CONN = connect_config(self._config) + self.__CONN.autocommit = True + cursor = self.__CONN.cursor() + cursor.execute(f"SELECT * FROM breaks") + self.__CONN.commit() + + return cursor.fetchall() + def query_self_callouts(self, user_id: int, days: int = 365): self.__CONN = connect_config(self._config) self.__CONN.autocommit = True @@ -128,6 +137,17 @@ class DBHelper(): return + def add_break(self, user_id: int, break_start: datetime.date, break_end: datetime.date) -> None: + + self.__CONN = connect_config(self._config) + self.__CONN.autocommit = True + cursor = self.__CONN.cursor() + is_range: int = 1 + if break_start == break_end: + is_range = 0 + cursor.execute("INSERT INTO breaks (created_user, is_range, open_range, close_range) VALUES (%s, %s, %s, %s)", (user_id, is_range, break_start, break_end)) + + def remove_callout(self, user_id: int, callout: datetime.date) -> None: """Remove a callout based on user + date, which form the primary key in the db From 2bfe73a70346d9ffb1c0c31a675ebda0de799a63 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Thu, 16 Oct 2025 16:08:07 -0600 Subject: [PATCH 02/23] Add todo to db_helper_tests --- src/py/db_helper_tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/py/db_helper_tests.py b/src/py/db_helper_tests.py index 63380fd..d3ce16f 100644 --- a/src/py/db_helper_tests.py +++ b/src/py/db_helper_tests.py @@ -57,3 +57,5 @@ class TestClass(): callouts = self.DATABASE_CONN.query_callouts(days=7) formatted_callouts = self.DATABASE_CONN.format_list_of_callouts(callouts=callouts) assert formatted_callouts.__class__ is str + + # TODO write tests for the break addition/removal From 72b45d9ef8fa39d4fd3419931bc6cb6dbd799194 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Thu, 16 Oct 2025 16:08:27 -0600 Subject: [PATCH 03/23] remove old todo from bot_core --- src/py/bot_core.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index d716911..4b1675d 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -260,7 +260,6 @@ async def add_break(interaction: discord.Interaction, start_day: int, start_mont start_date: datetime.date = datetime.date(year=start_year, month=start_month, day=start_day) end_date: datetime.date = datetime.date(year=end_year, month=end_month, day=end_day) - # TODO send to DATABASE_CONN to add callout try: DATABASE_CONN.add_break(user_id=uid, break_start=start_date, break_end=end_date) except UNIQUEVIOLATION: From c563d745d17f18c9bb03873fbbaadcf8be6415ca Mon Sep 17 00:00:00 2001 From: Gabriella Date: Thu, 16 Oct 2025 16:11:24 -0600 Subject: [PATCH 04/23] Update try/except/else interaction responses --- src/py/bot_core.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index 4b1675d..60ea3de 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -263,17 +263,13 @@ async def add_break(interaction: discord.Interaction, start_day: int, start_mont try: DATABASE_CONN.add_break(user_id=uid, break_start=start_date, break_end=end_date) except UNIQUEVIOLATION: - await interaction.response.send_message(f'{user_char_name} -- you have already added a callout for {callout_date} with reason: {reason}') - except INVALIDDATETIMEFORMAT: - await interaction.response.send_message(f'{user_char_name} -- please format the date as the following format: MM/DD/YYYY') - except FOREIGNKEYVIOLATION: - await interaction.response.send_message(f'{user_nick} -- please register with the bot using the following command!\n`/registercharacter`\n Please use your in-game name!') + await interaction.response.send_message(f'{user_char_name} -- you have already added a break for {start_date} through {end_date}!') except helper.db_helper.DateTimeError: - await interaction.response.send_message(f'{user_nick}, you\'re trying to submit a callout for a time in the past! Please verify that this is what you want to do!') + await interaction.response.send_message(f'{user_nick}, you\'re trying to submit a break for a time in the past! Please verify that this is what you want to do!') except psycopg2.Error as e: await interaction.response.send_message(f'{user_nick} -- an error has occured!\nNotifying <@{CONTRASTELLAR}> of this error. Error is as follows --\n{e}') else: - await interaction.response.send_message(f'{user_char_name} -- you added a callout for {callout_date} with reason: {reason}') + await interaction.response.send_message(f'{user_char_name} -- you added a break for for {start_date} through {end_date}!') @client.tree.command() From b328d325f66c25996a3e197ce7cd68a19770569b Mon Sep 17 00:00:00 2001 From: Gabriella Date: Thu, 16 Oct 2025 16:13:19 -0600 Subject: [PATCH 05/23] Edit the self_callouts interaction.followup --- src/py/bot_core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index 60ea3de..d765498 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -306,7 +306,8 @@ async def self_callouts(interaction: discord.Interaction, days: int = 365) -> No await interaction.response.defer(thinking=True) callouts: list = DATABASE_CONN.query_self_callouts(user_id=uid, days=days) callouts: str = DATABASE_CONN.formatted_list_of_callouts(callouts) - await interaction.followup.send(f'Callouts for the next **{days}** for user **{DATABASE_CONN.return_char_name(uid)}**:\n{callouts}') + character_name: str = DATABASE_CONN.return_char_name(uid) + await interaction.followup.send(f'Callouts for the next **{days}** for user **{character_name}**:\n{callouts}') args: argparse.Namespace = parser.parse_args() From c19125894f0ca50e13f1adfca954d2b1d63287d4 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Thu, 16 Oct 2025 16:17:39 -0600 Subject: [PATCH 06/23] Edit contributing.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f122a5a..ab7cc51 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ This is primarily open-source so that others can implement the code that we've w Currently, we use GitHub actions to test the database portion of the codebase. It's a bit harder to test the Discord-centric commands otherwise. ## Submitting changes -Please send a [new GitHub Pull Request](https://github.com/contrastellar/raid-callouts/compare) with a clear list of what's been done! +Please send a [new Pull Request](https://git.contrastellar.com/contrastellar/raid-callouts/pulls) with a clear list of what's been done! When you send in a Pull Request (PR), we'll be super happy if you've made tests or otherwise commented your code clearly with what it does, and what libraries it uses in addition to our base libraries! Please always write a clear commit message for your commits. One-line messages are fine for smaller changes, but bigger changes should be more details! From a928fa54d40150bd0ca68f7798f81cc372ecdb92 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 10:40:39 -0600 Subject: [PATCH 07/23] Remove unused import from posting module --- src/py/bot_aux.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/py/bot_aux.py b/src/py/bot_aux.py index ef88cc3..66b54bc 100644 --- a/src/py/bot_aux.py +++ b/src/py/bot_aux.py @@ -6,7 +6,6 @@ This automation will be run on a daily basis, through a cron job + docker. @author: Gabriella 'contrastellar' Agathon """ import argparse -import os import discord import helper.db_helper From 26276b0989545d9a306aa2d959542160647815e7 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 10:41:20 -0600 Subject: [PATCH 08/23] Add remove_break method for db_helper.py --- src/py/helper/db_helper.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index 79e48c2..6bc482e 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -166,6 +166,23 @@ class DBHelper(): return + def remove_break(self, user_id: int, start_date: datetime.date) -> None: + """Remove a callout based on user + date, which form the primary key in the db + + Args: + user_id (int): The Discord UUID of the user removing something from the db + callout (datetime.datetime): The date of the callout + """ + self.__CONN = connect_config(self._config) + self.__CONN.autocommit = True + cursor = self.__CONN.cursor() + + cursor.execute("DELETE FROM breaks WHERE created_user = %s AND open_range = %s", (user_id, start_date)) + self.__CONN.commit() + + return + + def formatted_list_of_callouts(self, callouts: list) -> str: """Format the python list of callouts. From 5b58c6e8ea08d8530a8b2db6698d6fed9fdcb8ba Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 10:41:36 -0600 Subject: [PATCH 09/23] Add return to add_break for db_helper.py --- src/py/helper/db_helper.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index 6bc482e..093ca7f 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -147,6 +147,7 @@ class DBHelper(): is_range = 0 cursor.execute("INSERT INTO breaks (created_user, is_range, open_range, close_range) VALUES (%s, %s, %s, %s)", (user_id, is_range, break_start, break_end)) + return def remove_callout(self, user_id: int, callout: datetime.date) -> None: @@ -181,7 +182,7 @@ class DBHelper(): self.__CONN.commit() return - + def formatted_list_of_callouts(self, callouts: list) -> str: """Format the python list of callouts. From 6b2421e55ce5d456f5b99f79f03097e57677c08c Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 10:58:06 -0600 Subject: [PATCH 10/23] Add break-related tests --- src/py/db_helper_tests.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/py/db_helper_tests.py b/src/py/db_helper_tests.py index d3ce16f..5ab959e 100644 --- a/src/py/db_helper_tests.py +++ b/src/py/db_helper_tests.py @@ -59,3 +59,11 @@ class TestClass(): assert formatted_callouts.__class__ is str # TODO write tests for the break addition/removal + + def test_add_break(self) -> None: + today: datetime.date = datetime.date.today() + new_break = self.DATABASE_CONN.add_break(user_id=1, break_start=today, break_end=today) + assert new_break is None + + def test_remove_break(self) -> None: + today: datetime.date = datetime.date.today() From aca7358af85378db19cc994b18ab84073347c2db Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 10:58:25 -0600 Subject: [PATCH 11/23] Fix Boolean issue in add_break --- src/py/helper/db_helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index 093ca7f..6dad459 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -142,9 +142,9 @@ class DBHelper(): self.__CONN = connect_config(self._config) self.__CONN.autocommit = True cursor = self.__CONN.cursor() - is_range: int = 1 + is_range: bool = True if break_start == break_end: - is_range = 0 + is_range = False cursor.execute("INSERT INTO breaks (created_user, is_range, open_range, close_range) VALUES (%s, %s, %s, %s)", (user_id, is_range, break_start, break_end)) return From 9b7c70576b4cb15cac3fca49303bcd642fbef842 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:04:01 -0600 Subject: [PATCH 12/23] Finish remove_break test --- src/py/db_helper_tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/py/db_helper_tests.py b/src/py/db_helper_tests.py index 5ab959e..73d7843 100644 --- a/src/py/db_helper_tests.py +++ b/src/py/db_helper_tests.py @@ -67,3 +67,5 @@ class TestClass(): def test_remove_break(self) -> None: today: datetime.date = datetime.date.today() + remove_break = self.DATABASE_CONN.remove_break(user_id=1, start_date=today) + assert remove_break is None From 97a3ae22fa0dfc511739ea47774f6dbaa1eebc26 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:05:30 -0600 Subject: [PATCH 13/23] Remove todo message --- src/py/db_helper_tests.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/py/db_helper_tests.py b/src/py/db_helper_tests.py index 73d7843..dc166d2 100644 --- a/src/py/db_helper_tests.py +++ b/src/py/db_helper_tests.py @@ -58,8 +58,6 @@ class TestClass(): formatted_callouts = self.DATABASE_CONN.format_list_of_callouts(callouts=callouts) assert formatted_callouts.__class__ is str - # TODO write tests for the break addition/removal - def test_add_break(self) -> None: today: datetime.date = datetime.date.today() new_break = self.DATABASE_CONN.add_break(user_id=1, break_start=today, break_end=today) From 090d370ce1689707cdf4eb059d9937c0ebc5ba3a Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:08:19 -0600 Subject: [PATCH 14/23] Add remove_break command --- src/py/bot_core.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index d765498..6071ca7 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -287,6 +287,24 @@ async def remove_callout(interaction: discord.Interaction, day: int, month: int, await interaction.response.send_message(f'{user_char_name} removed a callout for {callout_date}') +@client.tree.command() +async def remove_break(interaction: discord.Interaction, day: int, month: int, year: int) -> None: + delete_invalidate() + cleanup_invalidate() + user_id = interaction.user.id + user_char_name = DATABASE_CONN.return_char_name(user_id) + break_date: datetime.date = datetime.date(year=year, month=month, day=day) + + try: + DATABASE_CONN.remove_break(user_id=user_id, break_date=break_date) + except psycopg2.Error: + await interaction.response.send_message(f'{user_char_name} -- no break was added for {break_date}') + else: + await interaction.response.send_message(f'{user_char_name} -- you removed the break starting on {break_date}') + + return + + @client.tree.command() async def schedule(interaction: discord.Interaction, days: int = DAYS_FOR_CALLOUTS) -> None: delete_invalidate() From 1315cb294f63fa8e72850e88123b9bd45e4da6e5 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:09:58 -0600 Subject: [PATCH 15/23] Add 'breaks' command to bot_core --- src/py/bot_core.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index 6071ca7..8be6d1c 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -315,6 +315,15 @@ async def schedule(interaction: discord.Interaction, days: int = DAYS_FOR_CALLOU await interaction.followup.send(f'Callouts for the next {days} days:\n{callouts}') return + +@client.tree.command() +async def breaks(interaction: discord.Interaction, days: int = 365) -> None: + delete_invalidate() + cleanup_invalidate() + await interaction.response.defer(thinking=True) + await interaction.response.send_message(str(DATABASE_CONN.query_breaks())) + + @client.tree.command() async def self_callouts(interaction: discord.Interaction, days: int = 365) -> None: delete_invalidate() From 41f1160fc393a34bd017122ca899ffb95dbb45c1 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:16:57 -0600 Subject: [PATCH 16/23] Bugfix: Change interaction to followup for `breaks()` in bot_core --- src/py/bot_core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index 8be6d1c..2fad5dd 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -321,7 +321,7 @@ async def breaks(interaction: discord.Interaction, days: int = 365) -> None: delete_invalidate() cleanup_invalidate() await interaction.response.defer(thinking=True) - await interaction.response.send_message(str(DATABASE_CONN.query_breaks())) + await interaction.followup.send(str(DATABASE_CONN.query_breaks())) @client.tree.command() From 933ab384e182baa09ee4a1060a01c5fe6844d5e9 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:18:56 -0600 Subject: [PATCH 17/23] Enhancement: edit ping command to use charname rather than UID --- src/py/bot_core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index 2fad5dd..fc4a3df 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -160,7 +160,8 @@ async def ping(interaction: discord.Interaction) -> None: delete_invalidate() cleanup_invalidate() user_id = interaction.user.id - await interaction.response.send_message(f'Pong! {user_id} -- the bot is active, please message contrastellar with issues!') + charname = DATABASE_CONN.return_char_name(uid=user_id) + await interaction.response.send_message(f'Pong! {charname} -- the bot is active, please message contrastellar with issues!') return From c1854cc893e1b0107329459ce5edbd59f971f0cf Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:32:00 -0600 Subject: [PATCH 18/23] `db_helper` addition: Add functionality to format list of breaks --- src/py/helper/db_helper.py | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index 6dad459..cf1e105 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -184,6 +184,58 @@ class DBHelper(): return + def formatted_list_of_breaks(self, breaks: list) -> str: + """Format the python list of breaks. + + Args: + breaks (list): The list that needs to be formatted + + Returns: + str: the list as an outputtable string + """ + length = len(breaks) + output: str = '' + + if length == 0: + return 'No breaks have been scheduled!' + + for entry in breaks: + + for item in range(4): + if item == 0: + output += f"Break submitted by: {self.return_char_name(entry[0])}" + + if item == 1: + # is_range boolean + if entry[1] == True: + # if it is a range, format as a range + output += f' • Break range: {entry[2]} until... ' + + else: + # if it is not a range, format as a single date + output += f' • Break date: {entry[2]}' + + if item == 2: + if entry[1] == True: + output += f'{entry[3]}.\n' + else: + output += '\n' + output += "END OF MESSAGE" + return output + + + def format_list_of_breaks(self, breaks: list) -> str: + """Format the list of breaks + + Args: + breaks (list): The list that needs to be formatted + + Returns: + str: The formatted list to the bot_core or bot_aux + """ + return self.formatted_list_of_breaks(breaks=breaks) + + def formatted_list_of_callouts(self, callouts: list) -> str: """Format the python list of callouts. From 7e5a6c35e0d3f98cf1cfc1130648b826b4b1fe6c Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:35:24 -0600 Subject: [PATCH 19/23] Enhancement: Update `db_helper` to take in days parameter --- src/py/helper/db_helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index cf1e105..90efcc6 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -100,11 +100,11 @@ class DBHelper(): return cursor.fetchall() - def query_breaks(self) -> list: + def query_breaks(self, days) -> list: self.__CONN = connect_config(self._config) self.__CONN.autocommit = True cursor = self.__CONN.cursor() - cursor.execute(f"SELECT * FROM breaks") + cursor.execute(f"SELECT * FROM breaks WHERE date >= NOW() - INTERVAL '1 day' and DATE <= NOW() + interval '{days} days' ORDER BY date ASC;") self.__CONN.commit() return cursor.fetchall() From 930919bbae4c8c87fcd25d4715b8d941fb91ffcd Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:35:50 -0600 Subject: [PATCH 20/23] Enhancement: `bot_core` breaks() now uses a formatted list --- src/py/bot_core.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/py/bot_core.py b/src/py/bot_core.py index fc4a3df..86f22f8 100644 --- a/src/py/bot_core.py +++ b/src/py/bot_core.py @@ -322,7 +322,10 @@ async def breaks(interaction: discord.Interaction, days: int = 365) -> None: delete_invalidate() cleanup_invalidate() await interaction.response.defer(thinking=True) - await interaction.followup.send(str(DATABASE_CONN.query_breaks())) + breaks: list = DATABASE_CONN.query_breaks(days=days) + break_output: str = DATABASE_CONN.format_list_of_breaks(breaks=breaks) + await interaction.followup.send(f'Breaks for the next {days} days:\n{break_output}') + return @client.tree.command() From 74bfe6c11662f7d6e8d56c17d2841c59a31ae242 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:40:49 -0600 Subject: [PATCH 21/23] Bugfix/db_helper: Fix bug with the query_break() --- src/py/helper/db_helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index 90efcc6..53e47a3 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -104,7 +104,7 @@ class DBHelper(): self.__CONN = connect_config(self._config) self.__CONN.autocommit = True cursor = self.__CONN.cursor() - cursor.execute(f"SELECT * FROM breaks WHERE date >= NOW() - INTERVAL '1 day' and DATE <= NOW() + interval '{days} days' ORDER BY date ASC;") + cursor.execute(f"SELECT * FROM breaks WHERE open_range >= NOW() - INTERVAL '1 day' and open_range <= NOW() + interval '{days} days' ORDER BY open_range ASC;") self.__CONN.commit() return cursor.fetchall() From ef24032b68e3c5c5fd930ac7294317e2d8198208 Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:45:20 -0600 Subject: [PATCH 22/23] Enhancement/db_helper: Clean up linebreaks --- src/py/helper/db_helper.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index 53e47a3..d2a3a7c 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -100,6 +100,7 @@ class DBHelper(): return cursor.fetchall() + def query_breaks(self, days) -> list: self.__CONN = connect_config(self._config) self.__CONN.autocommit = True @@ -109,6 +110,7 @@ class DBHelper(): return cursor.fetchall() + def query_self_callouts(self, user_id: int, days: int = 365): self.__CONN = connect_config(self._config) self.__CONN.autocommit = True @@ -137,6 +139,7 @@ class DBHelper(): return + def add_break(self, user_id: int, break_start: datetime.date, break_end: datetime.date) -> None: self.__CONN = connect_config(self._config) @@ -209,17 +212,18 @@ class DBHelper(): # is_range boolean if entry[1] == True: # if it is a range, format as a range - output += f' • Break range: {entry[2]} until... ' + output += f' • Break from: {entry[2]} until... ' else: # if it is not a range, format as a single date - output += f' • Break date: {entry[2]}' + output += f' • We are taking a break on: {entry[2]}' if item == 2: if entry[1] == True: output += f'{entry[3]}.\n' else: output += '\n' + output += "END OF MESSAGE" return output From 33e5df4dfe6859ad68f945b9730fc218a94acb2b Mon Sep 17 00:00:00 2001 From: Gabriella Date: Fri, 17 Oct 2025 11:47:40 -0600 Subject: [PATCH 23/23] Enhancement/db_helper: Add extra newline to end of message for `formatted_list_of_breaks` --- src/py/helper/db_helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/py/helper/db_helper.py b/src/py/helper/db_helper.py index d2a3a7c..0d8cf9e 100644 --- a/src/py/helper/db_helper.py +++ b/src/py/helper/db_helper.py @@ -224,7 +224,7 @@ class DBHelper(): else: output += '\n' - output += "END OF MESSAGE" + output += "\nEND OF MESSAGE" return output