From e1bdf43931b885d9eb3bc2dcff3919a913533897 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= <tlovinator@gmail.com>
Date: Mon, 3 May 2021 23:24:47 +0200
Subject: [PATCH] Add /remind pause & resume

---
 main.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 89 insertions(+), 7 deletions(-)

diff --git a/main.py b/main.py
index b69bbc9..14eeeeb 100644
--- a/main.py
+++ b/main.py
@@ -23,7 +23,7 @@ bot = commands.Bot(
 slash = SlashCommand(bot, sync_commands=True)
 
 
-def countdown(remind_id: str) -> str:
+def calculate_countdown(remind_id: str) -> str:
     job = scheduler.get_job(remind_id)
 
     # Get_job() returns None when it can't find a job with that id.
@@ -110,7 +110,7 @@ async def remind_modify(
         return
 
     message = job.kwargs.get("message")
-    the_final_countdown_old = countdown(job.id)
+    the_final_countdown_old = calculate_countdown(job.id)
 
     channel_name = bot.get_channel(int(job.kwargs.get("channel_id")))
     msg = f"**Modified** {remind_id} in #{channel_name}\n"
@@ -146,7 +146,7 @@ async def remind_modify(
             await ctx.send(f"No job by the id of {remind_id} was found")
 
         remove_timezone_from_date_old = job.trigger.run_date.strftime("%Y-%m-%d %H:%M")
-        the_final_countdown_new = countdown(remind_id)
+        the_final_countdown_new = calculate_countdown(remind_id)
         msg += (
             f"**Old date**: {remove_timezone_from_date_old} (in {the_final_countdown_old})\n"
             f"**New date**: {remove_timezone_from_date} (in {the_final_countdown_new})"
@@ -180,14 +180,14 @@ async def remind_remove(ctx: SlashContext, remind_id: str):
 
     try:
         scheduler.remove_job(remind_id)
-    except JobLookupError as e:
+    except Exception as e:
         await ctx.send(e)
 
     try:
         trigger_time = job.trigger.run_date
         msg = (
             f"**Removed** {remind_id}.\n"
-            f"**Time**: {trigger_time.strftime('%Y-%m-%d %H:%M')} (in {countdown(remind_id)})\n"
+            f"**Time**: {trigger_time.strftime('%Y-%m-%d %H:%M')} (in {calculate_countdown(remind_id)})\n"
             f"**Channel**: #{channel_name}\n"
             f"**Message**: {message}"
         )
@@ -198,6 +198,8 @@ async def remind_remove(ctx: SlashContext, remind_id: str):
             f"**Channel**: #{channel_name}\n"
             f"**Message**: {message}"
         )
+    except Exception as e:
+        await ctx.send(e)
 
     await ctx.send(msg)
 
@@ -229,7 +231,7 @@ async def remind_list(ctx: SlashContext):
                     trigger_time = job.trigger.run_date
                     embed.add_field(
                         name=f"{message} in #{channel_name}",
-                        value=f"{trigger_time.strftime('%Y-%m-%d %H:%M')} (in {countdown(job.id)})\nID: {job.id}",
+                        value=f"{trigger_time.strftime('%Y-%m-%d %H:%M')} (in {calculate_countdown(job.id)})\nID: {job.id}",
                         inline=False,
                     )
                 except AttributeError:
@@ -247,6 +249,86 @@ async def remind_list(ctx: SlashContext):
         await ctx.send(embed=embed)
 
 
+@slash.subcommand(
+    base="remind",
+    name="pause",
+    description="Pause reminder. For cron or interval.",
+)
+async def remind_pause(ctx: SlashContext, remind_id: str):
+    job = scheduler.get_job(remind_id)
+    if job is None:
+        await ctx.send(f"No reminder with that ID ({remind_id}).")
+        return
+
+    channel_id = job.kwargs.get("channel_id")
+    channel_name = bot.get_channel(int(channel_id))
+    message = job.kwargs.get("message")
+
+    try:
+        scheduler.pause_job(remind_id)
+    except Exception as e:
+        await ctx.send(e)
+    try:
+        trigger_time = job.trigger.run_date
+        msg = (
+            f"**Paused** {remind_id}.\n"
+            f"**Time**: {trigger_time.strftime('%Y-%m-%d %H:%M')} (in {calculate_countdown(remind_id)})\n"
+            f"**Channel**: #{channel_name}\n"
+            f"**Message**: {message}"
+        )
+    except AttributeError:
+        msg = (
+            f"**Paused** {remind_id}.\n"
+            f"**Time**: Cronjob\n"
+            f"**Channel**: #{channel_name}\n"
+            f"**Message**: {message}"
+        )
+    except Exception as e:
+        await ctx.send(e)
+
+    await ctx.send(msg)
+
+
+@slash.subcommand(
+    base="remind",
+    name="resume",
+    description="Resume paused reminder. For cron or interval.",
+)
+async def remind_resume(ctx: SlashContext, remind_id: str):
+    job = scheduler.get_job(remind_id)
+    if job is None:
+        await ctx.send(f"No reminder with that ID ({remind_id}).")
+        return
+
+    channel_id = job.kwargs.get("channel_id")
+    channel_name = bot.get_channel(int(channel_id))
+    message = job.kwargs.get("message")
+
+    try:
+        scheduler.resume_job(remind_id)
+    except Exception as e:
+        await ctx.send(e)
+    try:
+        trigger_time = job.trigger.run_date
+        msg = (
+            f"**Resumed** {remind_id}.\n"
+            f"**Time**: {trigger_time.strftime('%Y-%m-%d %H:%M')} (in {calculate_countdown(remind_id)})\n"
+            f"**Channel**: #{channel_name}\n"
+            f"**Message**: {message}"
+        )
+    except AttributeError:
+        msg = (
+            f"**Resumed** {remind_id}.\n"
+            f"**Time**: Cronjob\n"
+            f"**Channel**: #{channel_name}\n"
+            f"**Message**: {message}"
+        )
+    except Exception as e:
+        await ctx.send(e)
+
+    await ctx.send(msg)
+
+
 @slash.subcommand(
     base="remind",
     name="add",
@@ -289,7 +371,7 @@ async def remind_add(ctx: SlashContext, message_date: str, message_reason: str):
 
     message = (
         f"Hello {ctx.author.display_name}, I will notify you at:\n"
-        f"**{run_date}** (in {countdown(reminder.id)})\n"
+        f"**{run_date}** (in {calculate_countdown(reminder.id)})\n"
         f"With the message:\n**{message_reason}**."
     )