From 21ea999e3c8aff4140f373b88bdc917a2154e9df Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Mon, 4 Apr 2022 22:07:06 +0200 Subject: [PATCH] Time: Add support for UTC offsets as tztime arguments. --- plugins/Time/plugin.py | 41 ++++++++++++++++++++++++++--------------- plugins/Time/test.py | 2 ++ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/plugins/Time/plugin.py b/plugins/Time/plugin.py index 8053b1421..a0d8fcdd2 100644 --- a/plugins/Time/plugin.py +++ b/plugins/Time/plugin.py @@ -28,10 +28,11 @@ # POSSIBILITY OF SUCH DAMAGE. ### +import re import sys import time TIME = time # For later use. -from datetime import datetime +from datetime import datetime, timedelta, timezone import supybot.conf as conf import supybot.log as log @@ -194,25 +195,35 @@ class Time(callbacks.Plugin): elapsed = wrap(elapsed, ['int']) @internationalizeDocstring - def tztime(self, irc, msg, args, timezone): + def tztime(self, irc, msg, args, tz): """/ (or //) Takes a city and its region, and returns its local time. This command uses the IANA Time Zone Database.""" - try: - timezone = utils.time.iana_timezone(timezone) - except utils.time.UnknownTimeZone: - irc.error(_('Unknown timezone')) - except utils.time.MissingTimezoneLibrary: - irc.error(_( - 'Timezone-related commands are not available. ' - 'Your administrator need to either upgrade Python to ' - 'version 3.9 or greater, or install pytz.')) - except utils.time.TimezoneException as e: - irc.error(e.args[0]) + parsed_utc_tz = re.match( + "UTC(?P[-+][0-9]+)(:(?P[0-6][0-9]))?", tz) + if parsed_utc_tz: + groups = parsed_utc_tz.groupdict() + tz = timezone(timedelta( + hours=int(groups["hours"]), + minutes=int(groups["minutes"] or "00") + )) else: - format = self.registryValue("format", msg.channel, irc.network) - irc.reply(datetime.now(timezone).strftime(format)) + try: + tz = utils.time.iana_timezone(tz) + except utils.time.UnknownTimeZone: + irc.error(_('Unknown timezone'), Raise=True) + except utils.time.MissingTimezoneLibrary: + irc.error(_( + 'Timezone-related commands are not available. ' + 'Your administrator need to either upgrade Python to ' + 'version 3.9 or greater, or install pytz.'), + Raise=True) + except utils.time.TimezoneException as e: + irc.error(e.args[0], Raise=True) + + format = self.registryValue("format", msg.channel, irc.network) + irc.reply(datetime.now(tz).strftime(format)) tztime = wrap(tztime, ['text']) def ddate(self, irc, msg, args, year=None, month=None, day=None): diff --git a/plugins/Time/test.py b/plugins/Time/test.py index 2cb5d31ad..96233edb7 100644 --- a/plugins/Time/test.py +++ b/plugins/Time/test.py @@ -97,6 +97,8 @@ class TimeTestCase(PluginTestCase): self.assertNotError('tztime Europe/Paris') self.assertNotError('tztime America/Indiana/Knox') self.assertNotError('tztime UTC') + self.assertNotError('tztime UTC+10') + self.assertNotError('tztime UTC+5:30') self.assertError('tztime Europe/Gniarf') @skipIf(not has_dateutil, 'python-dateutil is missing')