kaiowa

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)