didier/didier/data/embeds/deadlines.py

64 lines
2.1 KiB
Python
Raw Normal View History

2022-08-13 00:07:48 +02:00
import itertools
from datetime import datetime
import discord
from overrides import overrides
2022-08-29 20:24:42 +02:00
from database.schemas import Deadline
2022-08-13 00:07:48 +02:00
from didier.data.embeds.base import EmbedBaseModel
from didier.utils.types.datetime import tz_aware_now
from didier.utils.types.string import get_edu_year_name
__all__ = ["Deadlines"]
class Deadlines(EmbedBaseModel):
"""Embed that shows all the deadlines of a semester"""
deadlines: list[Deadline]
def __init__(self, deadlines: list[Deadline]):
self.deadlines = deadlines
self.deadlines.sort(key=lambda deadline: deadline.deadline)
@overrides
2022-08-28 22:15:03 +02:00
def to_embed(self, **kwargs) -> discord.Embed:
embed = discord.Embed(title="Upcoming Deadlines", colour=discord.Colour.dark_gold())
2022-08-13 00:07:48 +02:00
now = tz_aware_now()
has_active_deadlines = False
deadlines_grouped: dict[int, list[str]] = {}
for year, deadlines in itertools.groupby(self.deadlines, key=lambda _deadline: _deadline.course.year):
2022-08-13 00:07:48 +02:00
if year not in deadlines_grouped:
deadlines_grouped[year] = []
for deadline in deadlines:
passed = deadline.deadline <= now
if not passed:
has_active_deadlines = True
2022-08-13 00:07:48 +02:00
deadline_str = (
f"{deadline.course.name} - {deadline.name}: <t:{round(datetime.timestamp(deadline.deadline))}:R>"
)
2022-08-13 00:07:48 +02:00
# Strike through deadlines that aren't active anymore
deadlines_grouped[year].append(deadline_str if not passed else f"~~{deadline_str}~~")
2022-08-13 00:07:48 +02:00
# Send an Easter egg when there are no deadlines
2022-08-13 00:07:48 +02:00
if not has_active_deadlines:
embed.description = "There are currently no upcoming deadlines."
embed.set_image(url="https://c.tenor.com/RUzJ3lDGQUsAAAAC/iron-man-you-can-rest-now.gif")
return embed
2023-02-16 23:35:50 +01:00
for i in range(1, 7):
2022-08-13 00:07:48 +02:00
if i not in deadlines_grouped:
continue
name = get_edu_year_name(i - 1)
2022-08-13 00:07:48 +02:00
description = "\n".join(deadlines_grouped[i])
embed.add_field(name=name, value=description, inline=False)
return embed