diff --git a/apps/home/models.py b/apps/home/models.py index c0fa950..d7a07fd 100644 --- a/apps/home/models.py +++ b/apps/home/models.py @@ -413,4 +413,113 @@ class UniqueContentRule(models.Model): def __str__(self) -> str: return self.name - \ No newline at end of file + + + + +#region Rewrite - - - - - - - - + + +class _Server(models.Model): + id = models.PositiveIntegerField(primary_key=True) + name = models.CharField(max_length=128) + icon_hash = models.CharField(max_length=128) + active = models.BooleanField(default=True) + + @property + def icon_url(self): + return f"https://cdn.discordapp.com/icons/{self.id}/{self.icon_hash}.webp?size=80" + + +class _Subscription(models.Model): + id = models.AutoField(primary_key=True) + server = models.ForeignKey(to=_Server, on_delete=models.CASCADE) + + name = models.CharField(max_length=32, blank=False) + url = models.URLField() + created_at = models.DateTimeField(default=timezone.now, editable=False) + updated_at = models.DateTimeField(default=timezone.now) + extra_notes = models.CharField(max_length=250, default="", blank=True) + active = models.BooleanField(default=True) + + filters = models.ManyToManyField(to=_ContentFilter, blank=True) + message_style = models.ForeignKey(to=_MessageStyle, blank=False) + + +class _ContentFilter(models.Model): + id = models.AutoField(primary_key=True) + server = models.ForeignKey(to=_Server) + + MATCH_NONE = 0 + MATCH_ANY = 1 + MATCH_ALL = 2 + MATCH_LITERAL = 3 + MATCH_REGEX = 4 + MATCH_FUZZY = 5 + MATCH_AUTO = 6 + + MATCHING_ALGORITHMS = ( + (MATCH_NONE, _("None")), + (MATCH_ANY, _("Any: Item contains any of these words (space separated)")), + (MATCH_ALL, _("All: Item contains all of these words (space separated)")), + (MATCH_LITERAL, _("Exact: Item contains this string")), + (MATCH_REGEX, _("Regular expression: Item matches this regex")), + (MATCH_FUZZY, _("Fuzzy: Item contains a word similar to this word")), + ) + + name = models.CharField(max_length=32) + match = models.CharField(max_length=256, blank=False) + matching_algorithm = models.PositiveIntegerField(choices=MATCHING_ALGORITHMS) + is_insensitive = models.BooleanField() + is_whitelist = models.BooleanField() + + +class _Content(models.Model): + id = models.AutoField(primary_key=True) + subscription = models.ForeignKey(to=_Subscription, on_delete=models.CASCADE) + + # 'item_' prefix is to differentiate between the internal identifiers and the stored data + item_id = models.CharField(max_length=1024) + item_guid = models.CharField(max_length=1024) + item_url = models.CharField(max_length=1024) + item_title = models.CharField(max_length=1024) + item_content_hash = models.CharField(max_length=1024) + + +class _MessageStyle(models.Model): + id = models.AutoField(primary_key=True) + server = models.ForeignKey(to=_Server, on_delete=models.CASCADE) + + is_embed = models.BooleanField(default=True) + is_hyperlinked = models.BooleanField() # title only + show_author = models.BooleanField() + show_timestamp = models.BooleanField() + show_images = models.BooleanField() + fetch_images = models.BooleanField() # if not included with RSS item + + title_mutator = models.ForeignKey(to=_MessageMutator, on_delete=models.SET_NULL) + description_mutator = models.ForeignKey(to=_MessageMutator, on_delete=models.SET_NULL) + + +# Instances of this model are predefined only +class _MessageMutator(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=64) + value = models.CharField(max_length=32) + + +# Instances of this model are predefined only +class _UniqueContentRule(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=64) + value = models.CharField(max_length=32) + + +# Relevant logs from the bot logic +class BotLogicLogs(models.Model): + id = models.AutoField(primary_key=True) + server = models.ForeignKey(to=_Server, on_delete=models.CASCADE) + + level = models.CharField() + message = models.CharField() # todo + created_at = models.DateTimeField(default=timezone.now, editable=False)