Compare commits

...

3 commits

Author SHA1 Message Date
d83f933f1d Only yield matching tasks if the weekly cadence has been hit
All checks were successful
Test, Build and Publish / test (pull_request) Successful in 35s
Test, Build and Publish / build-and-push-images (pull_request) Successful in 1m12s
2024-09-22 12:20:55 +01:00
e9cccefacb Add cadence argument to the /schedule command
This allows setting the cadence, or changing it. When changing the initial start time will be reset
2024-09-22 12:09:59 +01:00
b86aaf7016 Add cadence values to the matchy tasks
cadence - Run this task every "x" weeks
cadence - Unix seconds timestamp for the start of this cadence
2024-09-22 11:57:44 +01:00
2 changed files with 35 additions and 7 deletions

View file

@ -110,7 +110,8 @@ class MatcherCog(commands.Cog):
interaction: discord.Interaction, interaction: discord.Interaction,
members_min: int | None = None, members_min: int | None = None,
weekday: int | None = None, weekday: int | None = None,
hour: int | None = None): hour: int | None = None,
cadence: int | None = None):
"""Schedule a match using the input parameters""" """Schedule a match using the input parameters"""
# Set all the defaults # Set all the defaults
@ -120,6 +121,8 @@ class MatcherCog(commands.Cog):
weekday = 0 weekday = 0
if hour is None: if hour is None:
hour = 9 hour = 9
if cadence is None:
cadence = 1
channel_id = str(interaction.channel.id) channel_id = str(interaction.channel.id)
# Bail if not a matcher # Bail if not a matcher
@ -130,11 +133,11 @@ class MatcherCog(commands.Cog):
# Add the scheduled task and save # Add the scheduled task and save
state.State.set_channel_match_task( state.State.set_channel_match_task(
channel_id, members_min, weekday, hour) channel_id, members_min, weekday, hour, cadence)
# Let the user know what happened # Let the user know what happened
logger.info("Scheduled new match task in %s with min %s weekday %s hour %s", logger.info("Scheduled new match task in %s with min %s weekday %s hour %s and cadence %s",
channel_id, members_min, weekday, hour) channel_id, members_min, weekday, hour, cadence)
next_run = util.get_next_datetime(weekday, hour) next_run = util.get_next_datetime(weekday, hour)
view = discord.ui.View(timeout=None) view = discord.ui.View(timeout=None)

View file

@ -16,7 +16,7 @@ logger = logging.getLogger("state")
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
# Warning: Changing any of the below needs proper thought to ensure backwards compatibility # Warning: Changing any of the below needs proper thought to ensure backwards compatibility
_VERSION = 4 _VERSION = 5
def _migrate_to_v1(d: dict): def _migrate_to_v1(d: dict):
@ -64,12 +64,24 @@ def _migrate_to_v4(d: dict):
del d[_Key._HISTORY] del d[_Key._HISTORY]
def _migrate_to_v5(d: dict):
"""v5 added weekly cadence"""
tasks = d.get(_Key.TASKS, {})
for tasks in tasks.values():
match_tasks = tasks.get(_Key.MATCH_TASKS, [])
for match in match_tasks:
# All previous matches were every week starting from now
match[_Key.CADENCE] = 1
match[_Key.CADENCE_START] = datetime_to_ts(datetime.now())
# Set of migration functions to apply # Set of migration functions to apply
_MIGRATIONS = [ _MIGRATIONS = [
_migrate_to_v1, _migrate_to_v1,
_migrate_to_v2, _migrate_to_v2,
_migrate_to_v3, _migrate_to_v3,
_migrate_to_v4, _migrate_to_v4,
_migrate_to_v5
] ]
@ -94,6 +106,8 @@ class _Key(str):
MEMBERS_MIN = "members_min" MEMBERS_MIN = "members_min"
WEEKDAY = "weekdays" WEEKDAY = "weekdays"
HOUR = "hours" HOUR = "hours"
CADENCE = "cadence"
CADENCE_START = "cadence_start"
# Unused # Unused
_MATCHEES = "matchees" _MATCHEES = "matchees"
@ -139,6 +153,8 @@ _SCHEMA = Schema(
_Key.MEMBERS_MIN: Use(int), _Key.MEMBERS_MIN: Use(int),
_Key.WEEKDAY: Use(int), _Key.WEEKDAY: Use(int),
_Key.HOUR: Use(int), _Key.HOUR: Use(int),
_Key.CADENCE: Use(int),
_Key.CADENCE_START: Use(str),
} }
] ]
} }
@ -324,7 +340,10 @@ class _State():
for channel, tasks in self._tasks.items(): for channel, tasks in self._tasks.items():
for match in tasks.get(_Key.MATCH_TASKS, []): for match in tasks.get(_Key.MATCH_TASKS, []):
if match[_Key.WEEKDAY] == weekday and match[_Key.HOUR] == hour: # Take into account the weekly cadence
start = ts_to_datetime(match[_Key.CADENCE_START])
weeks = int((time - start).days / 7)
if match[_Key.WEEKDAY] == weekday and match[_Key.HOUR] == hour and weeks % match[_Key.CADENCE] == 0:
yield (channel, match[_Key.MEMBERS_MIN]) yield (channel, match[_Key.MEMBERS_MIN])
def get_channel_match_tasks(self, channel_id: str) -> Generator[int, int, int]: def get_channel_match_tasks(self, channel_id: str) -> Generator[int, int, int]:
@ -341,7 +360,7 @@ class _State():
yield (task[_Key.WEEKDAY], task[_Key.HOUR], task[_Key.MEMBERS_MIN]) yield (task[_Key.WEEKDAY], task[_Key.HOUR], task[_Key.MEMBERS_MIN])
@safe_write @safe_write
def set_channel_match_task(self, channel_id: str, members_min: int, weekday: int, hour: int): def set_channel_match_task(self, channel_id: str, members_min: int, weekday: int, hour: int, cadence: int):
"""Set up a match task on a channel""" """Set up a match task on a channel"""
channel = self._tasks.setdefault(str(channel_id), {}) channel = self._tasks.setdefault(str(channel_id), {})
matches = channel.setdefault(_Key.MATCH_TASKS, []) matches = channel.setdefault(_Key.MATCH_TASKS, [])
@ -352,6 +371,10 @@ class _State():
if match[_Key.WEEKDAY] == weekday and match[_Key.HOUR] == hour: if match[_Key.WEEKDAY] == weekday and match[_Key.HOUR] == hour:
found = True found = True
match[_Key.MEMBERS_MIN] = members_min match[_Key.MEMBERS_MIN] = members_min
# If the cadence has changed, update it and reset the start
if cadence != match[_Key.CADENCE]:
match[_Key.CADENCE] = cadence
match[_Key.CADENCE_START] = datetime_to_ts(datetime.now())
# Return true as we've successfully changed the data in place # Return true as we've successfully changed the data in place
return True return True
@ -361,6 +384,8 @@ class _State():
_Key.MEMBERS_MIN: members_min, _Key.MEMBERS_MIN: members_min,
_Key.WEEKDAY: weekday, _Key.WEEKDAY: weekday,
_Key.HOUR: hour, _Key.HOUR: hour,
_Key.CADENCE: cadence,
_Key.CADENCE_START: datetime_to_ts(datetime.now())
}) })
@safe_write @safe_write