Compare commits
3 commits
caadca885c
...
d83f933f1d
Author | SHA1 | Date | |
---|---|---|---|
d83f933f1d | |||
e9cccefacb | |||
b86aaf7016 |
2 changed files with 35 additions and 7 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue