diff options
Diffstat (limited to 'bot/converters.py')
-rw-r--r-- | bot/converters.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/bot/converters.py b/bot/converters.py index 3522a32aa..b31ef76eb 100644 --- a/bot/converters.py +++ b/bot/converters.py @@ -573,6 +573,55 @@ class Infraction(Converter): raise e +class DayDuration(Converter): + """ + Convert a string representing day time (hours and minutes) to a UTC datetime object. + + The hours and minutes would be combined with UTC day. If no 'am' or 'pm' is passed with + the string, then it is assumed that the time is in 24 hour format. + + The following formats are accepted: + - H:M + - H:Mam/pm + - HMam/pm + - Ham/pm + - H + + where `H` represents Hours and `M` represents Minutes. + """ + + TIME_RE = re.compile( + r"^(1[0-2]|0?[1-9]):?([0-5][0-9])? ?([AaPp][Mm])$" # Twelve hour format + "|" + r"^([0-9]|0[0-9]|1[0-9]|2[0-4]):?([0-5][0-9])?$" # Twenty four hour format + ) + + async def convert(self, _ctx: Context, argument: str) -> datetime: + """Attempts to convert `argument` to a UTC datetime object.""" + match = self.TIME_RE.fullmatch(argument) + if not match: + raise BadArgument(f"`{argument}` is not a valid time duration string.") + + hour_12, minute_12, meridiem, hour_24, minute_24 = match.groups() + time = None + + if hour_12 and meridiem and minute_12: + time = datetime.strptime(f"{hour_12}:{minute_12} {meridiem}", "%I:%M %p") + elif hour_12 and meridiem: + time = datetime.strptime(f"{hour_12} {meridiem}", "%I %p") + elif hour_24 and minute_24: + time = datetime.strptime(f"{hour_24}:{minute_24}", "%H:%M") + else: + time = datetime.strptime(hour_24, "%H") + + today = datetime.utcnow().date() + return time.replace( + year=today.year, + month=today.month, + day=today.day + ) + + if t.TYPE_CHECKING: ValidDiscordServerInvite = dict # noqa: F811 ValidFilterListType = str # noqa: F811 @@ -591,6 +640,7 @@ if t.TYPE_CHECKING: UnambiguousUser = discord.User # noqa: F811 UnambiguousMember = discord.Member # noqa: F811 Infraction = t.Optional[dict] # noqa: F811 + DayDuration = datetime # noqa: F811 Expiry = t.Union[Duration, ISODateTime] MemberOrUser = t.Union[discord.Member, discord.User] |