mirror of
https://git.mia.jetzt/scrubber
synced 2024-11-21 13:07:25 -07:00
62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
|
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,
|
||
|
}
|