1
0
Fork 0

Add reminder list and fix reminder loop

This commit is contained in:
Ethanell 2020-05-27 00:25:59 +02:00
parent 7703626a35
commit 76e954682e

View file

@ -1,3 +1,4 @@
import asyncio
import re import re
from datetime import datetime, timedelta from datetime import datetime, timedelta
@ -13,10 +14,6 @@ extension_name = "reminders"
logger = logger.getChild(extension_name) logger = logger.getChild(extension_name)
async def reminder_exec(coro):
await coro
def time_pars(s: str) -> timedelta: def time_pars(s: str) -> timedelta:
match = re.fullmatch(r"(?:([0-9]+)W)*(?:([0-9]+)D)*(?:([0-9]+)H)*(?:([0-9]+)M)*(?:([0-9]+)S)*", s.upper().replace(" ", "").strip()) match = re.fullmatch(r"(?:([0-9]+)W)*(?:([0-9]+)D)*(?:([0-9]+)H)*(?:([0-9]+)M)*(?:([0-9]+)S)*", s.upper().replace(" ", "").strip())
if match: if match:
@ -33,26 +30,28 @@ class Reminders(commands.Cog):
self.tasks = [] self.tasks = []
@commands.group("reminder", pass_context=True) @commands.group("reminder", pass_context=True)
@commands.guild_only()
async def reminder(self, ctx: commands.Context): async def reminder(self, ctx: commands.Context):
if ctx.invoked_subcommand is None: if ctx.invoked_subcommand is None:
raise CommandNotFound() raise CommandNotFound()
@reminder.group("help", pass_context=True) @reminder.group("help", pass_context=True)
@commands.guild_only()
async def reminder_help(self, ctx: commands.Context): async def reminder_help(self, ctx: commands.Context):
embed = Embed(title="Reminder help") embed = Embed(title="Reminder help")
embed.add_field(name="speak add <message> <time>", value="Add a reminder to your reminders list\n" embed.add_field(name="speak add <message> <time>", value="Add a reminder to your reminders list\n"
"Time: ?D?H?M?S", inline=False) "Time: ?D?H?M?S", inline=False)
embed.add_field(name="speak list", value="Show your tasks list", inline=False)
await ctx.send(embed=embed) await ctx.send(embed=embed)
@reminder.group("add", pass_context=True) @reminder.group("add", pass_context=True)
@commands.guild_only()
async def reminder_add(self, ctx: commands.Context, message: str, time: str): async def reminder_add(self, ctx: commands.Context, message: str, time: str):
time = time_pars(time) time = time_pars(time)
now = datetime.now()
self.tasks.append({ self.tasks.append({
"date": datetime.now() + time, "date": now + time,
"coro": ctx.send(ctx.author.mention + " reminder !\n" + message) "create": now,
"user": ctx.author.id,
"message": message,
"channel": ctx.channel.id,
}) })
hours, seconds = divmod(time.seconds, 3600) hours, seconds = divmod(time.seconds, 3600)
@ -62,13 +61,29 @@ class Reminders(commands.Cog):
if hours > 0 else f"{minutes}m {seconds}s" if hours > 0 else f"{minutes}m {seconds}s"
if minutes > 0 else f"{seconds}s"} !""") if minutes > 0 else f"{seconds}s"} !""")
@reminder.group("list", pass_context=True)
async def reminder_list(self, ctx: commands.Context):
embed = Embed(title="Tasks list")
for i in self.tasks:
if i["user"] == ctx.author.id:
embed.add_field(name=i["date"],value=i["message"], inline=False)
await ctx.send(embed=embed)
@tasks.loop(minutes=1) @tasks.loop(minutes=1)
async def reminders_loop(self): async def reminders_loop(self):
print("loop") trash = []
for i, t in enumerate(self.tasks): for t in self.tasks:
if t["date"] <= datetime.now(): if t["date"] <= datetime.now():
self.bot.loop.create_task(reminder_exec(t["coro"])) self.bot.loop.create_task(self.reminder_exec(t))
del self.tasks[i] trash.append(t)
for t in trash:
del self.tasks[self.tasks.index(t)]
async def reminder_exec(self, task: dict):
embed = Embed(title="You have a reminder !")
embed.add_field(name=task["date"], value=task["message"])
await self.bot.get_channel(task["channel"]).send(f"<@{task['user']}>", embed=embed)
@commands.Cog.listener() @commands.Cog.listener()
async def on_command_error(self, ctx: commands.Context, error): async def on_command_error(self, ctx: commands.Context, error):