diff --git a/reminder/bot.py b/reminder/bot.py index f9d9f253935af549f58943aed136887ba6ba7294..18d2c708eaa7538a62d973d3df0989413854ec7d 100644 --- a/reminder/bot.py +++ b/reminder/bot.py @@ -42,7 +42,6 @@ class ReminderBot(Plugin): return Config async def start(self) -> None: - await super().start() self.on_external_config_update() self.db = ReminderDatabase(self.database) self.reminder_loop_task = asyncio.ensure_future(self.reminder_loop(), loop=self.loop) @@ -54,7 +53,6 @@ class ReminderBot(Plugin): self.base_aliases = tuple(bc) if isinstance(bc, list) else (bc,) async def stop(self) -> None: - await super().stop() self.reminder_loop_task.cancel() async def reminder_loop(self) -> None: diff --git a/reminder/locale_util.py b/reminder/locale_util.py index 604878b5300bc4e20c4f39e49db9f2c398c07157..46e9041ee16a4ed4d23d48f29d4d54d275c1b99e 100644 --- a/reminder/locale_util.py +++ b/reminder/locale_util.py @@ -62,11 +62,19 @@ class Matcher(ABC): pass +def int_or_float(val: str) -> Union[int, float]: + if "," in val: + return float(val.replace(",", ".")) + elif "." in val: + return float(val) + return int(val) + + class RegexMatcher(Matcher): regex: Pattern value_type: Type - def __init__(self, pattern: str, value_type: Type = int) -> None: + def __init__(self, pattern: str, value_type: Type = int_or_float) -> None: self.regex = re.compile(pattern, re.IGNORECASE) self.value_type = value_type diff --git a/reminder/locales.py b/reminder/locales.py index b12632df91ba8a77d0923362359344323f7de72e..8a5e1ac1b8825c25c26c2aa3a0170e2ae9c805cf 100644 --- a/reminder/locales.py +++ b/reminder/locales.py @@ -21,16 +21,17 @@ from .locale_util import (Locales, Locale, RegexMatcher, locales: Locales = {} td_sep_en = r"(?:[\s,]{1,3}(?:and\s)?)?" +number = r"[+-]?\d+(?:[.,]\d+)?" locales["en_iso"] = Locale( name="English (ISO)", timedelta=RegexMatcher(r"(?:(?:in|after)\s)?" - rf"(?:(?P<years>[-+]?\d+)\s?y(?:r|ears?)?{td_sep_en})?" - rf"(?:(?P<months>[-+]?\d+)\s?mo(?:nths?)?{td_sep_en})?" - rf"(?:(?P<weeks>[-+]?\d+)\s?w(?:k|eeks?)?{td_sep_en})?" - rf"(?:(?P<days>[-+]?\d+)\s?d(?:ays?)?{td_sep_en})?" - rf"(?:(?P<hours>[-+]?\d+)\s?h(?:(?:r|our)?s?){td_sep_en})?" - rf"(?:(?P<minutes>[-+]?\d+)\s?m(?:in(?:ute)?s?)?{td_sep_en})?" - r"(?:(?P<seconds>[-+]?\d+)\s?s(?:ec(?:ond)?s?)?)?" + rf"(?:(?P<years>{number})\s?y(?:r|ear)?s?{td_sep_en})?" + rf"(?:(?P<months>{number})\s?mo(?:nth)?s?{td_sep_en})?" + rf"(?:(?P<weeks>{number})\s?w(?:k|eek)?s?{td_sep_en})?" + rf"(?:(?P<days>{number})\s?d(?:ays?)?{td_sep_en})?" + rf"(?:(?P<hours>{number})\s?h(?:(?:r|our)?s?){td_sep_en})?" + rf"(?:(?P<minutes>{number})\s?m(?:in(?:ute)?s?)?{td_sep_en})?" + rf"(?:(?P<seconds>{number})\s?s(?:ec(?:ond)?s?)?)?" r"(?:\s|$)"), date=RegexMatcher(r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})\s"), weekday=WeekdayMatcher(pattern=r"(?:today" @@ -72,13 +73,13 @@ locales["en_uk"] = locales["en_iso"].replace( td_sep_fi = r"(?:[\s,]{1,3}(?:ja\s)?)?" locales["fi_fi"] = Locale( name="Finnish", - timedelta=RegexMatcher(rf"(?:(?P<years>[-+]?\d+)\s?v(?:uo(?:tta|den))?{td_sep_fi})?" - rf"(?:(?P<months>[-+]?\d+)\s?k(?:k|uukau(?:si|tta|den))?{td_sep_fi})?" - rf"(?:(?P<weeks>[-+]?\d+)\s?v(?:k|iikk?o[an]?){td_sep_fi})?" - rf"(?:(?P<days>[-+]?\d+)\s?p(?:v|äivä[än]?){td_sep_fi})?" - rf"(?:(?P<hours>[-+]?\d+)\s?t(?:un(?:nin?|tia))?{td_sep_fi})?" - rf"(?:(?P<minutes>[-+]?\d+)\s?m(?:in(?:uut(?:in?|tia))?)?{td_sep_fi})?" - r"(?:(?P<seconds>[-+]?\d+)\s?s(?:ek(?:un(?:nin?|tia))?)?)?" + timedelta=RegexMatcher(rf"(?:(?P<years>{number})\s?v(?:uo(?:tta|den))?{td_sep_fi})?" + rf"(?:(?P<months>{number})\s?k(?:k|uukau(?:si|tta|den))?{td_sep_fi})?" + rf"(?:(?P<weeks>{number})\s?v(?:k|iikk?o[an]?){td_sep_fi})?" + rf"(?:(?P<days>{number})\s?p(?:v|äivä[än]?){td_sep_fi})?" + rf"(?:(?P<hours>{number})\s?t(?:un(?:nin?|tia))?{td_sep_fi})?" + rf"(?:(?P<minutes>{number})\s?m(?:in(?:uut(?:in?|tia))?)?{td_sep_fi})?" + rf"(?:(?P<seconds>{number})\s?s(?:ek(?:un(?:nin?|tia))?)?)?" r"(?:\s(?:kuluttua|päästä?))?" r"(?:\s|$)"), date=ShortYearMatcher(r"(?P<day>\d{1,2})\.(?P<month>\d{1,2})\.(?P<year>\d{2}(?:\d{2})?)\s"), @@ -108,13 +109,13 @@ td_sep_de = r"(?:[\s,]{1,3}(?:und\s)?)?" locales["de_de"] = Locale( name="German", timedelta=RegexMatcher(rf"(?:in\s)?" - rf"(?:(?P<years>[-+]?\d+)\s?jahr(?:en)?{td_sep_de})?" - rf"(?:(?P<months>[-+]?\d+)\s?monat(?:en)?{td_sep_de})?" - rf"(?:(?P<weeks>[-+]?\d+)\s?wochen?{td_sep_de})?" - rf"(?:(?P<days>[-+]?\d+)\s?tag(?:en)?{td_sep_de})?" - rf"(?:(?P<hours>[-+]?\d+)\s?stunden?{td_sep_de})?" - rf"(?:(?P<minutes>[-+]?\d+)\s?minuten?{td_sep_de})?" - r"(?:(?P<seconds>[-+]?\d+)\s?sekunden?)?"), + rf"(?:(?P<years>{number})\s?jahr(?:en)?{td_sep_de})?" + rf"(?:(?P<months>{number})\s?monat(?:en)?{td_sep_de})?" + rf"(?:(?P<weeks>{number})\s?wochen?{td_sep_de})?" + rf"(?:(?P<days>{number})\s?tag(?:en)?{td_sep_de})?" + rf"(?:(?P<hours>{number})\s?stunden?{td_sep_de})?" + rf"(?:(?P<minutes>{number})\s?minuten?{td_sep_de})?" + rf"(?:(?P<seconds>{number})\s?sekunden?)?"), date=ShortYearMatcher( r"(?P<day>\d{1,2})\.(?P<month>\d{1,2})\.(?P<year>\d{2}(?:\d{2})?)(?:\s|$)"), weekday=WeekdayMatcher(pattern=r"(?:heute"