from dataclasses import dataclass from typing import List, Callable from datetime import datetime from enum import Enum class Visibility(Enum): public = 1 unlisted = 2 followers = 3 direct = 4 @classmethod def from_db(cls, raw: str) -> "Visibility": match raw: case "public": return cls.public case "home": return cls.unlisted case "followers": return cls.followers case "specified": return cls.direct case _: raise ValueError(f"unknown visibility `{raw}`") @dataclass class FilterableNote: id: str mine: bool replies: List["FilterableNote"] quotes: List["FilterableNote"] when: datetime reactions: int renotes: int visibility: Visibility def thread(self) -> List["FilterableNote"]: acc = [] for reply in self.replies: acc += reply.thread() for quote in self.quotes: acc += quote.thread() acc.append(self) return acc def thread_self(self) -> List["FilterableNote"]: acc = [] for reply in self.replies: acc += reply.thread_self() for quote in self.quotes: acc += quote.thread_self() if self.mine: acc.append(self) return acc def to_dict(self): return { "id": self.id, "mine": self.mine, "replies": [note.to_dict() for note in self.replies], "quotes": [note.to_dict() for note in self.quotes], "when": self.when.isoformat(), "reactions": self.reactions, "renotes": self.renotes, }