ref: master
kaiowa/reminder.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import json import asyncio from collections import namedtuple from datetime import datetime from parsedatetime import Calendar from pytz import timezone Reminder = namedtuple("Reminder", ["what", "when", "who"]) UTC = timezone("UTC") local = timezone("Brazil/East") async def want_reminder(redis, reminders, msg, what=None, when=None): if not what or not when: return cal = Calendar() now = datetime.utcnow().replace(tzinfo=UTC).astimezone(local) when, _ = cal.parseDT(datetimeString=when, sourceTime=now, tzinfo=local) reminder = Reminder(what=what, who=msg.sender.name, when=when) reminders.append(reminder) save_reminders(redis, reminders) await msg.reply(f"Ok, vou te lembrar em {when}") def encode_reminder(reminder): return { "what": reminder.what, "when": reminder.when.timestamp(), "who": reminder.who } def save_reminders(redis, reminders): redis.set("reminders", json.dumps([encode_reminder(r) for r in reminders])) def decode_reminder(obj): obj["when"] = datetime.fromtimestamp(obj["when"], tz=local) return Reminder(**obj) def load_reminders(redis): reminders = redis.get("reminders") if not reminders: return [] return [decode_reminder(r) for r in json.loads(reminders.decode())] async def check_due_reminders(redis, reminders, bot): now = datetime.utcnow().replace(tzinfo=UTC).astimezone(local) for r in reminders: if r.when <= now: await bot.message("#eletrotupiniquim", f"{r.who}: Lembrete {r.what}") reminders.remove(r) save_reminders(redis, reminders) |