alternative syntax for relative time range

This commit is contained in:
Klemek
2021-04-09 18:19:40 +02:00
parent 90a26bcc9c
commit 802e208092
3 changed files with 29 additions and 13 deletions
+1 -1
View File
@@ -59,7 +59,7 @@
* fast: only read cache * fast: only read cache
* fresh: does not 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 ## Running this bot
+2 -2
View File
@@ -12,8 +12,8 @@ from utils import (
delta, delta,
gdpr, gdpr,
ISO8601_REGEX, ISO8601_REGEX,
RELATIVE_REGEX,
parse_time, parse_time,
RELATIVE_TIME,
) )
from logs import ( from logs import (
GuildLogs, GuildLogs,
@@ -70,7 +70,7 @@ class Scanner(ABC):
arg = arg[3:-1] if "!" in arg else arg[2:-1] arg = arg[3:-1] if "!" in arg else arg[2:-1]
elif re.match(r"^<#!?\d+>$", arg): elif re.match(r"^<#!?\d+>$", arg):
arg = arg[3:-1] if "!" in arg else arg[2:-1] 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)] dates += [parse_time(arg)]
skip_check = True skip_check = True
if len(dates) > 2: if len(dates) > 2:
+26 -10
View File
@@ -36,7 +36,7 @@ def generate_help(
%{cmd}: {info} %{cmd}: {info}
arguments: arguments:
{arg_list} {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} Example: %{cmd} {example}
```""" ```"""
@@ -180,21 +180,37 @@ def parse_iso_datetime(str_date: str) -> datetime:
return dateutil.parser.parse(str_date) return dateutil.parser.parse(str_date)
RELATIVE_TIME = { RELATIVE_REGEX = (
"today": relativedelta(days=1), r"(yesterday|today|\d*h(ours?)?|\d*d(ays?)?|\d*w(eeks?)?|\d*m(onths?)?|\d*y(ears?))"
"yesterday": relativedelta(days=2), )
"week": relativedelta(weeks=1),
"month": relativedelta(months=1),
"year": relativedelta(years=1),
}
def parse_relative_time(src: str) -> datetime: 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: def parse_time(src: str) -> datetime:
if src in RELATIVE_TIME: if re.match(RELATIVE_REGEX, src):
return parse_relative_time(src) return parse_relative_time(src)
else: else:
return parse_iso_datetime(src) return parse_iso_datetime(src)