]> git.friedersdorff.com Git - max/remindme.git/blobdiff - remindme.py
Add basic Dockerfile for this app
[max/remindme.git] / remindme.py
index 3454eab37722b653f10f81cad9574bd33af84bfe..6084f9a959dafb086a574725540f5e3f6889e420 100644 (file)
@@ -1,11 +1,12 @@
 import os
+import sys
 from smtplib import SMTP_SSL
 import email
 import datetime
 
 from imapclient import IMAPClient, SEEN
 from dateutil.parser import parse
-from cron_descriptor import get_description
+from croniter import croniter
 
 
 IMAP_USER = os.environ["REMINDME_IMAP_USER"]
@@ -17,7 +18,6 @@ SMTP_HOST = os.environ.get("REMINDME_IMAP_HOST", IMAP_HOST)
 
 USAGE = ""
 
-
 __iclient = None
 
 
@@ -46,32 +46,32 @@ def ls(msg, reminders):
     reply_lines = []
     for uid, reminder in reminders:
         body = reminder.get_payload().strip()
-        if body.startswith("repeat"):
-            parsed = get_description(body[6:].strip())
-            reply_lines.append(f"({uid}) {reminder['subject']}: {body} ; {parsed}")
-            pass
-        else:
-            reply_lines.append(f"({uid}) {reminder['subject']}: {body}")
+        reply_lines.append(f"({uid}) {reminder['subject']}: {body}")
 
     return make_reply(msg, "Your current reminders", "\n".join(reply_lines))
 
 
 def ack_reminder(uid, reminder):
     body = reminder.get_payload().strip()
-    if body.startswith("repeat"):
-        parsed = get_description(body[6:].strip())
-        reply_body = f"({uid}) {reminder['subject']}: {body} ; {parsed}"
-        pass
-    else:
-        reply_body = f"({uid}) {reminder['subject']}: {body}"
-
+    reply_body = f"({uid}) {reminder['subject']}: {body}"
     return make_reply(reminder, f"Received Reminder: {reminder['subject']}", reply_body)
 
 
-def remind(reminder):
+def remind(last_time, start_time, reminder):
     f_line = reminder.get_payload().strip().splitlines()[0]
     if f_line.lower().startswith("repeat"):
-        return False, None
+        cron_payload = f_line[6:].strip()
+        it = croniter(cron_payload, last_time)
+        next_time = it.get_next(datetime.datetime)
+        if next_time > last_time and next_time <= start_time:
+            return (
+                True,
+                make_reply(
+                    reminder, f"Re: {reminder['subject']} now", reminder.get_payload()
+                ),
+            )
+        else:
+            return False, None
     else:
         try:
             parsed_time = parse(f_line, fuzzy=True)
@@ -92,7 +92,7 @@ def remind(reminder):
             )
 
 
-def main():
+def main(last_time, start_time):
     msgs = iclient().search(["ALL"])
     new_rems, old_rems, metas, to_delete, to_send = [], [], [], [], []
     for uid, data in iclient().fetch(msgs, ["BODY.PEEK[]", "FLAGS"]).items():
@@ -120,7 +120,7 @@ def main():
         to_send.append(ack_reminder(uid, reminder))
 
     for uid, reminder in old_rems + new_rems:
-        done, reply = remind(reminder)
+        done, reply = remind(last_time, start_time, reminder)
         if reply:
             to_send.append(reply)
         if done:
@@ -137,4 +137,9 @@ def main():
 
 
 if __name__ == "__main__":
-    main()
+    last_time = datetime.datetime.fromtimestamp(
+        float(sys.argv[1]), datetime.timezone.utc
+    )
+    start_time = datetime.datetime.now(datetime.timezone.utc)
+    main(last_time, start_time)
+    print(start_time.timestamp())