2021-03-03 18:04:31 +01:00
|
|
|
from datetime import datetime, timedelta
|
|
|
|
from discord import Embed, Colour
|
2021-03-03 18:37:09 +01:00
|
|
|
from functions.stringFormatters import leadingZero as lz
|
2021-03-03 18:04:31 +01:00
|
|
|
from functions.timeFormatters import intToWeekday
|
2021-03-12 10:05:19 +01:00
|
|
|
from html import unescape
|
2021-03-03 18:04:31 +01:00
|
|
|
import pytz
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
|
|
class UforaNotification:
|
2021-03-03 18:37:09 +01:00
|
|
|
def __init__(self, content: dict, course, notif_id, course_id):
|
2021-03-03 18:04:31 +01:00
|
|
|
self._content: dict = content
|
|
|
|
self._course = course
|
2021-03-03 18:37:09 +01:00
|
|
|
self._notif_id, self._course_id = notif_id, course_id
|
2021-03-03 18:04:31 +01:00
|
|
|
self._view_url = self._create_url()
|
|
|
|
self._title = self._clean_content(self._content["title"])
|
|
|
|
self._description = self._get_description()
|
|
|
|
self._published = self._get_published()
|
|
|
|
|
|
|
|
def to_embed(self):
|
|
|
|
embed = Embed(colour=Colour.from_rgb(30, 100, 200))
|
|
|
|
|
|
|
|
embed.set_author(name=self._course)
|
|
|
|
embed.title = self._title
|
|
|
|
embed.url = self._view_url
|
|
|
|
embed.description = self._description
|
|
|
|
embed.set_footer(text=self._published)
|
|
|
|
|
|
|
|
return embed
|
|
|
|
|
2021-03-03 18:13:22 +01:00
|
|
|
def get_id(self):
|
|
|
|
return int(self._notif_id) if self._notif_id is not None else self._content["id"]
|
|
|
|
|
2021-03-03 18:04:31 +01:00
|
|
|
def _create_url(self):
|
|
|
|
if self._notif_id is None or self._course_id is None:
|
|
|
|
return self._content["link"]
|
|
|
|
|
2021-03-03 18:16:23 +01:00
|
|
|
return "https://ufora.ugent.be/d2l/le/news/{0}/{1}/view?ou={0}".format(self._course_id, self._notif_id)
|
2021-03-03 18:04:31 +01:00
|
|
|
|
|
|
|
def _get_description(self):
|
|
|
|
desc = self._clean_content(self._content["summary"])
|
|
|
|
|
|
|
|
if len(desc) > 500:
|
2021-03-03 18:44:53 +01:00
|
|
|
return desc[:497] + "..."
|
2021-03-03 18:04:31 +01:00
|
|
|
|
|
|
|
return desc
|
|
|
|
|
|
|
|
def _clean_content(self, text: str):
|
2021-03-03 18:16:23 +01:00
|
|
|
# Dict with HTML & markdown tags to replace
|
2021-03-03 18:04:31 +01:00
|
|
|
html_table = {
|
2021-03-03 18:13:22 +01:00
|
|
|
# CHARACTERS:
|
2021-03-03 18:04:31 +01:00
|
|
|
"&": '&',
|
|
|
|
""": '"',
|
|
|
|
"apos;": "'",
|
|
|
|
">": ">",
|
2021-03-03 18:13:22 +01:00
|
|
|
"<": "<",
|
|
|
|
# MARKDOWN SUPPORT:
|
|
|
|
"<b>": "**",
|
|
|
|
"</b>": "**",
|
|
|
|
"<strong>": "**",
|
|
|
|
"</strong>": "**",
|
|
|
|
"<i>": "*",
|
|
|
|
"</i>": "*",
|
|
|
|
"<em>": "*",
|
|
|
|
"</em>": "*",
|
|
|
|
"<del>": "~~",
|
|
|
|
"</del>": "~~",
|
|
|
|
"<ins>": "__",
|
|
|
|
"</ins>": "__",
|
|
|
|
# Represent paragraphs with newlines
|
2021-03-03 18:37:09 +01:00
|
|
|
"</p>": "\n",
|
|
|
|
"<br>": "\n",
|
|
|
|
"<br/>": "\n",
|
|
|
|
"<br />": "\n"
|
2021-03-03 18:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
# Unescape HTML
|
|
|
|
for key, value in html_table.items():
|
|
|
|
text = text.replace(key, value)
|
|
|
|
|
|
|
|
# Remove HTML tags
|
2021-03-12 10:05:19 +01:00
|
|
|
return unescape(re.sub(r"<[^>]*>", "", text))
|
2021-03-03 18:04:31 +01:00
|
|
|
|
|
|
|
def _get_published(self):
|
|
|
|
time_string = "%a, %d %b %Y %H:%M:%S %Z"
|
|
|
|
dt = datetime.strptime(self._content["published"], time_string)\
|
|
|
|
.astimezone(pytz.timezone("Europe/Brussels"))
|
|
|
|
|
|
|
|
# Apply timezone offset
|
|
|
|
dt = dt + timedelta(hours=dt.utcoffset().seconds//3600)
|
|
|
|
|
|
|
|
return "{} {}/{}/{} om {}:{}:{}".format(
|
|
|
|
intToWeekday(dt.weekday()),
|
2021-03-03 18:37:09 +01:00
|
|
|
lz(dt.day), lz(dt.month), lz(dt.year),
|
|
|
|
lz(dt.hour), lz(dt.minute), lz(dt.second)
|
2021-03-03 18:04:31 +01:00
|
|
|
)
|