diff --git a/README.md b/README.md index 0970c0a..6f79ee0 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ * fast: only read cache * fresh: does not read cache -(Dates are formated 'yyyy-mm-dd' or 'yyyy-mm-ddThh:mm' (ISO 8601) or 'week/month/year') +(Dates are formated 'yyyy-mm-dd' or 'yyyy-mm-ddThh:mm' (ISO 8601) or 'week' or '8days' or '1y') ``` ## Running this bot diff --git a/src/scanners/scanner.py b/src/scanners/scanner.py index 8931318..f30cb11 100644 --- a/src/scanners/scanner.py +++ b/src/scanners/scanner.py @@ -12,8 +12,8 @@ from utils import ( delta, gdpr, ISO8601_REGEX, + RELATIVE_REGEX, parse_time, - RELATIVE_TIME, ) from logs import ( GuildLogs, @@ -70,7 +70,7 @@ class Scanner(ABC): arg = arg[3:-1] if "!" in arg else arg[2:-1] elif re.match(r"^<#!?\d+>$", arg): arg = arg[3:-1] if "!" in arg else arg[2:-1] - elif re.match(ISO8601_REGEX, arg) or arg in RELATIVE_TIME: + elif re.match(ISO8601_REGEX, arg) or re.match(RELATIVE_REGEX, arg): dates += [parse_time(arg)] skip_check = True if len(dates) > 2: diff --git a/src/utils/utils.py b/src/utils/utils.py index a823399..b18265a 100644 --- a/src/utils/utils.py +++ b/src/utils/utils.py @@ -36,7 +36,7 @@ def generate_help( %{cmd}: {info} arguments: {arg_list} -(Dates are formated 'yyyy-mm-dd' or 'yyyy-mm-ddThh:mm' (ISO 8601) or 'week/month/year') +(Dates are formated 'yyyy-mm-dd' or 'yyyy-mm-ddThh:mm' (ISO 8601) or 'week' or '8days' or '1y') Example: %{cmd} {example} ```""" @@ -180,21 +180,37 @@ def parse_iso_datetime(str_date: str) -> datetime: return dateutil.parser.parse(str_date) -RELATIVE_TIME = { - "today": relativedelta(days=1), - "yesterday": relativedelta(days=2), - "week": relativedelta(weeks=1), - "month": relativedelta(months=1), - "year": relativedelta(years=1), -} +RELATIVE_REGEX = ( + r"(yesterday|today|\d*h(ours?)?|\d*d(ays?)?|\d*w(eeks?)?|\d*m(onths?)?|\d*y(ears?))" +) def parse_relative_time(src: str) -> datetime: - return datetime.utcnow() - RELATIVE_TIME[src] + timezone_delta = datetime.utcnow() - datetime.now() + if src == "today": + return datetime.today() + timezone_delta + elif src == "yesterday": + return datetime.today() - relativedelta(days=1) + timezone_delta + else: + m = re.match("(\d*)(\w+)", src) + delta = None + value = int(m[1]) + unit = m[2][0] + if unit == "h": + delta = relativedelta(hours=value) + elif unit == "d": + delta = relativedelta(days=value) + elif unit == "w": + delta = relativedelta(weeks=value) + elif unit == "m": + delta = relativedelta(months=value) + elif unit == "y": + delta = relativedelta(years=value) + return datetime.utcnow() - delta def parse_time(src: str) -> datetime: - if src in RELATIVE_TIME: + if re.match(RELATIVE_REGEX, src): return parse_relative_time(src) else: return parse_iso_datetime(src)