From 3b1426b0480b36b0544f123bc879ffbceadf324e Mon Sep 17 00:00:00 2001 From: Stijn De Clercq Date: Wed, 11 Aug 2021 20:43:45 +0200 Subject: [PATCH] Ufora Notifications: fix timestamp (i think), unlimited length, FULL html-to-markdown support (eg. hyperlinks, file download links, ...), clean up some ugly stuff --- data/embeds/ufora.py | 58 +++++++++++--------------------------------- requirements.txt | 3 ++- 2 files changed, 16 insertions(+), 45 deletions(-) diff --git a/data/embeds/ufora.py b/data/embeds/ufora.py index 2f2dbe3..c445e1b 100644 --- a/data/embeds/ufora.py +++ b/data/embeds/ufora.py @@ -1,17 +1,17 @@ -from datetime import datetime, timedelta +from datetime import datetime from discord import Embed, Colour from functions.stringFormatters import leadingZero as lz from functions.timeFormatters import intToWeekday -from html import unescape +from markdownify import markdownify as md import pytz -import re class UforaNotification: def __init__(self, content: dict, course, notif_id, course_id): self._content: dict = content self._course = course - self._notif_id, self._course_id = notif_id, course_id + self._notif_id = notif_id + self._course_id = course_id self._view_url = self._create_url() self._title = self._clean_content(self._content["title"]) self._description = self._get_description() @@ -40,54 +40,24 @@ class UforaNotification: def _get_description(self): desc = self._clean_content(self._content["summary"]) - if len(desc) > 500: - return desc[:497] + "..." + if len(desc) > 4096: + return desc[:4093] + "..." return desc def _clean_content(self, text: str): - # Dict with HTML & markdown tags to replace - html_table = { - # CHARACTERS: - "&": '&', - """: '"', - "apos;": "'", - ">": ">", - "<": "<", - # MARKDOWN SUPPORT: - "": "**", - "": "**", - "": "**", - "": "**", - "": "*", - "": "*", - "": "*", - "": "*", - "": "~~", - "": "~~", - "": "__", - "": "__", - # Represent paragraphs with newlines - "

": "\n", - "
": "\n", - "
": "\n", - "
": "\n" - } - - # Unescape HTML - for key, value in html_table.items(): - text = text.replace(key, value) - - # Remove HTML tags - return unescape(re.sub(r"<[^>]*>", "", text)) + return md(text) def _get_published(self): - time_string = "%a, %d %b %Y %H:%M:%S %Z" - dt = datetime.strptime(self._content["published"], time_string)\ + # Datetime is unable to parse the timezone because it's useless + # We will hereby cut it out and pray the timezone will always be UTC+0 + published = self._content["published"].rsplit(" ", 1)[0] + time_string = "%a, %d %b %Y %H:%M:%S" + dt = datetime.strptime(published, time_string)\ .astimezone(pytz.timezone("Europe/Brussels")) - # Apply timezone offset - dt = dt + timedelta(hours=dt.utcoffset().seconds//3600) + # Apply timezone offset in a hacky way + dt = dt + dt.utcoffset() return "{} {}/{}/{} om {}:{}:{}".format( intToWeekday(dt.weekday()), diff --git a/requirements.txt b/requirements.txt index dc9dcba..036bf7e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,4 +17,5 @@ quart==0.15.1 Quart-CORS==0.5.0 attrs~=21.2.0 dacite~=1.6.0 -pytest==6.2.4 \ No newline at end of file +pytest==6.2.4 +markdownify==0.9.2 \ No newline at end of file