async def guarded_listener(*args, **kwargs) -> None: """Wrapped listener will abort if not in allowed month.""" current_month = resolve_current_month() if current_month in allowed_months: # Propagate return value although it should always be None return await listener(*args, **kwargs) else: log.debug(f"Guarded {listener.__qualname__} from invoking in {current_month!s}")
def get_current_season() -> t.Type[SeasonBase]: """Give active season, based on current UTC month.""" current_month = resolve_current_month() active_seasons = tuple(season for season in SeasonBase.__subclasses__() if current_month in season.months) if not active_seasons: return SeasonBase return active_seasons[0]
async def predicate(ctx: Context) -> bool: current_month = resolve_current_month() can_run = current_month in allowed_months log.debug( f"Command '{ctx.command}' is locked to months {human_months(allowed_months)}. " f"Invoking it in month {current_month!s} is {'allowed' if can_run else 'disallowed'}." ) if can_run: return True else: raise InMonthCheckFailure(f"Command can only be used in {human_months(allowed_months)}")
async def decorated_task(*args, **kwargs) -> None: """Call `task_body` once every `sleep_time` seconds in `allowed_months`.""" log.info(f"Starting seasonal task {task_body.__qualname__} ({human_months(allowed_months)})") while True: current_month = resolve_current_month() if current_month in allowed_months: await task_body(*args, **kwargs) else: log.debug(f"Seasonal task {task_body.__qualname__} sleeps in {current_month!s}") await asyncio.sleep(sleep_time)