social media crossposting tool. 3rd time's the charm
mastodon
misskey
crossposting
bluesky
1from dataclasses import dataclass
2from pathlib import Path
3from typing import Any
4from cross.service import OutputService
5
6ALLOWED_POSTING_VISIBILITY: list[str] = ["public", "unlisted", "private"]
7
8@dataclass(kw_only=True)
9class MastodonOutputOptions:
10 token: str
11 instance: str
12 visibility: str = "public"
13
14 @classmethod
15 def from_dict(cls, data: dict[str, Any]) -> 'MastodonOutputOptions':
16 data['instance'] = data['instance'][:-1] if data['instance'].endswith("/") else data['instance']
17
18 if 'visibility' in data:
19 if data['visibility'] not in ALLOWED_POSTING_VISIBILITY:
20 raise ValueError(f"Invalid visibility option {data['visibility']}!")
21
22 return MastodonOutputOptions(**data)
23
24# TODO
25class MastodonOutputService(OutputService):
26 def __init__(self, db: Path, options: MastodonOutputOptions) -> None:
27 super().__init__(options.instance, db)